How to train word2vec model using gensim library

Mi a word embedding?

A word embedding a szöveg megértésének folyamata gépi tanulási algoritmusok segítségével, azt is mondjuk, hogy a word embedding egy megtanult reprezentáció a szöveghez, ahol a dokumentumban lévő szó kontextusát, szemantikai és szintaktikai hasonlóságát, valamint a korpuszban lévő más szavak közötti kapcsolatot rögzíti.

Ez a megközelítés kulcsfontosságú a természetes nyelvfeldolgozási problémák megoldásához a gépi tanulás és a mélytanulási algoritmusok segítségével. Alapvetően a szóbeágyazás a szavak vektoros reprezentációja. A szavak távolságának vagy pozíciójának kiszámításával reprezentálja a jelentéssel bíró szavakat, mondatokat, bekezdéseket vagy dokumentumokat.

A szóbeágyazásnak eddig számos technikáját vezették be. Általában azt mondjuk, hogy a szóbeágyazásnak két típusa van –

  • Statikus szóbeágyazás
  • Kontextuális szóbeágyazás

1. Statikus szóbeágyazás: A hagyományos módszerek, mint például a Skip-Gram és a Continuous Bag-of-Words statikus beágyazást tanulnak a szavakat sűrű vektorba fordító keresőtáblák betanításával. A statikus beágyazás közvetlenül hasznos a lexikai szemantikai feladat megoldására.

Probléma: Nem tudja feloldani a többértelmű szavak többértelműségét. Például amikor egy szó két különböző mondatban többféle jelentést képvisel, akkor a Skip-Gram vagy a BOW módszerek kudarcot vallanak.

2. Kontextuális szóbeágyazás: A kontextualizált szavak beágyazásának célja a szó szemantikájának különböző kontextusokban való rögzítése a poliszémák és a szavak kontextusfüggő természetének kezelése érdekében. Az LSTM, a kétirányú LSTM stb. modell segít a szavak vektoros formájának kinyerésében.

Word2Vec modell: A Word2Vec egy módszer egy ilyen statikus szóbeágyazás megkonstruálására. Ezt két módszerrel érte el Skip Gram és Common Bag of Words (CBOW) segítségével neurális hálózatok segítségével. Tomas Mikolov fejlesztette ki 2013-ban a Google-nál.

Miért van rájuk szükségünk?

Tegyük fel, hogy az alábbi mondatokkal rendelkezünk:

“Szeretek Jupyterben kódolni.” és “Szeretek Pycharmban kódolni.”

Mindkét mondat nagyon közel áll egymáshoz. Ha felépítünk egy kimerítő szókincset (nevezzük V-nek), akkor V = {I, love, enjoy, coding, in, Jupyter, Pycharm} lesz. Ha egy forró kódolást választunk. Nem leszünk képesek a pontos jelentést kapni, mivel a love, enjoy, coding minden szót ugyanúgy kezelünk, míg a love és enjoy és nagyon közel vannak egymáshoz.

A motivációnk az, hogy a hasonló kontextusú szavak nagyon közel legyenek a térbeli pozícióhoz. Matematikailag a koszinusz távolság határozza meg, hogy két szó milyen közel van egymáshoz. A legközelebbi szó koszinusz távolsága vagy az angyal koszinusza közel 0 lesz, a legtávolabbi szóé pedig közel 1.

Hogyan működik a Word2Vec?

A Word2Vec modell két algoritmuson futhat –

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

CBOW modell: Ez a módszer az egyes szavak kontextusát veszi bemenetként, és megpróbálja megjósolni a kontextusnak megfelelő szót. A célszó előrejelzése során megtanuljuk a célszó vektorreprezentációját. Bemenetként több szó lesz az ablakméretnek megfelelően (5 szó), de kimenetként egy szót ad vissza.

Nézzük mélyebben az architektúrát:

Skip-Gram modell: Ez egy másik algoritmus a Word2Vec számára. Éppen ellentétes a CBOW modellel. A modell egy szót fogad el bemenetként, de az ablakméretnek megfelelően több szót ad vissza.

A Word Embedding megvalósítása a Gensim Word2Vec modellel:

Itt lépésről lépésre ismertetem, hogyan képezzük a word2vec modellt a Gensim segítségével. Adatállomány, amit a Kaggle platformról gyűjtöttem össze. Ez az adatkészlet a Myers-Briggs Type Indicator nyilvános adataiból származik. Két oszlopot tartalmaz típus és poszt. A “type” 16 személyiségtípust határoz meg, a “post” pedig a 16 személyiségtípusból származó megjegyzést határozza meg.

1. Az adatok betöltése és leírása

# Az adatállomány betöltése
data_df = pd.read_csv(“data/mbti_1.csv”)
data_df.head()

2. Adattisztítás és előfeldolgozás

Az adatok betöltése után meg kell találnunk, hogy az adatok tartalmaznak-e NA értéket, ha NA érték van az adathalmazon belül, akkor töröljük.

# Na értékek eltávolítása az adatkeretből
def data_na_value_cleaning(data):
print(“\nBefore cleaning, Data Shape : “, data.shape)
print(“\nNulla értékek eltávolítása előtt: – – – – – – – – – – – -“)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(“Null értékek eltávolítása után: – – – – – – – – – – – -“)
print(data.isna().sum())
print(“\nTisztítás után, Data Shape : “, data.shape)
return data

Mivel adatainkban nincsenek NA értékek. Tehát egyetlen sort sem távolítottunk el. Most ellenőrizzük, hogy vannak-e duplikált értékek az adatállományban.

# Duplikált értékek eltávolítása
def duplicate_content_removal(data, col, ini_row):
print(“\nBefore removing duplicates, number of data was : “, ini_row)
duplicate_count = data.duplikált().sum()
print(“\nDuplikátumok száma: “, duplikátum_szám)

leírás_adatok = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(“\nTotal data reduction : “, (ini_row – cleaned_row))
print(“\nA duplikátumok eltávolítása után az adatok száma :”, cleaned_row)
else:
print(“\nAz adatállomány nem tartalmaz duplikált adatokat.”)
return list(description_data)

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

Most a tisztítási folyamat részeként eltávolítjuk a linkeket és az írásjeleket. Továbbá a jobb képzés érdekében csak a szavakat fogjuk figyelembe venni, nem a szám- és alfanumerikus szavakat. A modell jobb megértése és pontossága érdekében eltávolítjuk a stopszavakat.

def remove_link_punc(string):
# linkek eltávolítása
temp_string = re.sub(‘http?://(?:|||(?:%))+’, ‘ ‘, string)

# az a-z angol betűk kivételével mindent eltávolít
regex = re.compile(”’)
temp_string = regex.sub(‘ ‘ ‘, temp_string)

# az extra szóközök eltávolítása
clean_string = re.sub(‘ +’, ‘ ‘ ‘, temp_string).lower()

return clean_string

Következő módszer data_cleaning

def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content))):
if content !=””:
# Mondatok tokenizálása NLTK könyvtár használatával
for each_sent in sent_tokenize(str(content)):
if each_sent != “”:
temp_sent =
# Link és írásjelek eltávolítása
each_sent = remove_link_punc(each_sent.lower())

# Stopszavak eltávolítása és lemmatizáció alkalmazása
for each_word in each_sent.split():
if each_word not in stop_words and len(each_word)>= 3:
temp_sent.append(lemmatizer.lemmatize(each_word))

# Only taking word list length is greater than equals to 5
if len(temp_sent) >= 5:
sentences.append(temp_sent)
return sentences

sent_corpus = data_cleaning(posts)

Megpróbáljuk megszerezni minden egyes szót egy mondatban.

# mondatszavak statisztikája
len_count =
for l in sent_corpus:
len_count.append(len(l))

print(“Összes mondat száma : “, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)

A tisztítás és az adatok előfeldolgozása után az adatok úgy néznek ki, hogy minden szó egy szösz. Minden lista egy mondat reprezentációja. A Genism word2vec a képzéshez “listák listája” formátumot igényel, ahol minden dokumentumot egy lista tartalmaz, és minden lista az adott dokumentum tokenjeinek listáit tartalmazza.

3. Modellképzés

Most a word2vec modellt a Gensim könyvtár segítségével a saját adatállományunkkal képezzük.

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

sentences : ahol átadhatjuk az elkészített adathalmazunkat, ami a sent_corpus

size : Az egyes szavak generált vektorformájának dimenziója, alapértelmezés szerint a méret 100-as.

window : Maximális távolság az aktuális és a megjósolt szó között egy mondaton belül, az alapértelmezett érték 5

min_count : Az összes olyan szó figyelmen kívül hagyása, ahol az egyes szavak gyakorisága kisebb, mint a min_count, az alapértelmezett érték 5. Mivel a korpusz összes szavát hozzá akartuk adni, ezért az általunk megadott érték 1.

workers : Ennyi szálat használ a modell edzésére. Az alapértelmezett érték 3

sg : A képzési algoritmus kiválasztására szolgál: 1 a skip-gram esetében; 0 a CBOW esetében. Alapértelmezés szerint a CBOW-t használja a képzéshez.

A rendszeremben körülbelül 38 másodpercig tartott 395702 mondat. A képzési idő a rendszerkövetelményektől függ.

4. Vektorforma szó

A modellképzés befejezése után. Elmehetünk az egyes szavak vektorizált formáját megszerezni. A vektoros forma kinyerésére két módszer létezik. A vektor alakja a megadott méretnek megfelelően 200 lesz.

# Get vector form of word king
model.wv.get_vector(‘king’)

Or

# Egy másik módszer a szó vektorizált formájának kinyerésére2vec
model.wv.word_vec(‘king’)

5. Két szó közötti hasonlóság és távolság

Megadunk két szólistát: ‘király’,’férfi’ az egyik listában és ‘királynő’,’nő’ a másik listában. Megpróbáljuk kideríteni, hogy mennyire hasonlít ez a két lista szavakra.

# List of word similarity
model.wv.n_hasonlóság(,)

Itt megnézzük, mekkora a távolság két szó között.Hasonló jellegű szavaknak kisebb lesz a távolsága.

# Távolság két szó között
model.wv.distance(‘király’,’királynő’)

Ha hasonlót szeretnénk, akkor az alábbi kódot használhatjuk.

# Similar word for king
model.wv.similar_by_word(‘king’)

6. Egyéb technikák word2Vec használatával

# Odd one out of list of words
model.wv.doesnt_match()

Ez segít nekünk megtalálni a listában jelenlévő páratlan szavakat.

# szópárok kiértékelése
model.wv.evaluate_word_pairs(‘data/SimLex-999/SimLex-999_2.txt’,)

Ez segít nekünk a szópár kiértékelésében

# Szóanalógia a szavak listájából
model.wv.evaluate_word_analogies(‘data/questions-words.txt’)

Ez hasznos lesz a szóanalógia

7. Betanított modell betöltése

Ha szükségünk van a betanított modell használatára, amit az alábbi kóddal érhetünk el.

# Google előre betanított modell betöltése
from gensim import models

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

Itt próbáltam betölteni a Google előre betanított modelljét. Letölthetjük a linkről. Ez a modell is nagyon erős és hatalmas adathalmazon képzett.

A megvalósítás további részleteiért megnézheti a kódomat a githubon.

Köszönöm az olvasást, kérem, szóljon, ha kérdés vagy kétség merül fel. Szívesen válaszolok a kérdéseidre.

Leave a Reply