Doc2Vec – wektorowa reprezentacja dokumentów

 In Technicznie

Doc2Vec jest sposobem na wektorową reprezentację dokumentów, a nie pojedynczych słów tak jak ma to miejsce w word2vec. Daje to komputerowi możliwość znalezienia sensu i  interpretacji tekstu, nie na podstawie pojedynczych słów, ale wyciągnięcie bardziej ogólnego kontekstu. Doc2vec jest tym dla dokumentu, co word2vec dla słowa. Nie wiesz co to znaczy? Czytaj dalej.

Wstęp

Wykorzystanie sztucznej inteligencji do przetwarzania i analizy tekstu, czyli przetwarzanie języka naturalnego (ang. natural language processing, NLP), jest coraz częściej wykorzystywane we współczesnych aplikacjach. W tym poście przedstawię sposób użycia Doc2Vec oraz sposób ich działania.

Ze względu na konieczność rozumienia kontekstu słów w zdaniu, ciężko jest maszynom zrozumieć nasz język. Różnica pomiędzy słowami takimi jak król i królowa, czy mężczyzna i kobieta, są dla ludzi czymś oczywistym. W celu zrozumienia tych słów przez sztuczną inteligencję należy utworzyć ich reprezentację liczbową, a dokładniej wektorową (tzw. word embedding).

word2vec

Model word2vec zamiania słowa na ich reprezentację wektororową. Wektory mają zazwyczaj długość  od 100 do 300, co dobrze potrafi odzwierciedlić znaczenie słów. Word embeddingi tworzy się przechodząc po korpusie (zbiorze tekstów) i aktualizując poszczególne wektory słów, w zależności od częstości i bliskości ich występowania. W wyniku wytrenowania modelu chcielibyśmy, aby odległość między wektorami ‘kierowca’ i ‘samochód’ była mniejsza niż ‘kierowca’ i ‘samolot’. Im odległość jest mniejsza, tym większa jest bliskość tych słów.
Reprezentacja wektorów pozwala na stworzenie relacji między słowami, takimi jak synonimy, antonimy oraz analogie.

Przejdźmy do przykładów!

Nie można mówić o word embeddingach nie podając równania:

król - mężczyna + kobieta = królowa

Każde z tych słów jest umieszczone w przestrzeni wektorowej, a działania wykonujemy na ich wektorach. To równanie można by odczytać: od króla odejmiemy pierwiastek męskości i zostaje nam  królowanie (władza), a gdy do królowania dodamy pierwiastek kobiecy, to w wyniku otrzymamy królową.

Przykładem analogi pomiędzy słowami, którą możemy wyciągnąć z modelu to Paryż dla Francji, jest jak Warszawa dla … ? (Chyba znasz odpowiedź 🙂 )

Modele word2vec

Podstawowymi modelami word2vec są Continuous Bag-Of-Words (CBOW) i Skip gram.

Continuous bag of words

Model CBOW wykorzystywany jest do predykcji pojedynczego słowa na podstawie kontekstu. np. ‘Kot usiadł __ kanapie.’

Skip gram

Ten model jest w zasadzie odwrotnością poprzedniego modelu. W tym przypadku na podstawie jednego słowa przewidujemy kontekst, w jakim znajduje się nasze słowo.
Model ten jest wolniejszy niż poprzedni, ale uważa się go za dokładniejszy dla mniej popularnych słów.

Doc2vec

Doc2vec jest metodą reprezentacji wektorowej całych dokumentów, a nie pojedynczych słów. Przez dokument, można rozumieć pojedyncze zdanie, paragraf lub całą książkę.

Twórcami tej metody są Mikilov i Le, którzy przedstawili koncepcję doc2vec w artykule. Zasada działania jest podobna jak w przypadku word2vec, na podstawie słów w dokumencie trenujemy word embeddingi dla dokumentu, natomiast potrzebny jest jeszcze element opisujący dokument jako całość. Dodano zatem dodatkowy unikalny (wśród wszystkich dokumentów) wektor, reprezentujący dokument.

Klasyfikacja dokumentów

Doc2vec można także wykorzystać do klasyfikacji (kategoryzowania) dokumentów. Wykorzystamy do tego implementacja doc2vec i TaggedDocumet w gensim.

Do klasyfikacji w doc2vec wykorzystuje się TaggedDocument, czyli dokument z etykietą. Do reprezentacji dokumentu, dodany jest kolejny wektor opisujący etykietę, jest to wektor utworzony na podstawie wszystkich dokumentów, posiadających daną etykietę. Można założyć, że ten wektor zawiera informację cechujące wszystkie dokumenty o tej etykiecie.

 

Przygotowanie zestawu danych

Należy pamiętać, aby odpowiednio przygotować i wyczyścić nasz zestaw danych. Na większości tekstów w NLP, wykonuje się kilka operacji, które pozwalają na lepsze wytrenowanie modelu.

  1. Doprowadzenie wszystkich znaków do wielich lub małych liter. Dzięki temu słowa ‘szkoła’ i ‘Szkoła’, która była pierwszym wyrazem w zdaniu, mają to samo znaczenie.
  2. Usunięcie z tekstu znaków specjalnych, emotikon i innych elementów, które nie są słowami.
  3. Usunięcie tzw. stop words, tzn. słów występujących w zdaniach, ale nie niosących informacji o tekście np. zdanie  ‘syn poszedł do sklepu po jajka bo się już skończyły’ po usunięciu odpowiednich wyrazów będzie miało postać ‘syn poszedł sklepu jajka skończyły’
  4. Kolejnym krokiem, może być lematyzacja tekstu, czyli sprowadzenie formy fleksyjnej wyrazu do postaci słownikowej, np. poszedł, zamienimy na formę podstawową pójść. Istotne jest to, że słowo poszła, także zostanie sprowadzona do tej samej postaci, bo te słowa informują o tej samej czynności.
  5. Tokenizacja tekstu, czyli podział zdania na słowa po ustalonych znakach interpunkcyjnych czy spacjach, ale ze wzięciem pod uwagę contact@example.com to jest 1 słowo, a nie 2, pomimo występowania tam kropki.

Trenowanie modelu

Mając zbiór artykułów np. o żywności, technologiach i polityce, stwórzmy zestaw TaggedDocumentów. Uzyskany w ten sposób zbiór danych wykorzystuje się do wytrenowania modelu. Każdy dokument został przypisany do jego kategorii oraz otrzymał indywidualną dla siebie etykietę ‘DOC_*’. Dzięki temu będziemy mogli porównywać, jakie jest podobieństwo między dwoma dokumentami. Poszczególne dokumenty mogą należeć do 1 lub więcej kategorii, więc otrzymają zestaw tagów.

from gensim.models.doc2vec import Doc2Vec, TaggedDocument

tagged_data = [
    TaggedDocument(words=prepare_text(text1), tags=['law', 'food', 'DOC_1']),
    TaggedDocument(words=prepare_text(text2), tags=['food', 'DOC_2']),
    TaggedDocument(words=prepare_text(text3), tags=['technology', 'DOC_3']),
    TaggedDocument(words=prepare_text(text4), tags=['technology', 'food', 'DOC_4']),
    ...
]

max_epochs = 100
alpha = 0.025

model = Doc2Vec(alpha=alpha, 
                min_alpha=0.00025,
                min_count=1,
                dm=1)
  
model.build_vocab(tagged_data)

for epoch in range(max_epochs):
    print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count)
    # decrease the learning rate
    model.alpha -= 0.0002
    # fix the learning rate, no decay
    model.min_alpha = model.alpha

model.save("d2v.model")
print("Model Saved")

Wykorzystanie modelu

Wprowadzenie nowego dokumentu

Zaletą doc2vec jest fakt, że nie musimy przetrenowywać na nowo modelu, aby sprawdzić wektor nowego dokumentu. Wystarczy tekst nowego dokumentu przygotować jak dane do trenowania. Metoda infer_vector zwróci reprezentację wektorową dokumentu. Należy pamiętać, że jest to pewne przybliżenie i za każdym razem, otrzymamy nieco inny wektor.
Mając wektor, model może nam wskazać, do jakich przetrenowanych dokumentów jest podobny lub do jakiej etykiety pasuje nowy dokument.

Posiadając nowy dokument, możemy za pomocą metody ‘infer_vector’ dowiedzieć się jak model interpretuje nowy dokument. Metoda zwróci wektor, który najbardziej pasuje do istniejących wektorów.

new_vec = model.infer_vector(prepare_text(new_text))  # [ 3.3926601   2.4535866   7.912783   -2.6604555  -3.2441354  -0.38052848 ... ]

Podobne dokumenty do już istniejącego możemy wyszukać za pomocą metody most_similar:

similar_docs = model.docvecs.most_similar('DOC_23')  # [('DOC_32', 0.7985577464103699), ('DOC_87', 0.6098586320877075), ...]

Podobieństwo dwóch dokumentów otrzymamy, dzięki metodzie similarity:

model.docvecs.similarity('DOC_55', 'DOC_62')  # 0.4983263363869298

Podsumowanie

Uczenie maszynowe nieustannie się rozwija. Coraz więcej aplikacji wykorzystuje modele ML oraz NLP. Warto, więc już teraz rozpocząć naukę i zrozumieć zasadę działania różnych modeli sztucznej inteligencji. Efekty NLP można zauważyć w wielu komunikatorach, social media, przy analizie poprawności tekstu czy przewidywaniu kolejnych słów zdania pisząc sms’y.

Dużą zaletą doc2vec (w mojej ocenie) jest wsparcie biblioteki gensim dla języka Python i stosunkowo niski poziom wejścia. Rozumiejąc modele word2vec oraz doc2vec, można w nowy sposób myśleć o reprezentacji tekstów, co pozwala na wykorzystanie modeli ML do nowych rozwiązań, np. przydzielanie etykiet, na podstawie treści lub porównywanie prac w systemach antyplagiatowych.

 

Zdjęcie z https://www.pexels.com/photo/batch-books-document-education-357514/

Recent Posts