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)

# 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.

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