Jak najłatwiej przetwarzać teksty?
Przyjęło się uważać, że przetwarzanie dokumentów tekstowych wymaga znajomości języka programowania wysokiego poziomu. Kilkanaście lat temu “wypadało” dobrze znać język Perl, natomiast dziś specjalista w tej dziedzinie “absolutnie musi” mieć opanowany język Python. Czy naprawdę jest to niezbędne?
W niniejszym wpisie pokażę, że nawet całkiem zaawansowane zadania związane z przetwarzaniem tekstu można łatwo i szybko wykonać bez znajomości ani jednego polecenia jakiegokolwiek języka programowania.
Ile wyrazów ma mój tekst?
Zacznijmy od zadania najprostszego: sprawdźmy, ile wyrazów ma pewien dokument tekstowy. Można to zrobić za pomocą następującego ciągu poleceń:
- pobierz dane z dokumentu (pliku) tekstowego;
- zlicz wyrazy w pobranych danych.
Jeśli wynik swojego zadania chcemy zapamiętać (zapisać w jakimś pliku), ciąg poleceń może mieć poniższą postać:
- pobierz dane z pliku tekstowego;
- zlicz słowa w pobranych danych;
- zapisz wynik do pliku.
Platforma Bash Box
Polecenia takiego typu są dostępne w systemie operacyjnym Linux. Aby uzyskać pożądany wynik, należy wpisać odpowiednie nazwy poleceń, których trzeba się uprzednio nauczyć. Polecam jednak coś znacznie bardziej atrakcyjnego: program graficzny, w którym zamiast wpisywania “trudnych do wyuczenia się na pamięć” poleceń można po prostu przesuwać puzzle.
Wejdźmy na stronę: https://s416072.students.wmi.amu.edu.pl/, gdzie naszym oczom ukaże się taki oto ekran:

Spośród ponad 20 dostępnych puzzli przeciągamy na pasek znajdujący się pod nimi tylko te, które chcemy wykorzystać – na przykład w celu zliczenia wyrazów w danym dokumencie:

Zauważmy, że pierwszy puzzel (Pobierz dane z pliku) ma wypustkę tylko z prawej strony, co oznacza, że oczekuje on na dołączenie innego elementu tylko z tejże strony. Kształt drugiego puzzla sugeruje z kolei gotowość na dołączenie puzzli z obu stron, podczas gdy trzeci element (Zapisz do pliku) wyłącznie domyka całą układankę.
W jakim dokumencie chcemy policzyć wyrazy? Bash Box daje nam tutaj do wyboru cztery możliwości:

Jeśli wybierzemy plik zawierający informacje o młodych przestępcach, wyświetli nam się na ekranie zawartość odpowiedniego dokumentu:

Pierwszy z widocznych powyżej wierszy informuje o tym, że w roku 2010 odnotowano w Polsce 741 przestępczyń płci żeńskiej w wieku 17 lat. Kolejne wersy zawierają analogiczne informacje – dla odpowiedniego wieku oraz odpowiedniej płci.
Aby zliczyć liczbę wyrazów w tym dokumencie, dokonujemy “tłumaczenia” ciągu poleceń zapisanego wcześniej za pomocą puzzli na odpowiednie polecenie systemu Linux. Odbywa się to z użyciem poniższego przycisku:

W systemie Linux dostępne jest specjalne środowisko (zwane potocznie “czarnym okienkiem”), które służy do wydawania poleceń – jest to powłoka Bash. Przetłumaczony przez nas ciąg poleceń ma w powłoce Bash następującą postać:

Zapis wygląda na odrobinę skomplikowany, spróbujmy go jednak przeanalizować.
- :~$ to tzw. symbol gotowości, który pojawia się samoistnie w powłoce Bash w oczekiwaniu na polecenie wydane przez użytkownika;
- cat filename.txt to polecenie pobrania danych do dalszego przetwarzania z pliku o nazwie filename.txt;
- | (znak “pipe”) to separator poleceń, który informuje, że wynik polecenia z lewej strony ma być przetworzony przez polecenie z prawej strony;
- wc -w to polecenie zliczenia wyrazów;
- > finalfile.txt to polecenie zapisu danych w pliku o nazwie finalfile.txt.
W oknie obok możemy zobaczyć wynik działania całego potoku, czyli ciągu poleceń:

Okazuje się więc, że dokument o młodych przestępcach zawiera 819 wyrazów.
Zagadki
W systemie Bash Box można pobawić się też w przetwarzanie tekstu, rozwiązując zagadki w stylu historii westernowych. Uruchamia je poniższy przycisk, umiejscowiony w lewym górnym rogu ekranu:

Rozwiążmy zatem pierwszą z zagadek:

Format dokumentu ze wspomnianej bazy osób wyświetlony jest obok zagadki:

Aby uzyskać wymaganą odpowiedź, należy wykonać następujące kroki:
- pobierz dane z pliku;
- uszereguj dane w kolejności od najmniejszej wartości – według zawartości pierwszej kolumny;
- wyświetl pierwsze dwadzieścia informacji (pierwsze dwadzieścia wierszy bazy danych);
- zapisz wynik do pliku.
Przeciągamy zatem na ekranie odpowiednie puzzle:

Następnie sprawdzamy poprawność uzyskanej odpowiedzi:

Przycisk Sprawdź zabarwia się na pomarańczowo, co oznacza, że to nie była prawidłowa odpowiedź!
Przeciągamy więc trzeci puzzel na jego pierwotne miejsce, zastępując go innym:

Teraz przycisk Sprawdź zabarwia się już na zielono, co oznacza, że możemy spokojnie przejść do kolejnej z ośmiu zagadek.
Przykład zastosowania poleceń powłoki Bash
Jeśliby zapytać studenta informatyki, w jaki sposób uzyskać listę częstości występowania poszczególnych wyrazów, użytych na przykład we wszystkich dziełach Szekspira razem wziętych, najczęściej usłyszymy odpowiedź, iż najprościej będzie napisać odpowiedni kod w języku programowania Python. Można to jednak uczynić znacznie łatwiej – przy użyciu pojedynczego polecenia w powłoce Bash:
cat sh.txt | tr -sc ’A-Za-z’ ’\n’ | sort | uniq -c > sh_frequency_list
Załóżmy, że plik tekstowy sh.txt zawiera wszystkie dzieła Szekspira. Wtedy:
- cat sh.txt pobiera dane z tego pliku do dalszego przetwarzania;
- tr -sc ‘A-Za-z’ ‘\n’ zastępuje wszystkie znaki niebędące literami (np. spacje) znakiem nowego wiersza (dzięki czemu każdy wyraz będzie teraz umieszczony w oddzielnym wierszu);
- sort układa wszystkie wiersze (a w każdym z nich umieszczony jest teraz tylko jeden wyraz) w kolejności alfabetycznej (w efekcie czego wielokrotne pojawienia się tych samych wyrazów umieszczone zostaną w sąsiadujących wierszach);
- uniq -c redukuje powtarzające się wiersze (czyli te o tej samej zawartości), podając odnotowane liczby powtórzeń;
- uzyskana w ten sposób lista frekwencyjna zapisana zostaje w pliku sh_frequency_list.
Podsumowanie
Przetwarzanie dokumentów tekstowych w systemie Linux jest bardzo efektywne. Za pomocą jednego polecenia można tutaj uzyskać takie same efekty jak w wyniku działania złożonych programów. Trudnością, którą trzeba pokonać, jest wyłącznie zapoznanie się z odpowiednimi poleceniami oraz nabycie umiejętności układania ich w potok.
Na pewno jednak warto, a platforma Bash Box może w tym wydatnie pomóc!