Implementarea Word2Vec cu librăria Gensim în Python

Introducere

Oamenii au o abilitate naturală de a înțelege ce spun alți oameni și ce să spună ca răspuns. Această abilitate este dezvoltată prin interacțiunea consecventă cu alți oameni și cu societatea de-a lungul mai multor ani. Limbajul joacă un rol foarte important în modul în care oamenii interacționează. Limbajele pe care oamenii le folosesc pentru interacțiune se numesc limbaje naturale.

Reguli ale diferitelor limbaje naturale sunt diferite. Cu toate acestea, există un lucru în comun în limbajele naturale: flexibilitatea și evoluția.

Limbajele naturale sunt foarte foarte flexibile. Să presupunem că sunteți la volanul unei mașini și prietenul dvs. spune unul dintre aceste trei enunțuri: „Trage pe dreapta”, „Oprește mașina”, „Oprește”. Înțelegeți imediat că el vă cere să opriți mașina. Acest lucru se datorează faptului că limbajele naturale sunt extrem de flexibile. Există mai multe moduri de a spune un lucru.

Un alt aspect important al limbajelor naturale este faptul că acestea evoluează în mod constant. De exemplu, în urmă cu câțiva ani nu exista un termen precum „Google it”, care se referă la căutarea a ceva pe motorul de căutare Google. Limbajele naturale sunt mereu în evoluție.

Pe de altă parte, limbajele informatice urmează o sintaxă strictă. Dacă vreți să-i spuneți unui calculator să tipărească ceva pe ecran, există o comandă specială pentru asta. Sarcina procesării limbajului natural este de a face computerele să înțeleagă și să genereze limbajul uman într-un mod similar cu cel al oamenilor.

Aceasta este o sarcină uriașă și există multe obstacole implicate. Această prelegere video de la Universitatea din Michigan conține o explicație foarte bună a motivelor pentru care NLP este atât de dificilă.

În acest articol vom implementa tehnica Word2Vec word embedding folosită pentru crearea vectorilor de cuvinte cu biblioteca Gensim din Python. Cu toate acestea, înainte de a trece direct la secțiunea de codare, vom trece în revistă pe scurt câteva dintre cele mai utilizate tehnici de încorporare a cuvintelor, împreună cu avantajele și dezavantajele acestora.

Abordări de încorporare a cuvintelor

Unul dintre motivele pentru care procesarea limbajului natural este o problemă dificil de rezolvat este faptul că, spre deosebire de ființele umane, computerele pot înțelege doar numere. Trebuie să reprezentăm cuvintele într-un format numeric care să poată fi înțeles de calculatoare. Încorporarea cuvintelor se referă la reprezentările numerice ale cuvintelor.

În prezent există mai multe abordări de încorporare a cuvintelor și toate au avantajele și dezavantajele lor. Vom discuta aici trei dintre ele:

  1. Bag of Words
  2. TF-IDF Scheme
  3. Word2Vec

Bag of Words

Abordarea bag of words este una dintre cele mai simple abordări de încorporare a cuvintelor. În cele ce urmează sunt prezentați pașii pentru a genera încorporări de cuvinte utilizând abordarea bag of words.

Vom vedea încorporările de cuvinte generate prin abordarea bag of words cu ajutorul unui exemplu. Să presupunem că aveți un corpus cu trei propoziții.

  • S1 = I love rain
  • S2 = rain rain rain go away
  • S3 = I am away

Pentru a converti propozițiile de mai sus în reprezentările lor corespunzătoare de tip word embedding folosind abordarea bag of words, trebuie să efectuăm următorii pași:

Observați că pentru S2 am adăugat 2 în loc de „ploaie” în dicționar; acest lucru se datorează faptului că S2 conține „ploaie” de două ori.

Pro și contra sacului de cuvinte

Abordarea sacului de cuvinte are atât avantaje, cât și dezavantaje. Principalul avantaj al abordării bag of words este că nu este nevoie de un corpus foarte mare de cuvinte pentru a obține rezultate bune. Puteți vedea că am construit un model foarte simplu de sac de cuvinte cu trei propoziții. Din punct de vedere computațional, un model de sac de cuvinte nu este foarte complex.

Un dezavantaj major al abordării de tip sac de cuvinte este faptul că trebuie să creăm vectori uriași cu spații goale pentru a reprezenta un număr (matrice rarefiată), ceea ce consumă memorie și spațiu. În exemplul anterior, am avut doar 3 propoziții. Cu toate acestea, puteți vedea trei zerouri în fiecare vector.

Imaginați-vă un corpus cu mii de articole. Într-un astfel de caz, numărul de cuvinte unice într-un dicționar poate fi de mii. Dacă un document conține 10% din cuvintele unice, vectorul de încorporare corespunzător va conține în continuare 90% de zerouri.

O altă problemă majoră a abordării de tip sac de cuvinte este faptul că aceasta nu păstrează nicio informație de context. Nu îi pasă de ordinea în care apar cuvintele într-o propoziție. De exemplu, tratează în mod egal propozițiile „Sticla este în mașină” și „Mașina este în sticlă”, care sunt propoziții total diferite.

Un tip de abordare de tip sac de cuvinte, cunoscut sub numele de n-grame, poate ajuta la menținerea relației dintre cuvinte. N-grama se referă la o secvență contiguă de n cuvinte. De exemplu, 2-grame pentru propoziția „Nu ești fericit”, sunt „Ești”, „nu ești” și „nu ești fericit”. Deși abordarea cu n-grame este capabilă să capteze relațiile dintre cuvinte, dimensiunea setului de caracteristici crește exponențial cu prea multe n-grame.

Schema TF-IDF

Schema TF-IDF este un tip de abordare de tip sac de cuvinte în care, în loc să se adauge zerouri și unu în vectorul de încorporare, se adaugă numere flotante care conțin mai multe informații utile în comparație cu zerourile și unu. Ideea din spatele schemei TF-IDF constă în faptul că cuvintele care au o frecvență mare de apariție într-un document și o frecvență mai mică de apariție în toate celelalte documente sunt mai cruciale pentru clasificare.

TF-IDF este un produs de două valori: Term Frequency (TF) și Inverse Document Frequency (IDF).

Frecvența termenilor se referă la numărul de apariții ale unui cuvânt în document și poate fi calculată astfel:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

De exemplu, dacă ne uităm la propoziția S1 din secțiunea anterioară, adică „Iubesc ploaia”, fiecare cuvânt din propoziție apare o singură dată și, prin urmare, are o frecvență de 1. Dimpotrivă, pentru S2, adică „rain rain rain go away”, frecvența cuvântului „rain” este de două, în timp ce pentru restul cuvintelor este de 1.

IDF se referă la logaritmul numărului total de documente împărțit la numărul de documente în care există cuvântul respectiv și poate fi calculat astfel:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

De exemplu, valoarea IDF pentru cuvântul „rain” este 0,1760, deoarece numărul total de documente este de 3, iar rain apare în 2 dintre ele, prin urmare log(3/2) este 0,1760. Pe de altă parte, dacă ne uităm la cuvântul „love” din prima propoziție, acesta apare într-unul dintre cele trei documente și, prin urmare, valoarea IDF este log(3), ceea ce înseamnă 0,4771.

Pro și contra TF-IDF

Deși TF-IDF reprezintă o îmbunătățire față de abordarea simplă a sacului de cuvinte și oferă rezultate mai bune pentru sarcinile NLP obișnuite, avantajele și dezavantajele generale rămân aceleași. În continuare trebuie să creăm o matrice sparse uriașă, care necesită, de asemenea, mult mai multe calcule decât abordarea simplă a sacului de cuvinte.

Word2Vec

Abordarea <a target=”_blank rel=”nofollow”” href=”https://en.wikipedia.org/wiki/Word2vec”>Abordarea de încorporare a cuvintelor în Word2Vec, dezvoltată de Tomas Mikolov, este considerată a fi cea mai avansată. Abordarea Word2Vec utilizează tehnici bazate pe învățare profundă și rețele neuronale pentru a converti cuvintele în vectori corespunzători în așa fel încât vectorii similari din punct de vedere semantic să fie apropiați unul de celălalt în spațiul N-dimensional, unde N se referă la dimensiunile vectorului.

Word2Vec returnează niște rezultate uimitoare. Capacitatea Word2Vec de a menține relația semantică este reflectată de un exemplu clasic în care, dacă aveți un vector pentru cuvântul „Rege” și eliminați vectorul reprezentat de cuvântul „Bărbat” din „Rege” și adăugați la acesta „Femei”, veți obține un vector care este apropiat de vectorul „Regină”. Această relație este reprezentată în mod obișnuit sub forma:

King - Man + Women = Queen

Modelul Word2Vec vine în două variante: Skip Gram Model și Continuous Bag of Words Model (CBOW).

În modelul Skip Gram, cuvintele din context sunt prezise folosind cuvântul de bază. De exemplu, având în vedere o propoziție „Îmi place să dansez în ploaie”, modelul skip gram va prezice „dragoste” și „dans” având ca intrare cuvântul „to”.

În schimb, modelul CBOW va prezice „to”, dacă cuvintele de context „love” și „dance” sunt introduse ca intrare în model. Modelul învață aceste relații folosind rețele neuronale profunde.

Pro și contra Word2Vec

Word2Vec are mai multe avantaje față de bag of words și schema IF-IDF. Word2Vec păstrează semnificația semantică a diferitelor cuvinte dintr-un document. Informațiile de context nu se pierd. Un alt mare avantaj al abordării Word2Vec este că dimensiunea vectorului de înglobare este foarte mică. Fiecare dimensiune a vectorului de înglobare conține informații despre un aspect al cuvântului. Nu avem nevoie de vectori sparși uriași, spre deosebire de abordările bag of words și TF-IDF.

Nota: Detaliile matematice ale modului în care funcționează Word2Vec implică o explicație a rețelelor neuronale și a probabilității softmax, care depășește scopul acestui articol. Dacă doriți să înțelegeți motivele matematice ale Word2Vec, vă rugăm să citiți acest articol: https://arxiv.org/abs/1301.3781

Word2Vec in Python with Gensim Library

În această secțiune, vom implementa modelul Word2Vec cu ajutorul bibliotecii Gensim din Python. Urmați acești pași:

Crearea Corpusului

Am discutat mai devreme că, pentru a crea un model Word2Vec, avem nevoie de un corpus. În aplicațiile din viața reală, modelele Word2Vec sunt create folosind miliarde de documente. De exemplu, modelul Word2Vec de la Google este antrenat folosind 3 milioane de cuvinte și fraze. Cu toate acestea, de dragul simplității, vom crea un model Word2Vec folosind un singur articol din Wikipedia. Modelul nostru nu va fi la fel de bun ca cel al Google. Cu toate acestea, este suficient de bun pentru a explica modul în care modelul Word2Vec poate fi implementat cu ajutorul bibliotecii Gensim.

Înainte de a putea rezuma articolele Wikipedia, trebuie să le preluăm. Pentru a face acest lucru vom folosi câteva biblioteci. Prima bibliotecă pe care trebuie să o descărcăm este biblioteca Beautiful Soup, care este un utilitar Python foarte util pentru web scraping. Executați următoarea comandă la promptul de comandă pentru a descărca utilitarul Beautiful Soup.

$ pip install beautifulsoup4

O altă bibliotecă importantă de care avem nevoie pentru a analiza XML și HTML este biblioteca lxml. Executați următoarea comandă la promptul de comandă pentru a descărca lxml:

$ pip install lxml

Articolul pe care îl vom răzui este articolul Wikipedia despre Inteligența Artificială. Să scriem un script Python pentru a extrage articolul din Wikipedia:

În scriptul de mai sus, mai întâi descărcăm articolul din Wikipedia folosind metoda urlopen a clasei request din biblioteca urllib. Apoi citim conținutul articolului și îl analizăm folosind un obiect al clasei BeautifulSoup. Wikipedia stochează conținutul de text al articolului în interiorul etichetelor p. Utilizăm funcția find_all a obiectului BeautifulSoup pentru a prelua tot conținutul din tag-urile paragrafelor articolului.

În cele din urmă, unim toate paragrafele împreună și stocăm articolul răzuit în variabila article_text pentru utilizare ulterioară.

Preprocesare

În acest moment am importat articolul. Următorul pas este să preprocesăm conținutul pentru modelul Word2Vec. Următorul script preprocesează textul:

În scriptul de mai sus, convertim tot textul în minuscule și apoi eliminăm toate cifrele, caracterele speciale și spațiile suplimentare din text. După preprocesare, rămânem doar cu cuvintele.

Modelul Word2Vec este antrenat pe o colecție de cuvinte. Mai întâi, trebuie să convertim articolul nostru în propoziții. Utilizăm utilitarul nltk.sent_tokenize pentru a converti articolul nostru în propoziții. Pentru a converti propozițiile în cuvinte, folosim utilitarul nltk.word_tokenize. Ca o ultimă etapă de preprocesare, eliminăm toate cuvintele de oprire din text.

După ce scriptul își finalizează execuția, obiectul all_words conține lista tuturor cuvintelor din articol. Vom folosi această listă pentru a crea modelul nostru Word2Vec cu biblioteca Gensim.

Crearea modelului Word2Vec

Cu Gensim, este extrem de simplu să creăm modelul Word2Vec. Lista de cuvinte este transmisă clasei Word2Vec din pachetul gensim.models. Trebuie să specificăm valoarea pentru parametrul min_count. O valoare de 2 pentru min_count specifică includerea doar a acelor cuvinte în modelul Word2Vec care apar de cel puțin două ori în corpus. Următorul script creează modelul Word2Vec folosind articolul Wikipedia pe care l-am răzuit.

from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)

Pentru a vedea dicționarul de cuvinte unice care există de cel puțin două ori în corpus, executați următorul script:

vocabulary = word2vec.wv.vocabprint(vocabulary)

Când scriptul de mai sus este executat, veți vedea o listă cu toate cuvintele unice care apar de cel puțin două ori.

Analiza modelului

Am creat cu succes modelul nostru Word2Vec în ultima secțiune. Acum este momentul să explorăm ceea ce am creat.

Căutarea vectorilor pentru un cuvânt

Știm că modelul Word2Vec convertește cuvintele în vectorii lor corespunzători. Să vedem cum putem vizualiza reprezentarea vectorială a unui anumit cuvânt.

v1 = word2vec.wv

Vectorialul v1 conține reprezentarea vectorială pentru cuvântul „artificial”. În mod implicit, un vector cu o sută de dimensiuni este creat de Gensim Word2Vec. Acesta este un vector mult, mult mai mic în comparație cu cel care ar fi fost produs de sacul de cuvinte. Dacă folosim abordarea sacului de cuvinte pentru încorporarea articolului, lungimea vectorului pentru fiecare va fi de 1206, deoarece există 1206 cuvinte unice cu o frecvență minimă de 2. Dacă frecvența minimă de apariție este setată la 1, dimensiunea vectorului sacului de cuvinte va crește și mai mult. Pe de altă parte, vectorii generați prin Word2Vec nu sunt afectați de dimensiunea vocabularului.

Căutarea cuvintelor similare

Am spus mai devreme că informațiile contextuale ale cuvintelor nu se pierd folosind abordarea Word2Vec. Putem verifica acest lucru prin găsirea tuturor cuvintelor similare cu cuvântul „intelligence”.

Consultați următorul script:

sim_words = word2vec.wv.most_similar('intelligence')

Dacă imprimați variabila sim_words în consolă, veți vedea cuvintele cele mai asemănătoare cu „intelligence”, după cum se arată mai jos:

Din rezultatul obținut, puteți vedea cuvintele similare cu „intelligence” împreună cu indicele lor de similaritate. Cuvântul „ai” este cel mai asemănător cuvânt cu „intelligence” conform modelului, ceea ce are sens. În mod similar, cuvinte precum „uman” și „artificial” coexistă adesea cu cuvântul „inteligență”. Modelul nostru a reușit să capteze cu succes aceste relații folosind doar un singur articol din Wikipedia.

Concluzie

În acest articol, am implementat un model de încorporare a cuvintelor Word2Vec cu biblioteca Gensim din Python. Am făcut acest lucru prin răzuirea unui articol Wikipedia și am construit modelul Word2Vec folosind articolul ca corpus. De asemenea, am trecut în revistă pe scurt cele mai frecvent utilizate abordări de încorporare a cuvintelor, împreună cu avantajele și dezavantajele lor, ca o comparație cu Word2Vec.

Vă sugerez să creați un model Word2Vec propriu cu ajutorul oricărui corpus de text și să vedeți dacă puteți obține rezultate mai bune în comparație cu abordarea sacului de cuvinte.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.