A będzie coś o transformerach? Będzie, będzie tylko jeśli mamy zacząć praktycznie od początku obszar przetwarzania języka naturalnego to zapoznajmy się z jego podstawami 😉 (stąd te podwójne podstawy podstaw w tytule).
Przetwarzanie języka naturalnego to rozległa interdyscyplinarna dziedzina, która łączy w sobie m.in. sztuczną inteligencję i lingwistykę, aby usprawnić komunikację człowiek-komputer (np. rozumienie komend głosowych przez odkurzacze, lodówki i samochody) lub zautomatyzować wszelkie generowanie tekstów. Od tworzenia automatycznych napisów w filmach po pisanie notatek sportowych czy umów prawnych.
Oczywiście, zanim zaczniesz pisać program, który chcesz uruchomić na Raspberry PI z mikrofonem podłączonym do żelazka. To przyjrzyjmy się najprostszym technikom przydatnym do budowania różnorodnych klasyfikatorów uczenia maszynowego wyszkolonych na zestawach danych tekstowych. Zacznijmy więc od podziału tekstu na zdania, słowa (czyli tokeny) i przyjrzyjmy się temu tzw. token’owi nieco bliżej.
Zanim jednak to zrobimy, odpowiedzmy sobie na pytanie, po co nam to i jak to się ma do AI? Otóż podstawowe techniki przetwarzania języka naturalnego t.j. tokenizacja, lematyzacja, stemming czy analiza samych zdań i słów są najczęściej wykorzystywane do wstępnego przetwarzania danych (ang. data pre-processing) i wejście w świat inżynierii cech (ang. feature engineering). Czyli na wejściu mamy surowy tekst, np. email lub wyekstrahowany tekst z pliku PDF, a my go oczyszczamy, dzielimy na zdania, słowa (lub bardziej tokeny), usuwamy nieistotne informacyjnie tokeny, wyciągamy metadane, a na wyjściu przygotowujemy wektor reprezentujący nasz tekst. No i taki wektor (a bardziej cały pokaźny ich zestaw) idealnie nadaje się do zbudowania np. klasyfikatora opartego na uczeniu maszynowym.
NLP praktycznie
Wyobraźmy sobie, że mamy jakiś dłuższy tekst i chcielibyśmy się mu bliżej przyjrzeć, tzn. z jakich słów się składa i jaki jest ich typ, np. część mowy.
Dla e-commerce najważniejszy jest Produkt, opisany pod adresem http://schema.org/Product. Adres URL typu oznacza ten typ, pod tym samym adresem znajduje się także jego dokładny opis. Wystarczy sprawdzić nasz kod przy pomocy jednego z wielu narzędzi znajdujących się w sieci, np.: https://search.google.com/test/rich-results.
Fragment książki: https://helion.pl/view/20559c/python-i-ai-dla-e-commerce-sebastian-kondracki,pytiai
Oczywiście każdy znawca Pythona (lub innego języka programowania) powie, że nic trudnego dwie linijki kodu z funkcją split() na pokładzie, np. split(„.”) i mamy wszystko podzielone na zdania. No niestety nie zawsze zdanie kończy się kropką (czasem znakiem zapytania lub wykrzyknikiem), a dodatkowo mamy skróty z kropkami lub adresy url. Co całkowicie „rozwali” koncepcje podziału za pomocą wbudowanych funkcji w Pythona. Dlatego warto sięgnąć po specjalistyczne biblioteki wspierające przetwarzanie języka naturalnego. Na rynku jest ich kilka:
- CoreNLP (https://stanfordnlp.github.io/CoreNLP/)
- Gensim (https://radimrehurek.com/gensim/)
- Natural Language Toolkit (NLTK) (https://www.nltk.org/)
- Pattern (https://github.com/clips/pattern)
- Polyglot (https://github.com/aboSamoor/polyglot)
- PyNLPl (https://github.com/proycon/pynlpl)
- spaCy (https://spacy.io/)
- TextBlob (https://textblob.readthedocs.io/en/dev/)
Ja proponuję do nauki i pierwszych eksperymentów z analizą języka naturalnego dwie tj.: spaCy (moja ulubiona 💕) oraz NLTK. Działanie takich bibliotek zależy od producenta i zastosowanych technik (najczęściej AI), ale w większości przypadków są to modele uczenia maszynowego, statystyczne (lub innych technik obliczeniowych) trenowane lub tworzone na ogromnych zasobach tekstowych danego języka, tzw. korpusach językowych.
Instalacja spaCy
Zatem wróćmy do naszego podziału tekstu na zdanie i tokeny. Instalujemy zatem spaCy i model języka języka polskiego (https://spacy.io/models/pl) lub innych języków (https://spacy.io/models):
pip install spacy python -m spacy download pl_core_news_md
Tokenizacja i lematyzacja w spaCy
No i teraz kod źródłowy:
txt = """Dla e-commerce najważniejszy jest Produkt, opisany pod adresem http://schema.org/Product. Adres URL typu oznacza ten typ, pod tym samym adresem znajduje się także jego dokładny opis. Wystarczy sprawdzić nasz kod przy pomocy jednego z wielu narzędzi znajdujących się w sieci, np.: https://search.google.com/test/rich-results.""" nlp = spacy.load('pl_core_news_md') doc = nlp(txt) for i, sentence in enumerate(doc.sents): for token in sentence: print(i, token.lemma_, token.pos_, token.text)
Po pierwsze kod źródłowy jest umieszczony na:
https://www.kaggle.com/code/sensxyz/podstawy-nlp-cz-1 gdzie bez problemu możecie go komentować, uruchamiać, kopiować i modyfikować. Natomiast wracając do samego kodu to importujecie bibliotekę spaCy i ładujecie do pamięci polski model (pl_core_news_md). Następnie przekazujemy nasz tekst do nlp() i otrzymujemy zbiór zdań, tokenów i innych składników potoku NLP przetworzonych przez spaCy. Czas wyjaśnić czym jest token. Otóż token to jeden ze składników tekstu najczęściej słowo, ale także znak interpunkcyjny, spacja, liczba, url czy e-mail. W spaCy możemy przeglądać podział tekstu na tokeny na dwa sposoby, czyli bezpośrednio bez podziału na zdania (sposób 1):
doc = nlp(txt) for token in doc: print(token.lemma_, token.pos_, token.text)
oraz podziałem na zdania i później na tokeny (sposób 2):
for sentence in doc.sents: for token in sentence: print(token.lemma_, token.pos_, token.text)
Z drugiej strony, jeśli chcemy mieć dodatkowo numer zdania, zawsze możemy przeprowadzić iterację przez funkcję enumerate:
for i, sentence in enumerate(doc.sents): for token in sentence: print(i, token.lemma_, token.pos_, token.text)
Ponadto spaCy nam daje wiele dodatkowych atrybutów tokenów, dzięki czemu analiza NLP jest prosta, łatwa i przyjemna. Po pierwsze, pos_ czyli część mowy (czasownik, rzeczownik, przymiotnik itp.), lemma_ czyli redukcja tokena do jego formy bazowej (lematyzacja), np. „jem” – „jeść”, „np.” – „na przykład”. I najważniejsze tj. is_stop czyli czy token należy do tzw. listy stopu czyli słów niosących mały ładunek informacyjny. Więcej o atrybutach tokenów można przeczytać na stronie https://spacy.io/api/token#attributes.
Dzisiaj kończymy ze spaCy i NLP, ale pewnie jeszcze wiele artykułów na ten temat pojawi się na blogu. No i namawiam do zakupu książki „Python i AI dla e-commerce” gdzie mocny rozdział jest o NLP, spaCy i zastosowaniu ich do uczenia maszynowego.
Link do kodów:
https://www.kaggle.com/code/sensxyz/podstawy-nlp-cz-1
Obserwuj mnie