Sådan træner du word2vec-modellen ved hjælp af gensim-biblioteket

Hvad er word embedding?

Word embedding er en proces til forståelse af teksten ved hjælp af maskinlæringsalgoritmer, vi siger også, at word embedding er en lært repræsentation for tekst, hvor den fanger ordets kontekst i et dokument, semantisk og syntaktisk lighed samt forholdet mellem andre ord i korpus.

Denne tilgang rummer nøglen til at løse problemerne med naturlig sprogbehandling ved hjælp af maskinlæring og dybe læringsalgoritmer. Dybest set er ordindlejring en vektorrepræsentation af ord. Ved at beregne afstanden eller placeringen af ord repræsenterer den betydningsord, sætninger, afsnit eller dokumenter.

Der er flere teknikker til ordindlejring er blevet introduceret indtil nu. Generelt siger vi, at der er to typer af ordindlejring –

  • Statisk ordindlejring
  • Kontekstuel ordindlejring

1. Statisk indlejring af ord: Traditionelle metoder som Skip-Gram og Continuous Bag-of-Words lærer statisk indlejring ved at træne opslagstabeller, der oversætter ord til tætte vektorer. Statisk indlejring er direkte anvendelig til løsning af leksikalsk semantikopgave.

Problem: Kan ikke løse tvetydigheder for polysemiske ord. Når et ord f.eks. repræsenterer flere betydninger i to forskellige sætninger, mislykkes Skip-Gram- eller BOW-metoderne.

2. Kontekstuel ordindlejring: Kontekstualiseret ordindlejring har til formål at indfange ords semantik i forskellige kontekster for at løse problemet med polysemer og ords kontekstafhængige karakter. LSTM, Bi-directional LSTM osv. model hjælper med at få vektorformen af ord.

Word2Vec-model: Word2Vec-model: Word2Vec er en metode til at konstruere en sådan statisk indlejring af ord. Dette er blevet opnået ved hjælp af to metoder Skip Gram og Common Bag of Words (CBOW) ved hjælp af neurale netværk. Den blev udviklet af Tomas Mikolov i 2013 hos Google.

Hvorfor har vi brug for dem?

Lad os sige, at vi har nedenstående sætninger.

“Jeg elsker at kode i Jupyter.” og “Jeg nyder at kode i Pycharm”.

Både sætninger er meget tæt på hinanden. Hvis vi opbygger et udtømmende ordforråd (lad os kalde det V), vil det have V = {Jeg, elsker, nyder, kodning, i, Jupyter, Pycharm}. Hvis vi går med én varm kodning. Vi vil ikke være i stand til at få den nøjagtige betydning, da love, enjoy, coding hvert ord bliver behandlet som det samme, mens love og enjoy og meget tæt på hinanden.

Vores motiv er at have ord med lignende kontekst vil være meget tæt rumlig position. Matematisk set vil cosinusafstanden identificere, hvor tæt to ord er på hinanden. Nærmeste ords cosinusafstand eller cosinus af englen vil være tæt på 0, og for det fjerneste ord vil den være tæt på 1.

Hvordan fungerer Word2Vec?

Word2Vec-modellen kan køre på to algoritmer –

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

CBOW-modellen: Denne metode tager konteksten for hvert ord som input og forsøger at forudsige det ord, der svarer til konteksten. I forbindelse med forudsigelsen af målordet lærer vi vektorrepræsentationen af målordet. Som input vil der være flere ord som pr. vinduesstørrelse (5 ord), men den vil returnere ét ord som output.

Lad os se dybere arkitektur:

Skip-Gram-model: Dette er en anden algoritme for Word2Vec. Den er lige modsat af CBOW-modellen. Modellen vil tage et ord som input, men den vil returnere flere ord som pr. vinduesstørrelse.

Implementering af ordindlejring med Gensim Word2Vec Model:

Her vil jeg forklare trin for trin, hvordan man træner word2vec model ved hjælp af Gensim. Datasæt, jeg har indsamlet fra Kaggle-platformen. Dette datasæt i fra Myers-Briggs Type Indicator offentlige data. Det indeholder to kolonner type og post. “type” definerer 16 personlighedstyper og “post “definerer kommentar fra disse 16 typer af personliggjort individ.

1. Indlæsning af data og databeskrivelse

# Indlæsning af datasættet
data_df = pd.read_csv(“data/mbti_1.csv”)
data_df.head()

2. Rensning og forbehandling af data

Når dataene er indlæst, skal vi finde ud af, om dataene indeholder NA-værdi, hvis NA-værdi i datasættet, vil vi droppe den.

# Fjernelse af na-værdier fra dataframe
def data_na_value_cleaning(data):
print(“\nFor rensning, Data Shape : “, data.shape)
print(“\nFra før fjernelse af nulværdier: – – – – – – – – – – -“)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(“Efter fjernelse af nulværdier: – – – – – – – – – – – -“)
print(data.isna().sum())
print(“\nEfter rensning, Data Shape : “, data.shape)
return data

Da vores data i ikke har nogen NA-værdier. Så ingen rækker er blevet fjernet. Nu kontrollerer vi, om der er nogen dubletværdier i datasættet.

# Fjernelse af dubletværdier
def duplicate_content_removal(data, col, ini_row):
print(“\nHvor dubletter blev fjernet, var antallet af data : “, ini_row)
duplicate_count = data.duplicated().sum()
print(“\nAntal dubletter: “, duplicate_count)

description_data = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(“\nTotal datareduktion : “, (ini_row – cleaned_row))
print(“\nEfter fjernelse af dubletter er antallet af data :”, cleaned_row)
else:
print(“\nDatasættet indeholder ingen dubletter.”)
return list(description_data)

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

Nu vil vi som en del af rensningsprocessen fjerne links og tegnsætning. For bedre træning vil vi også kun tage hensyn til ord og ikke til tal og alfanumeriske ord. Vi vil fjerne stopord for at opnå en bedre modelforståelse og nøjagtighed.

def remove_link_punc(string):
# fjerne links
temp_string = re.sub(‘http?://(?:|||(?:%))+’, ‘ ‘, string)

# fjernelse af alt andet end a-z engelske bogstaver
regex = re.compile(”)
temp_string = regex.sub(‘ ‘ ‘, temp_string)

# fjernelse af ekstra mellemrum
clean_string = re.sub(‘ +’, ‘ ‘ ‘, temp_string).lower()

return clean_string

Næste metode data_cleaning

def data_cleaning(content):
sentences =
for idx in tqdm(range(len(len(content)))):
if content !=””:
# Tokenisering af sætninger ved hjælp af NLTK-biblioteket
for each_sent in sent_tokenize(str(content)):
if each_sent != “”:
temp_sent =
# Fjernelse af link og tegnsætning
each_sent = remove_link_punc(each_sent.lower())

# Fjernelse af stopord og anvendelse af lemmatisering
for each_word i each_sent.split():
if each_word not in stop_words and len(each_word)>= 3:
temp_sent.append(lemmatizer.lemmatize(each_word))

# Kun tage ordliste-længde er større end lig med 5
if len(temp_sent) >= 5:
sentences.append(temp_sent)
return sentences

sent_corpus = data_cleaning(posts)

Forsøger at få hvert ord i en sætning.

# Sætningsord statistik
len_count =
for l in sent_corpus:
len_count.append(len(l))

print(“Samlet antal sætninger : “, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)

Efter rensning og forbehandling af data, ser data ud som hvert ord i en lint. Hver liste er repræsentation af en sætning. Genism word2vec kræver et format af “liste af lister” til træning, hvor hvert dokument er indeholdt i en liste, og hver liste indeholder lister over tokens i det pågældende dokument.

3. Træning af model

Nu skal vi træne word2vec-modellen ved hjælp af Gensim-biblioteket med vores eget datasæt.

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

sentences : hvor vi kan videregive vores forberedte datasæt, som er sent_corpus

size : Dimensionen af den genererede vektorform af hvert ord, som standard er størrelsen 100.

window : Maksimal afstand mellem det aktuelle og det forudsagte ord inden for en sætning, standardværdien er 5

min_count : Ignorer alle de ord, hvor frekvensen af hvert ord er mindre end min_count, standardværdien er 5. Da vi ønskede at tilføje alle ord i korpus, så værdien vi gav er 1.

workers : Bruger disse mange tråde til at træne modellen. Standardværdien er 3

sg : Bruges til at vælge træningsalgoritmen: 1 for skip-gram; 0 for CBOW. Som standard bruges CBOW til træning.

I mit system tog det ca. 38 sekunder 395702 sætninger. Træningstiden afhænger af systemkravene.

4. Vektorform ord

Når modeltræningen er afsluttet. Vi kan gå til at få vektoriseret form af hvert ord. Der er to metoder til at få vektorformen. Vektorens form vil være 200 som pr. given størrelse.

# Hent vektorform af ordet king
model.wv.get_vector(‘king’)

Or

# En anden måde at få vektoriseret form af ordet2vec
model.wv.word_vec(‘king’)

5. Lighed og afstand mellem to ord

Vi vil give to lister med ordene “konge”, “mandlig” i den ene liste og “dronning”, “kvindelig” i den anden liste. Vi vil forsøge at finde ud af, hvor meget de to ord på listen ligner hinanden.

# Liste over ords lighed
model.wv.n_similarity(,)

Her vil vi se, hvad afstanden mellem to ord er.Lignende slags ord vil have mindre afstand.

# Afstand mellem to ord
model.wv.distance(‘king’,’queen’)

Hvis vi ønsker at få lignende, så kan vi bruge nedenstående kode.

# Lignende ord for king
model.wv.similar_by_word(‘king’)

6. Andre teknikker ved hjælp af word2Vec

# Ulige en ud fra listen over ord
model.wv.doesnt_match()

Dette vil hjælpe os med at finde ulige ord, der findes i en liste.

# evaluering af ordpar
model.wv.evalu_word_pairs(‘data/SimLex-999/SimLex-999_2.txt’,)

Dette vil hjælpe os med at evaluere ordparret

# Ordanalogi fra listen over ord
model.wv.evaluate_word_analogies(‘data/questions-words.txt’)

Dette vil være nyttigt til ordanalogi

7. Indlæsning af trænet model

Hvis vi har brug for at bruge trænet model, hvilket kan opnås ved hjælp af nedenstående kode.

# Indlæsning af google pre-train model
fra gensim import models

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

Her har jeg forsøgt at indlæse google pre-trained model. Vi kan downloade fra link. Denne model er også meget kraftfuld og trænet på enorme datasæt.

For flere detaljer om implementeringen kan du tage et kig på min kode på github.

Tak for at læse, lad mig venligst hvis spørgsmål eller tvivl er der. Jeg vil være glad for at besvare dine spørgsmål.

Leave a Reply