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.
Leave a Reply