Cum se antrenează modelul word2vec folosind biblioteca gensim

Ce este încorporarea cuvintelor?

Încorporarea cuvintelor este un proces de înțelegere a textului prin algoritmi de învățare automată, de asemenea, spunem că încorporarea cuvintelor este o reprezentare învățată pentru text în care se captează contextul cuvântului într-un document, similaritatea semantică și sintactică, precum și relația dintre alte cuvinte din corpus.

Această abordare deține cheia pentru a rezolva problemele de procesare a limbajului natural folosind algoritmul de învățare automată și de învățare profundă. Practic, încorporarea cuvintelor este o reprezentare vectorială a cuvintelor. Prin calcularea distanței sau a poziției cuvintelor, aceasta reprezintă sensul cuvintelor, propozițiilor, paragrafelor sau documentelor.

Există mai multe tehnici de încorporare a cuvintelor care au fost introduse până în prezent. În general, spunem că există două tipuri de încorporare a cuvintelor –

  • Static Word Embedding
  • Contextual Word Embedding

1. Încorporarea statică a cuvintelor: Metodele tradiționale, cum ar fi Skip-Gram și Continuous Bag-of-Words, învață încorporarea statică prin antrenarea tabelelor de căutare care traduc cuvintele într-un vector dens. Încorporarea statică este direct utilă pentru rezolvarea sarcinilor de semantică lexicală.

Problemă: Nu se pot rezolva ambiguitățile în cazul cuvintelor polisemice. De exemplu, atunci când un cuvânt reprezintă mai multe sensuri în două propoziții diferite, atunci metodele Skip-Gram sau BOW eșuează.

2. Încorporarea contextuală a cuvintelor: Încorporarea contextualizată a cuvintelor urmărește să capteze semantica cuvintelor în diferite contexte pentru a aborda problema polisemelor și a naturii dependente de context a cuvintelor. Modelul LSTM, LSTM bidirecțional etc. ajută la obținerea formei vectoriale a cuvintelor.

Word2Vec Model: Word2Vec este o metodă de construire a unei astfel de încorporări statice a cuvintelor. Acest lucru a fost realizat cu ajutorul a două metode Skip Gram și Common Bag of Words (CBOW) cu ajutorul rețelelor neuronale. A fost dezvoltat de Tomas Mikolov în 2013 la Google.

De ce avem nevoie de ele?

Să spunem că avem propozițiile de mai jos.

„Îmi place să codific în Jupyter.” și „Îmi place să codific în Pycharm”.

Ambele propoziții sunt foarte apropiate una de cealaltă. Dacă construim un vocabular exhaustiv (să îl numim V), acesta va avea V = {I, love, enjoy, coding, in, Jupyter, Pycharm}. Dacă optăm pentru o codificare fierbinte. Nu vom putea obține sensul exact, deoarece love, enjoy, coding fiecare cuvânt este tratat ca fiind același, în timp ce love și enjoy și sunt foarte apropiate unul de celălalt.

Motivul nostru este de a avea cuvinte cu un context similar vor avea o poziție spațială foarte apropiată. Din punct de vedere matematic, distanța cosinusului va identifica cât de apropiate sunt două cuvinte. Distanța cosinus a celui mai apropiat cuvânt sau Cosinus al îngerului va fi aproape de 0, iar pentru cel mai îndepărtat va fi aproape de 1.

Cum funcționează Word2Vec?

Modelul Word2Vec poate rula pe doi algoritmi –

  • Skip-gram
  • CBOW (Continuous Bag of Words)

Modelul CBOW: Această metodă ia ca intrare contextul fiecărui cuvânt și încearcă să prezică cuvântul care corespunde contextului. În procesul de predicție a cuvântului țintă, învățăm reprezentarea vectorială a cuvântului țintă. Ca intrare vor exista mai multe cuvinte, conform dimensiunii ferestrei (5 cuvinte), dar va returna un singur cuvânt ca ieșire.

Să analizăm mai în profunzime arhitectura:

Modelul Skip-Gram: Acesta este un alt algoritm pentru Word2Vec. Este exact opusul modelului CBOW. Modelul va primi un singur cuvânt ca intrare, dar va returna mai multe cuvinte în funcție de dimensiunea ferestrei.

Implementarea încorporării cuvintelor cu modelul Gensim Word2Vec:

Aici voi explica pas cu pas cum se antrenează modelul word2vec folosind Gensim. Setul de date, pe care l-am colectat de pe platforma Kaggle. Acest set de date în din datele publice Myers-Briggs Type Indicator. Acesta conține două coloane tip și post. „type” definește 16 tipuri de personalitate, iar „post „definește comentariul din aceste 16 tipuri de individ personalizat.

1. Încărcarea datelor și descrierea datelor

# Încărcarea setului de date
data_df = pd.read_csv(„data/mbti_1.csv”)
data_df.head()

2. Curățarea și preprocesarea datelor

După încărcarea datelor, trebuie să aflăm dacă datele conțin valoarea NA, dacă valoarea NA din setul de date, o vom elimina.

# Eliminarea valorilor na din dataframe
def data_na_value_cleaning(data):
print(„\nAnainte de curățare, Data Shape : „, data.shape)
print(„\nAnainte de a elimina valorile nule: – – – – – – – – – -„)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(„După eliminarea valorilor nule: – – – – – – – – – – -„)
print(data.isna().sum())
print(„\nDupă curățare, Data Shape : „, data.shape)
return data

Pentru că datele noastre în nu au valori NA. Prin urmare, niciun rând nu a fost eliminat. Acum, verificăm dacă există valori duplicate în setul de date.

# Eliminarea valorilor duplicate
def duplicate_content_removal(data, col, ini_row):
print(„\nAnainte de a elimina valorile duplicate, numărul de date era : „, ini_row)
duplicate_count = data.duplicate().sum()
print(„\nNumărul de duplicate: „, duplicate_count)

description_data = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(„\nReducerea totală a datelor : „, (ini_row – cleaned_row))
print(„\nDupă eliminarea duplicatelor, numărul de date este :”, cleaned_row)
else:
print(„\nDataset doesn’t content any duplicate data.”)
return list(description_data)

posts = duplicate_content_removal(data_df, ‘posts’, data_df.shape)

Acum, ca parte a procesului de curățare, vom elimina legăturile și semnele de punctuație. De asemenea, pentru o pregătire mai bună, vom lua în considerare doar cuvintele, nu și cuvintele numerice și alfanumerice. Vom elimina cuvintele de oprire pentru o mai bună înțelegere și acuratețe a modelului.

def remove_link_punc(string):
# eliminarea legăturilor
temp_string = re.sub(‘http?://(?:||||(?:%))+”, ‘ ‘, string)

# eliminarea a tot ce este în afară de literele englezești a-z
regex = re.compile(”’)
temp_string = regex.sub(‘ ‘, temp_string)

# eliminarea spațiilor în plus
clean_string = re.sub(‘ +”, ‘ ‘, temp_string).lower()

return clean_string

Perioada următoare metoda data_cleaning

def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content)))):
if content !=”””:
# Tokenizarea sentințelor folosind biblioteca NLTK
for each_sent in sent_tokenize(str(content)):
if each_sent != „”:
temp_sent =
# Îndepărtarea legăturii și a punctuației
each_sent = remove_link_punc(each_sent.lower())

# Îndepărtarea cuvintelor de oprire și aplicarea lematizării
pentru fiecare cuvânt din each_sent.split():
if each_word not in stop_words and len(each_word)>= 3:
temp_sent.append(lemmatizer.lemmatizeze(each_word))

# Se ia doar dacă lungimea listei de cuvinte este mai mare decât egală cu 5
if len(temp_sent) >= 5:
sentences.append(temp_sent)
return sentences

sent_corpus = data_cleaning(posts)

Încercăm să obținem fiecare cuvânt dintr-o propoziție.

# Sentence words stats
len_count =
for l in sent_corpus:
len_count.append(len(l))

print(„Total number of Sentences : „, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)

După curățarea și preprocesarea datelor, datele arată ca fiecare cuvânt dintr-o linte. Fiecare listă este reprezentarea unei propoziții. Genism word2vec necesită pentru instruire un format de „listă de liste” în care fiecare document este conținut într-o listă și fiecare listă conține liste de jetoane din acel document.

3. Antrenarea modelului

Acum vom antrena modelul word2vec folosind biblioteca Gensim cu propriul nostru set de date.

model = Word2Vec(sentences=sent_corpus, size=200, window=4, min_count=1, workers=4)

sentences : unde putem trece setul nostru de date pregătit care este sent_corpus

size : Dimensiunea formei vectoriale generate pentru fiecare cuvânt, în mod implicit dimensiunea este 100.

window : Distanța maximă dintre cuvântul curent și cel prezis în cadrul unei propoziții, valoarea implicită este 5

min_count : Ignoră toate cuvintele în care frecvența fiecărui cuvânt este mai mică decât min_count, valoarea implicită este 5. Deoarece am dorit să adăugăm toate cuvintele din corpus, deci valoarea pe care am furnizat-o este 1.

workers : Folosește atâtea fire pentru a antrena modelul. Valoarea implicită este 3

sg : Utilizat pentru a alege algoritmul de instruire: 1 pentru skip-gram; 0 pentru CBOW. În mod implicit, CBOW este utilizat pentru instruire.

În sistemul meu a durat aproximativ 38 de secunde 395702 propoziții. Timpul de instruire depinde de cerințele sistemului.

4. Cuvânt de formă vectorială

După ce se termină instruirea modelului. Putem merge pentru a obține forma vectorizată a fiecărui cuvânt. Există două metode pentru a obține forma vectorială. Forma vectorului va fi 200 în funcție de dimensiunea dată.

# Obțineți forma vectorială a cuvântului rege
model.wv.get_vector(‘rege’)

Sau

# O altă modalitate de a obține forma vectorială a cuvântului2vec
model.wv.word_vec(‘rege’)

5. Asemănarea și distanța dintre două cuvinte

Vom furniza două liste de cuvinte: „rege”, „bărbat” într-o listă și „regină”, „femeie” în altă listă. Vom încerca să aflăm cât de mult se aseamănă aceste două liste de cuvinte.

# Lista de similaritate a cuvintelor
model.wv.n_similarity(,)

Aici vom căuta, care este distanța dintre două cuvinte. tipuri de cuvinte similare vor avea o distanță mai mică.

# Distanța dintre două cuvinte
model.wv.distance(‘king’,’queen’)

Dacă vrem să obținem similar, atunci putem folosi codul de mai jos.

# Cuvânt similar pentru king
model.wv.similar_by_word(‘king’)

6. Alte tehnici care utilizează word2Vec

# Scoateți unul din lista de cuvinte
model.wv.doesnt_match()

Aceasta ne va ajuta să găsim cuvintele impare prezente într-o listă.

# evaluarea perechilor de cuvinte
model.wv.evaluate_word_pairs(‘data/SimLex-999/SimLex-999_2.txt’,)

Aceasta ne va ajuta să evaluăm perechile de cuvinte

# Analogia cuvintelor din lista de cuvinte
model.wv.evaluate_word_analogies(‘data/questions-words.txt’)

Acest lucru va fi util pentru analogia cuvintelor

7. Încărcarea modelului instruit

Dacă avem nevoie să folosim modelul instruit, care poate fi realizat folosind codul de mai jos.

# Loading google pre-train model
from gensim import models

models.KeyedVectors.load_word2vec_format(‘data/GoogleNews-vectors-negative300.bin’, binary=True)

Aici am încercat să încarc modelul pre-antrenat de Google. Putem descărca din link. Acest model este, de asemenea, foarte puternic și antrenat pe un set de date uriaș.

Pentru mai multe detalii despre implementare, puteți arunca o privire la codul meu pe github.

Mulțumesc pentru lectură, vă rog să mă anunțați dacă există întrebări sau îndoieli. Voi fi bucuros să vă răspund la întrebări.

Leave a Reply