Jak trénovat word2vec model pomocí knihovny gensim

Co je word embedding?

Word embedding je proces porozumění textu pomocí algoritmů strojového učení, také říkáme, že word embedding je naučená reprezentace pro text, kde zachycuje kontext slova v dokumentu, sémantickou a syntaktickou podobnost a také vztah mezi ostatními slovy v korpusu.

Tento přístup je klíčem k řešení problémů zpracování přirozeného jazyka pomocí strojového učení a algoritmu hlubokého učení. V podstatě je vkládání slov vektorovou reprezentací slov. Výpočtem vzdálenosti nebo polohy slov reprezentuje význam slov, vět, odstavců nebo dokumentů.

Dosud bylo představeno několik technik vkládání slov. Obecně říkáme, že existují dva typy vkládání slov –

  • Statické vkládání slov
  • Kontextové vkládání slov

1. Statické vkládání slov: Tradiční metody, jako jsou Skip-Gram a Continuous Bag-of-Words, se statické vkládání učí trénováním vyhledávacích tabulek, které překládají slova do hustého vektoru. Statické vkládání je přímo užitečné pro řešení úlohy lexikální sémantiky.

Problém: Nelze řešit nejednoznačnosti u víceslovných slov. Například když slovo představuje více významů ve dvou různých větách, pak metody Skip-Gram nebo BOW selžou.

2. Kontextové vkládání slov: Cílem kontextového vkládání slov je zachytit sémantiku slova v různých kontextech a řešit tak problém polysémie a kontextové závislosti slov. Model LSTM, obousměrný LSTM atd. pomáhá získat vektorovou podobu slov.

Model Word2Vec: Word2Vec je metoda pro konstrukci takového statického vložení slov. Toho bylo dosaženo pomocí dvou metod Skip Gram a Common Bag of Words (CBOW) s pomocí neuronových sítí. Vyvinul ji Tomáš Mikolov v roce 2013 ve společnosti Google.

Proč je potřebujeme?

Řekněme, že máme následující věty:

„Rád kóduji v Jupyteru.“ a „Rád kóduji v Pycharmu.“

Obě věty jsou si velmi blízké. Pokud sestavíme vyčerpávající slovník (říkejme mu V), bude mít V = {I, love, enjoy, coding, in, Jupyter, Pycharm}. Pokud zvolíme jedno horké kódování. Nebudeme schopni získat přesný význam, protože love, enjoy, coding každé slovo je považováno za stejné, zatímco love a enjoy a velmi blízko sebe.

Naším motivem je, že slova s podobným kontextem budou mít velmi blízkou prostorovou polohu. Matematicky se pomocí kosinové vzdálenosti určí, jak blízko jsou si dvě slova. Kosinusová vzdálenost nejbližšího slova neboli kosinus anděla bude blízký 0 a pro nejvzdálenější bude blízký 1.

Jak funguje Word2Vec?

Model Word2Vec může pracovat na dvou algoritmech –

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

ModelCBOW: Tato metoda bere jako vstup kontext každého slova a snaží se předpovědět slovo odpovídající kontextu. V procesu předpovídání cílového slova se učíme vektorovou reprezentaci cílového slova. Na vstupu bude více slov podle velikosti okna (5 slov), ale jako výstup vrátí jedno slovo.

Podívejme se hlouběji na architekturu:

Skip-Gram model: Tento další algoritmus pro Word2Vec. Je pravým opakem modelu CBOW. Model vezme jako vstup jedno slovo, ale vrátí více slov podle velikosti okna.

Implementace vkládání slov pomocí modelu Gensim Word2Vec:

Zde vysvětlím krok za krokem, jak trénovat model word2vec pomocí Gensimu. Dataset jsem získal z platformy Kaggle. Tento dataset z veřejných dat Myers-Briggs Type Indicator. Obsahuje dva sloupce typ a příspěvek. „type“ definuje 16 typů osobnosti a „post „definuje komentář z těchto 16 typů osobnosti jedince.

1. Načtení dat a jejich popis

# Načtení datové sady
data_df = pd.read_csv(„data/mbti_1.csv“)
data_df.head()

2. Čištění a předběžné zpracování dat

Po načtení dat je třeba zjistit, zda data neobsahují hodnotu NA, pokud je hodnota NA v datovém souboru, vypustíme ji.

# Odstranění hodnot na z datového rámce
def data_na_value_cleaning(data):
print(„\nPřed čištěním, Tvar dat : „, data.shape)
print(„\nPřed odstraněním nulových hodnot: – – – – – – – – -„)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(„Po odstranění nulových hodnot: – – – – – – – – -„)
print(data.isna().sum())
print(„\nPo vyčištění, tvar dat : „, data.shape)
return data

Jako naše data v nemají žádné hodnoty NA. Nebyly tedy odstraněny žádné řádky. Nyní zkontrolujeme, zda v datasetu nejsou duplicitní hodnoty.

# Odstranění duplicitních hodnot
def duplicate_content_removal(data, col, ini_row):
print(„\nPřed odstraněním duplicit byl počet dat : „, ini_row)
duplicate_count = data.duplicated().sum()
print(„\nPočet duplikátů: „, duplicate_count)

description_data = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(„\nTotal data reduction : „, (ini_row – cleaned_row))
print(„\nPo odstranění duplicit je počet dat :“, cleaned_row)
else:
print(„\nDatová sada neobsahuje žádná duplicitní data.“)
return list(description_data)

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

Nyní v rámci čištění odstraníme odkazy a interpunkci. Také pro lepší trénink budeme brát v úvahu pouze slova, nikoli čísla a alfanumerická slova. Pro lepší pochopení a přesnost modelu odstraníme stopwords.

def remove_link_punc(string):
# odstranění odkazů
temp_string = re.sub(‚http?://(?:|||(?:%))+‘, ‚ ‚, string)

# odstranění všeho kromě českých písmen a-z
regex = re.compile(“)
temp_string = regex.sub(‚ ‚, temp_string)

# odstranění přebytečných mezer
clean_string = re.sub(‚ +‘, ‚ ‚, temp_string).lower()

return clean_string

další metoda data_cleaning

def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content))):
if content !=““:
# Tokenizace vět pomocí knihovny NLTK
for each_sent in sent_tokenize(str(content)):
if each_sent != „“:
temp_sent =
# Odstranění odkazu a interpunkce
each_sent = remove_link_punc(each_sent.lower())

# Odstranění stopslov a použití lemmatizace
for each_word in each_sent.split():
pokud every_word není v stop_words a len(each_word)>= 3:
temp_sent.append(lemmatizer.lemmatizovat(each_word))

# Pouze pokud je délka seznamu slov větší než rovna 5
pokud len(temp_sent) >= 5:
sentences.append(temp_sent)
return sentences

sent_corpus = data_cleaning(posts)

Snažíme se získat každé slovo ve větě.

# Statistika slov ve větách
len_count =
for l in sent_corpus:
len_count.append(len(l))

print(„Celkový počet vět : „, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)

Po vyčištění a předzpracování dat vypadají data jako každé slovo v lint. Každý seznam je reprezentací věty. Genismus word2vec vyžaduje pro trénování formát „seznam seznamů“, kde je každý dokument obsažen v seznamu a každý seznam obsahuje seznamy tokenů daného dokumentu.

3. Trénování modelu

Nyní budeme trénovat model word2vec pomocí knihovny Gensim s vlastní sadou dat.

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

sentences : kde můžeme předat náš připravený dataset, kterým je sent_corpus

size : Dimenze generovaného vektorového tvaru každého slova, ve výchozím nastavení je velikost 100.

okno : Maximální vzdálenost mezi aktuálním a predikovaným slovem v rámci věty, výchozí hodnota je 5

min_count : Ignoruje všechna slova, kde je frekvence každého slova menší než min_count, výchozí hodnota je 5. Protože jsme chtěli přidat všechna slova v korpusu, tak hodnota, kterou jsme uvedli, je 1.

workers : Použije těchto mnoho vláken k trénování modelu. Výchozí hodnota je 3

sg : Slouží k výběru algoritmu pro trénování: 1 pro skip-gram; 0 pro CBOW. Ve výchozím nastavení se pro trénování používá CBOW.

V mém systému trvalo přibližně 38 sekund 395702 vět. Doba trénování závisí na požadavcích systému.

4. Vektorový tvar slova

Po dokončení trénování modelu. Můžeme přejít k získání vektorizované podoby jednotlivých slov. Existují dva způsoby, jak získat vektorovou podobu. Tvar vektoru bude 200 podle zadané velikosti.

# Získejte vektorovou podobu slova king
model.wv.get_vector(‚king‘)

Nebo

# Jiným způsobem získáme vektorovou podobu slova2vec
model.wv.word_vec(‚king‘)

5. Způsob získání vektorové podoby slova je následující. Podobnost a vzdálenost mezi dvěma slovy

Nabídneme dva seznamy slov ‚král‘,’muž‘ v jednom seznamu a ‚královna‘,’žena‘ v druhém seznamu. Pokusíme se zjistit, jak moc jsou si tato dvě slova ze seznamu podobná.

# Seznam podobnosti slov
model.wv.n_similarity(,)

Zjistíme, jaká je vzdálenost mezi dvěma slovy. podobný druh slov bude mít menší vzdálenost.

# Vzdálenost mezi dvěma slovy
model.wv.distance(‚king‘,’queen‘)

Pokud chceme získat podobné, pak můžeme použít následující kód.

# Podobné slovo pro král
model.wv.similar_by_word(‚king‘)

6. Další techniky pomocí word2Vec

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

To nám pomůže najít lichá slova přítomná v seznamu.

# vyhodnocení dvojic slov
model.wv.evaluate_word_pairs(‚data/SimLex-999/SimLex-999_2.txt‘,)

To nám pomůže tp vyhodnocení dvojice slov

# Analogie slov ze seznamu slov
model.wv.evaluate_word_analogies(‚data/questions-words.txt‘)

To bude užitečné pro analogii slov

7. Načtení natrénovaného modelu

Pokud potřebujeme použít natrénovaný model, čehož lze dosáhnout pomocí níže uvedeného kódu.

# Načtení předtrénovaného modelu google
z gensim import models

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

Zkoušel jsem načíst předtrénovaný model google. Můžeme si ho stáhnout z odkazu. Tento model je také velmi výkonný a natrénovaný na obrovském datasetu.

Pro více informací o implementaci se můžete podívat na můj kód na githubu.

Děkuji za přečtení, v případě dotazu nebo pochybností mi prosím dejte vědět. Rád vám na ně odpovím.

Leave a Reply