Generowanie danych w NLP



Koń jaki jest, każdy widzi. Wysoki, cztery nogi, kopyta, długi pysk, grzywa, ogon. Prosta sprawa. A przynajmniej dla nas, ludzi, ponieważ gdybyśmy chcieli stworzyć model, który będzie identyfikował i lokalizował konie na zdjęciach, to jeden przykład by nie wystarczył. Ba, nawet nie kilka. Porządny model powinien nauczyć się rozpoznawać konie na setkach zdjęć: konie różnego rodzaju, konie w różnych pozach, konie młode, konie stare, konie kare, konie gniade…


Wniosek? Potrzebujemy bardzo dużo zdjęć koni. W przeciwnym wypadku model nie nauczy się odpowiednio generalizować i identyfikować koni, które na zdjęciu będą pozowały innym profilem czy miały inną pozę. Szczęśliwie dla nas, jest pewna droga na skróty – w czasie trenowania modelu możemy zastosować pewną sztuczkę, która pozwoli nam na sztuczne tworzenie dodatkowych danych. A mowa o edycji istniejących danych w locie.



Od lewego górnego, zgodnie ze wskazówkami zegara: jeż ze zmienionymi kolorami; jeż, kiedy zapomnimy założyć okularów; jeż obrócony oraz jeż wydłużony.



Odejdźmy na chwilę od koni i zajmijmy się jeżami. Owa sztuczka, polegająca na zmianie danych, została przedstawiona powyżej. Polega na takiej edycji obrazów, aby można było jednoznacznie stwierdzić, że na zdjęciu dalej znajduje się ten sam obiekt, a jednocześnie obraz na tyle różnił się od oryginału, aby potencjalny model wykorzystujący te obrazy, faktycznie mógł wynieść coś z nauki na ich podstawie. Nikt chyba nie ma zamiaru dyskutować, że pomimo obrócenia zdjęcia czy lekkiego rozciągnięcia dalej można zidentyfikować jeża? A teraz, kiedy jednego zdjęcia stworzyliśmy kolejne cztery, mamy dużo większy zbiór danych, na których możemy uczyć model. Nie musimy poświęcać już dodatkowych dni na bieganie po lesie z aparatem, żeby sfotografować więcej jeży.



Ale co z tym przetwarzaniem języka naturalnego?


Powyższymi akapitami Ameryki nie odkryłem. Wszyscy miłośnicy oraz młodzi adepci data science zdają sobie z powyższych sprawę – jest to jedna z podstawowych kwestii, której w pewnym stopniu, można nauczyć się na pierwszym z brzegu kursie computer vision z Udemy. To co przyświecało stworzeniu tego artykułu to fakt, że nie wszyscy zdają sobie sprawę, że podobne rozszerzanie zbioru treningowego ma zastosowanie również w przetwarzaniu języka naturalnego (NLP).


Podobnie jak w przypadku klasyfikacji obrazów, istnieje klasyfikacja tekstu. Analogicznie do tego pierwszego, polega na przypisaniu danej obserwacji (w tym wypadku fragmentowi tekstu) odpowiedniej kategorii. W praktyce służyć to może m.in. do automatycznej detekcji spamu w skrzynce pocztowej, wykrywania mowy nienawiści w Internecie czy analizy sentymentu recenzji produktów. Niech ten ostatni kazus służy nam za przykład wykorzystywany w tym artykule. Uznajmy, że naszym celem jest zbudowanie modelu, który na podstawie fragmentu opinii uzna, czy ma ona wydźwięk pozytywny czy negatywny.


Podobnie jak ze zdjęciami, budowa takiego klasyfikatora wymaga setek, a nawet tysięcy, przykładów. Sztuczne powiększenie zbioru treningowego nie jest jednak tak proste jak w przypadku opisywanych wcześniej obrazów. W przypadku NLP nie ma żadnej „reguły kciuka”, która wskazywałaby proste zasady zamiany danych wejściowych, jak np. obrót obrazu o 90 stopni czy odwrócenie kolorów. Tutaj potrzebujemy czegoś, co inteligentnie będzie potrafiło modyfikować istniejący tekst przy jednoczesnym zachowaniu jego sensu.


Tym czymś są specjalne, wstępnie wyszkolone, modele, których zadaniem jest zrozumienie struktury tekstu, co pozwala im na dodawanie, zmianę czy uzupełnianie poszczególnych słów (sztandarowym przykładem takiego modelu jest BERT). Najpowszechniej stosuje się do tego zadania tzw. transformatory, omówienie których nastąpi być może w oddzielnym artykule. Minus tego wszystkiego jest taki, że kiedy obrazy na całym świecie są takie same i można stosować do nich takie same techniki, to w przypadku NLP potrzebujemy wyszkolić model do konkretnego języka, aby synonimów z języka polskiego nie zastępować słowami z suahili. A zgodnie z najnowszymi danymi na świecie używa się ponad 7 tysięcy języków.


Ale powiedzmy, że mamy dostęp do gotowego modelu, który pozwoli nam na rozszerzenie zbioru, służącego do przygotowania naszego własnego modelu-klasyfikatora (zbiór takich modeli dla języka polskiego można znaleźć tutaj). Na jakie właściwie modyfikacje tekstu mogą one pozwolić? Przyjrzyjmy się prostym możliwościom na przykładzie opinii dot. Zakładu Karnego w Sztumie, która znajduje się na Mapach Google (link do opinii):


Bardzo fajne miejsce. Można spotkać masę interesujących ludzi, nawiązać przydatne kontakty, ciekawie podyskutować o polityce, biznesie itd.




Zakład Karny w Sztumie z lotu ptaka



Klasycznym przykładem prostego budowania nowych przykładów może być zastępowanie poszczególnych słów ich synonimami. Za pomocą dodatkowego modelu możemy zmienić wyżej wskazaną recenzję na poniższą:


Cudowne miejsce. Można spotkać dużo interesujących osób, nawiązać przydatne kontakty, ciekawie porozmawiać o polityce, interesach itd.



Warto zauważyć, że zmiana jedynie pięciu słów pozwoliła na stworzenie całkowicie nowego przykładu pozytywnej opinii. Sama zamiana słów na ich synonimy nie jest trudna, a potrafi znacznie poprawić jakość budowanego klasyfikatora. Nowe przykłady można zbudować również dzięki wykorzystaniu tłumaczy automatycznych. Analizowany przez nas przykład po przetłumaczeniu najpierw z polskiego na islandzki, następnie z islandzkiego na gruziński oraz z gruzińskiego z powrotem na polski (dzięki kurtuazji Google Translate) brzmi wystarczająco inaczej, by mógł wnieść wartość dodaną dla budowanego klasyfikatora:


„Bardzo miłe miejsce. Możesz poznać wielu ciekawych ludzi, prowadzić użyteczną komunikację, prowadzić ciekawą dyskusję o polityce, biznesie i tym podobne



Powyższe przykłady to jedynie wierzchołek góry lodowej, a omówienie ich wszystkich to temat na odrębną książkę. Zbiór powyższych technik oraz wielu innych jest powszechnie wykorzystywany dzięki jednej z popularnych bibliotek dla języka Python – nlpaug.



Kontekst ma znaczenie


Tak jak przy computer vision nie zawsze można np. zmieniać kolory obrazów, kiedy może zaburzyć to sens samej klasyfikacji, tak i przy języku naturalnym należy być uważnym i mieć na uwadze, że czasami nawet zdawałoby się nieistotna zmiana tekstu może znacząco zmienić sens wypowiedzi. Nawet wykorzystanie najinteligentniejszych transformatorów nie daje gwarancji nieomylności.


Szczególnie istotne może mieć to znaczenie w przypadku języka prawniczego. Uznajmy, że budujemy klasyfikator, który na podstawie poszczególnych zapisów umów gospodarczych będzie sprawdzał, czy dany zapis może zostać uznany za klauzulę abuzywną (tj. niezgodną z prawem). W trakcie budowy takiego klasyfikatora możemy zastosować użycie synonimów w celu zwiększenia zbioru treningowego. Jednak to co jest synonimem w powszechnym rozumieniu danego słowa nie zawsze oznacza to samo, kiedy pod uwagę bierzemy prawniczy kontekst danego określenia. Przykładem takiego „synonimu” może być „zwłoka” oraz „opóźnienie”. W potocznym rozumieniu znaczą to samo, ale z perspektywy Kodeksu Cywilnego są to kompletnie odmienne określenia, których nieumyślna zamiana może całkowicie zmienić kontekst danego zapisu umownego. Klasyfikator budowany w kontekście analizy aktów prawnych i umów nie byłby zbyt dobry.


Zdaję sobie sprawę, że to co opisałem w tym artykule to dla niektórych wiedza powszechna. A jednak przetwarzanie języka naturalnego to swego rodzaju nisza – nie każda osoba pracująca w analityce danych zajmuje się sztuczną inteligencją, a co dopiero NLP. Zachęcam do dodatkowego zgłębienia tematu we własnym zakresie! A kto wie, może w przyszłości zamiast iść za tłumem, by identyfikować konie i jeże, odnajdziesz nową pasję w języku naturalnym.





Piotr Więckiewicz

Data Scientist

piotr.wieckiewicz@bitpeak.pl

78 wyświetleń

Ostatnie posty

Zobacz wszystkie