- Wprowadzenie
- Podejścia osadzania słów
- Bag of Words
- Pros and Cons of Bag of Words
- TF-IDF Scheme
- Pros and Cons of TF-IDF
- Word2Vec
- Pros i Cons of Word2Vec
- Word2Vec w Pythonie z biblioteką Gensim
- Tworzenie korpusu
- Preprocessing
- Tworzenie modelu Word2Vec
- Analiza modelu
- Znajdowanie wektorów dla słowa
- Znajdowanie podobnych słów
- Wnioski
Wprowadzenie
Ludzie mają naturalną zdolność do rozumienia tego, co mówią inni ludzie i co powiedzieć w odpowiedzi. Ta zdolność jest rozwijana przez konsekwentne interakcje z innymi ludźmi i społeczeństwem przez wiele lat. Język odgrywa bardzo ważną rolę w tym, jak ludzie wchodzą w interakcje. Języki, które ludzie używają do interakcji nazywane są językami naturalnymi.
Reguły różnych języków naturalnych są różne. Jednak jest jedna rzecz wspólna w językach naturalnych: elastyczność i ewolucja.
Języki naturalne są bardzo elastyczne. Załóżmy, że prowadzisz samochód i twój przyjaciel mówi jedną z tych trzech wypowiedzi: „Pull over”, „Stop the car”, „Halt”. Natychmiast zrozumiesz, że prosi Cię o zatrzymanie samochodu. Dzieje się tak, ponieważ języki naturalne są niezwykle elastyczne. Istnieje wiele sposobów na powiedzenie jednej rzeczy.
Innym ważnym aspektem języków naturalnych jest fakt, że są one konsekwentnie ewoluujące. Na przykład, kilka lat temu nie było terminu takiego jak „Google it”, który odnosi się do szukania czegoś w wyszukiwarce Google. Języki naturalne są zawsze w trakcie ewolucji.
Przeciwnie, języki komputerowe podążają za ścisłą składnią. Jeśli chcesz powiedzieć komputerowi, aby wydrukował coś na ekranie, jest do tego specjalna komenda. Zadaniem Przetwarzania Języka Naturalnego jest sprawienie, by komputery rozumiały i generowały ludzki język w sposób podobny do ludzi.
Jest to ogromne zadanie i wiąże się z nim wiele przeszkód. Ten wykład wideo z University of Michigan zawiera bardzo dobre wyjaśnienie, dlaczego NLP jest tak trudne.
W tym artykule zaimplementujemy technikę Word2Vec word embedding używaną do tworzenia wektorów słów za pomocą biblioteki Gensim w Pythonie. Jednak zanim przejdziemy od razu do kodowania, najpierw krótko przejrzymy niektóre z najczęściej używanych technik osadzania słów, wraz z ich zaletami i wadami.
Podejścia osadzania słów
Jednym z powodów, dla których przetwarzanie języka naturalnego jest trudnym problemem do rozwiązania, jest fakt, że w przeciwieństwie do istot ludzkich, komputery mogą rozumieć tylko liczby. Musimy reprezentować słowa w formacie numerycznym, który jest zrozumiały dla komputerów. Osadzanie słów odnosi się do numerycznych reprezentacji słów.
Obecnie istnieje kilka podejść do osadzania słów i wszystkie z nich mają swoje wady i zalety. Omówimy tutaj trzy z nich:
- Bag of Words
- TF-IDF Scheme
- Word2Vec
Bag of Words
Podejście bag of words jest jednym z najprostszych podejść do osadzania słów. Poniżej przedstawione są kroki generowania złożeń słów za pomocą metody worka słów.
Zobaczymy złożeń słów wygenerowanych za pomocą metody worka słów na przykładzie. Załóżmy, że mamy korpus składający się z trzech zdań.
- S1 = I love rain
- S2 = rain rain go away
- S3 = I am away
Aby przekonwertować powyższe zdania na odpowiadające im reprezentacje osadzania słów przy użyciu metody bag of words, musimy wykonać następujące kroki:
Zauważ, że dla S2 dodaliśmy 2 w miejsce „rain” w słowniku; to dlatego, że S2 zawiera „rain” dwa razy.
Pros and Cons of Bag of Words
Bag of words approach has both plus and cons. Główną zaletą metody worka słów jest to, że nie potrzebujesz bardzo dużego korpusu słów, aby uzyskać dobre wyniki. Możesz zobaczyć, że budujemy bardzo podstawowy model worka słów z trzema zdaniami. Obliczeniowo, model worka słów nie jest bardzo złożony.
Poważną wadą podejścia worka słów jest fakt, że musimy tworzyć ogromne wektory z pustymi miejscami w celu reprezentowania liczby (sparse matrix), co zużywa pamięć i miejsce. W poprzednim przykładzie, mieliśmy tylko 3 zdania. Jednak w każdym wektorze widać trzy zera.
Wyobraźmy sobie korpus z tysiącami artykułów. W takim przypadku, liczba unikalnych słów w słowniku może wynosić tysiące. Jeśli jeden dokument zawiera 10% unikalnych słów, odpowiadający mu wektor osadzania nadal będzie zawierał 90% zer.
Innym poważnym problemem związanym z podejściem worka słów jest fakt, że nie zachowuje on żadnych informacji o kontekście. Nie dba o kolejność, w jakiej słowa pojawiają się w zdaniu. Na przykład, traktuje zdania „Butelka jest w samochodzie” i „Samochód jest w butelce” jednakowo, które są całkowicie różne sentences.
Rodzaj podejścia worka słów, znany jako n-gramów, może pomóc utrzymać związek między słowami. N-gram odnosi się do ciągłej sekwencji n słów. Na przykład, 2-gramy dla zdania „Nie jesteś szczęśliwy”, są „Jesteś”, „nie są” i „nie jest szczęśliwy”. Chociaż podejście n-gramów jest w stanie uchwycić relacje między słowami, rozmiar zestawu cech rośnie wykładniczo ze zbyt dużą liczbą n-gramów.
TF-IDF Scheme
Schemat TF-IDF jest rodzajem podejścia bag words, gdzie zamiast dodawania zer i jedynek w wektorze osadzania, dodajemy liczby zmiennopozycyjne, które zawierają więcej użytecznych informacji w porównaniu do zer i jedynek. Ideą schematu TF-IDF jest fakt, że słowa mające wysoką częstotliwość występowania w jednym dokumencie, a mniejszą częstotliwość występowania we wszystkich innych dokumentach, są bardziej kluczowe dla klasyfikacji.
TF-IDF jest iloczynem dwóch wartości: Term Frequency (TF) i Inverse Document Frequency (IDF).
Term frequency odnosi się do liczby wystąpień danego słowa w dokumencie i może być obliczona jako:
Term frequence = (Number of Occurences of a word)/(Total words in the document)
Na przykład, jeśli spojrzymy na zdanie S1 z poprzedniej sekcji tj. „I love rain”, każde słowo w zdaniu występuje raz i dlatego ma częstotliwość 1. Przeciwnie, dla S2 tj. „deszcz deszcz odejść”, częstotliwość „deszcz” jest dwa, podczas gdy dla reszty słów, to jest 1.
IDF odnosi się do logu całkowitej liczby dokumentów podzielonych przez liczbę dokumentów, w których słowo istnieje, i może być obliczona jako:
IDF(word) = Log((Total number of documents)/(Number of documents containing the word))
Na przykład, wartość IDF dla słowa „deszcz” jest 0,1760, ponieważ całkowita liczba dokumentów jest 3 i deszcz pojawia się w 2 z nich, więc log(3/2)
jest 0,1760. Z drugiej strony, jeśli spojrzymy na słowo „miłość” w pierwszym zdaniu, pojawia się ono w jednym z trzech dokumentów i dlatego jego wartość IDF wynosi log(3)
, czyli 0,4771.
Pros and Cons of TF-IDF
Though TF-IDF is an improvement over the simple bag of words approach and yields better results for common NLP tasks, the overall pros and cons remain the same. Nadal musimy utworzyć ogromną macierz, która wymaga znacznie więcej obliczeń niż prosty worek słów.
Word2Vec
Podejście do osadzania <a target=”_blank rel=”nofollow”” href=”https://en.wikipedia.org/wiki/Word2vec”>Word2Vec, opracowane przez Tomasa Mikolova, jest uważane za najnowocześniejsze. Podejście Word2Vec wykorzystuje głębokie uczenie i techniki oparte na sieciach neuronowych do konwersji słów na odpowiadające im wektory w taki sposób, że semantycznie podobne wektory są blisko siebie w N-wymiarowej przestrzeni, gdzie N odnosi się do wymiarów wektora.
Word2Vec zwraca niektóre zdumiewające wyniki. Zdolność Word2Vec do utrzymywania relacji semantycznych jest odzwierciedlona w klasycznym przykładzie, gdzie jeśli masz wektor dla słowa „Król” i usuwasz wektor reprezentowany przez słowo „Człowiek” z „Króla” i dodajesz „Kobiety” do niego, otrzymujesz wektor, który jest blisko wektora „Królowej”. Relacja ta jest powszechnie reprezentowana jako:
King - Man + Women = Queen
Model Word2Vec występuje w dwóch smakach: Skip Gram Model i Continuous Bag of Words Model (CBOW).
W modelu Skip Gram słowa kontekstowe są przewidywane przy użyciu słowa bazowego. Na przykład, biorąc pod uwagę zdanie „Kocham tańczyć w deszczu”, model Skip Gram będzie przewidywać „miłość” i „taniec”, biorąc pod uwagę słowo „do” jako input.
Przeciwnie, model CBOW będzie przewidywać „do”, jeśli słowa kontekstowe „miłość” i „taniec” są podawane jako dane wejściowe do modelu. Model uczy się tych relacji za pomocą głębokich sieci neuronowych.
Pros i Cons of Word2Vec
Word2Vec ma kilka zalet w stosunku do worka słów i schematu IF-IDF. Word2Vec zachowuje semantyczne znaczenie różnych słów w dokumencie. Informacje o kontekście nie są tracone. Inną wielką zaletą podejścia Word2Vec jest to, że rozmiar wektora osadzania jest bardzo mały. Każdy wymiar wektora osadzania zawiera informacje o jednym aspekcie słowa. Nie potrzebujemy ogromnych wektorów sparse, w przeciwieństwie do worka słów i TF-IDF approaches.
Uwaga: Matematyczne szczegóły tego, jak działa Word2Vec obejmują wyjaśnienie sieci neuronowych i prawdopodobieństwa softmax, który jest poza zakresem tego artykułu. Jeśli chcesz zrozumieć matematyczne podstawy działania Word2Vec, przeczytaj ten dokument: https://arxiv.org/abs/1301.3781
Word2Vec w Pythonie z biblioteką Gensim
W tej części zaimplementujemy model Word2Vec za pomocą biblioteki Gensim w Pythonie. Wykonaj następujące kroki:
Tworzenie korpusu
Wcześniej omówiliśmy, że aby utworzyć model Word2Vec, potrzebujemy korpusu. W rzeczywistych zastosowaniach, modele Word2Vec są tworzone przy użyciu miliardów dokumentów. Na przykład model Word2Vec firmy Google jest trenowany przy użyciu 3 milionów słów i fraz. Jednakże, dla uproszczenia, stworzymy model Word2Vec używając pojedynczego artykułu z Wikipedii. Nasz model nie będzie tak dobry jak model Google. Jednak jest wystarczająco dobry, aby wyjaśnić, jak model Word2Vec można zaimplementować za pomocą biblioteki Gensim.
Zanim będziemy mogli podsumować artykuły Wikipedii, musimy je pobrać. W tym celu skorzystamy z kilku bibliotek. Pierwszą biblioteką, którą musimy pobrać jest biblioteka Beautiful Soup, która jest bardzo użytecznym narzędziem Pythona służącym do skrobania stron internetowych. Wykonaj następującą komendę w wierszu poleceń, aby pobrać narzędzie Beautiful Soup.
$ pip install beautifulsoup4
Inną ważną biblioteką, której potrzebujemy do parsowania XML i HTML jest biblioteka lxml. Wykonaj następujące polecenie w wierszu poleceń, aby pobrać bibliotekę lxml:
$ pip install lxml
Artykuł, który zamierzamy zeskrobać, to artykuł z Wikipedii na temat sztucznej inteligencji. Napiszmy skrypt Pythona, aby zeskrobać artykuł z Wikipedii:
W powyższym skrypcie najpierw pobieramy artykuł z Wikipedii za pomocą metody urlopen
klasy request
biblioteki urllib
. Następnie odczytujemy treść artykułu i parsujemy ją przy użyciu obiektu klasy BeautifulSoup
. Wikipedia przechowuje zawartość tekstową artykułu wewnątrz znaczników p
. Używamy funkcji find_all
obiektu BeautifulSoup
do pobrania całej zawartości ze znaczników akapitu artykułu.
Na koniec łączymy wszystkie akapity i przechowujemy zeskrobany artykuł w zmiennej article_text
do późniejszego wykorzystania.
Preprocessing
W tym momencie mamy już zaimportowany artykuł. Następnym krokiem jest wstępne przetworzenie treści dla modelu Word2Vec. Poniższy skrypt wstępnie przetwarza tekst:
W powyższym skrypcie konwertujemy cały tekst na małe litery, a następnie usuwamy wszystkie cyfry, znaki specjalne i dodatkowe spacje z tekstu. Po wstępnym przetworzeniu pozostają nam tylko słowa.
Model Word2Vec jest trenowany na zbiorze słów. Najpierw musimy przekonwertować nasz artykuł na zdania. Używamy narzędzia nltk.sent_tokenize
do konwersji naszego artykułu na zdania. Aby przekonwertować zdania na słowa, użyjemy narzędzia nltk.word_tokenize
. Jako ostatni krok wstępnego przetwarzania, usuwamy wszystkie słowa stop z tekstu.
Po zakończeniu wykonywania skryptu, obiekt all_words
zawiera listę wszystkich słów w artykule. Listę tę wykorzystamy do utworzenia naszego modelu Word2Vec za pomocą biblioteki Gensim.
Tworzenie modelu Word2Vec
Z pomocą Gensim utworzenie modelu Word2Vec jest niezwykle proste. Listę słów przekazujemy do klasy Word2Vec
z pakietu gensim.models
. Musimy określić wartość dla parametru min_count
. Wartość 2 dla parametru min_count
oznacza, że w modelu Word2Vec zostaną uwzględnione tylko te słowa, które występują w korpusie co najmniej dwa razy. Poniższy skrypt tworzy model Word2Vec, używając artykułu z Wikipedii, który zdrapaliśmy.
from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)
Aby zobaczyć słownik unikalnych słów występujących co najmniej dwa razy w korpusie, wykonaj następujący skrypt:
vocabulary = word2vec.wv.vocabprint(vocabulary)
Po wykonaniu powyższego skryptu zobaczysz listę wszystkich unikalnych słów występujących co najmniej dwa razy.
Analiza modelu
W poprzednim rozdziale udało nam się stworzyć nasz model Word2Vec. Teraz nadszedł czas na zbadanie tego, co stworzyliśmy.
Znajdowanie wektorów dla słowa
Wiemy, że model Word2Vec konwertuje słowa na odpowiadające im wektory. Zobaczmy, jak możemy wyświetlić reprezentację wektorową dowolnego konkretnego słowa.
v1 = word2vec.wv
Wektor v1
zawiera reprezentację wektorową dla słowa „sztuczny”. Domyślnie przez Gensim Word2Vec tworzony jest wektor stuwymiarowy. Jest to znacznie, znacznie mniejszy wektor w porównaniu do tego, co zostałoby wyprodukowane przez worek słów. Jeśli użyjemy metody worka słów do osadzenia artykułu, długość wektora dla każdego z nich wyniesie 1206, ponieważ istnieje 1206 unikalnych słów o minimalnej częstotliwości występowania równej 2. Jeśli minimalna częstotliwość występowania zostanie ustawiona na 1, rozmiar wektora worka słów jeszcze się zwiększy. Z drugiej strony, na wektory generowane przez Word2Vec nie ma wpływu rozmiar słownictwa.
Znajdowanie podobnych słów
Wcześniej powiedzieliśmy, że informacja kontekstowa słów nie jest tracona przy użyciu podejścia Word2Vec. Możemy to sprawdzić, znajdując wszystkie słowa podobne do słowa „inteligencja”.
Spójrz na poniższy skrypt:
sim_words = word2vec.wv.most_similar('intelligence')
Jeśli wydrukujesz zmienną sim_words
na konsolę, zobaczysz słowa najbardziej podobne do „inteligencji”, jak pokazano poniżej:
Z wyjścia możesz zobaczyć słowa podobne do „inteligencji” wraz z ich indeksem podobieństwa. Słowo „ai” jest najbardziej podobnym słowem do „inteligencji” według modelu, co faktycznie ma sens. Podobnie, słowa takie jak „ludzki” i „sztuczny” często współistnieją ze słowem „inteligencja”. Nasz model z powodzeniem uchwycił te relacje używając tylko jednego artykułu Wikipedii.
Wnioski
W tym artykule zaimplementowaliśmy model osadzania słów Word2Vec za pomocą biblioteki Gensim Pythona. Dokonaliśmy tego poprzez skrobanie artykułu z Wikipedii i zbudowaliśmy nasz model Word2Vec używając artykułu jako korpusu. Dokonaliśmy również krótkiego przeglądu najczęściej używanych metod osadzania słów wraz z ich zaletami i wadami w porównaniu do Word2Vec.
Sugerowałbym stworzenie własnego modelu Word2Vec z pomocą dowolnego korpusu tekstowego i sprawdzenie, czy można uzyskać lepsze wyniki w porównaniu z podejściem worka słów.
.