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