How to train word2vec model using gensim library

Mitä on sanan upottaminen?

Sanan upottaminen on prosessi, jossa tekstiä ymmärretään koneoppimisalgoritmeilla, sanomme myös, että sanan upottaminen on opittu esitys tekstille, jossa se kaappaa sanan asiayhteyden asiakirjassa, semanttisen ja syntaktisen samankaltaisuuden sekä korpuksen muiden sanojen välisen suhteen.

Tämä lähestymistapa on avain luonnollisen kielen käsittelyyn liittyvien ongelmien ratkaisemiseen koneoppimisen ja syväoppimisen algoritmien avulla. Pohjimmiltaan sanojen upottaminen on sanojen vektoriesitys. Laskemalla sanojen etäisyyttä tai sijaintia se edustaa merkityssanoja, lauseita, kappaleita tai asiakirjoja.

Sanojen upottamisen tekniikoita on tähän mennessä esitelty useita. Yleisesti sanotaan, että sanojen upottamista on kahdenlaista –

  • Static Word Embedding
  • Contextual Word Embedding

1. Staattinen sanan upottaminen: Perinteiset menetelmät, kuten Skip-Gram ja Continuous Bag-of-Words, oppivat staattisen upottamisen kouluttamalla hakutaulukoita, jotka kääntävät sanat tiheäksi vektoriksi. Staattinen upotus on suoraan hyödyllinen leksikaalisen semantiikkatehtävän ratkaisemisessa.

Obgelma: Ei voi ratkaista moniselitteisiä sanoja. Esimerkiksi kun sana edustaa useita merkityksiä kahdessa eri lauseessa, Skip-Gram- tai BOW-menetelmät epäonnistuvat.

2. Contextual Word Embedding: Kontekstisidonnaisen sanojen upottamisen tavoitteena on vangita sanan semantiikka eri yhteyksissä, jotta voidaan ratkaista monimerkityksisten sanojen ongelma ja sanojen kontekstiriippuvainen luonne. LSTM, kaksisuuntainen LSTM jne. malli auttaa saamaan sanojen vektorimuodon.

Word2Vec-malli: Word2Vec-malli: Word2Vec on menetelmä, jolla voidaan rakentaa tällainen staattinen sanojen upotus. Tämä on saavutettu käyttämällä kahta menetelmää Skip Gram ja Common Bag of Words (CBOW) neuroverkkojen avulla. Sen on kehittänyt Tomas Mikolov vuonna 2013 Googlessa.

Mihin tarvitsemme niitä?

Esitettäköön, että meillä on alla olevat lauseet.

”Rakastan koodaamista Jupyterilla.” ja ”Nautin koodaamisesta Pycharmilla.”

Kummatkin lauseet ovat hyvin lähekkäin toisiaan. Jos rakennamme tyhjentävän sanaston (sanotaan sitä V:ksi), se on V = {I, love, enjoy, coding, in, Jupyter, Pycharm}. Jos käytämme yhtä kuumaa koodausta. Emme pysty saamaan tarkkaa merkitystä, koska rakkaus, nauttia, koodaus jokainen sana käsitellään samalla tavalla, kun taas rakkaus ja nauttia ja hyvin lähellä toisiaan.

Meidän motiivimme on, että sanat, joilla on samankaltainen konteksti, ovat hyvin lähellä spatiaalista asemaa. Matemaattisesti kosinusetäisyys määrittää, kuinka lähellä kaksi sanaa ovat. Lähimmän sanan kosinusetäisyys tai enkelin kosinus on lähellä 0 ja kaukaisimman sanan kosinusetäisyys on lähellä 1.

Miten Word2Vec toimii?

Word2Vec-malli voi toimia kahdella algoritmilla –

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

CBOW-malli: Tämä menetelmä ottaa syötteenä kunkin sanan kontekstin ja yrittää ennustaa kontekstia vastaavan sanan. Ennustettaessa kohdesanaa opitaan kohdesanan vektoriesitys. Syötteenä on useita sanoja ikkunan koon mukaan (5 sanaa), mutta se palauttaa tulosteena yhden sanan.

Katsotaan arkkitehtuuria syvemmälle:

Skip-Gram-malli: Tämä toinen algoritmi Word2Vecille. Se on CBOW-mallin vastakohta. Malli ottaa syötteenä yhden sanan, mutta se palauttaa useita sanoja ikkunan koon mukaan.

Sanojen sulauttamisen toteuttaminen Gensimin Word2Vec-mallilla:

Tässä selitän askel askeleelta, miten treenataan word2vec-mallia Gensimillä. Dataset, olen kerännyt Kaggle-alustalta. Tämä tietokokonaisuus on Myers-Briggs Type Indicatorin julkisista tiedoista. Se sisältää kaksi saraketta type ja post. ”type” määrittelee 16 persoonallisuustyyppiä ja ”post” määrittelee kommentin näistä 16 persoonallisuustyypistä.

1. Datan lataaminen ja datan kuvaus

# Datan lataaminen
data_df = pd.read_csv(”data/mbti_1.csv”)
data_df.head()

2. Datan puhdistus ja esikäsittely

Datan lataamisen jälkeen on selvitettävä, sisältääkö data NA-arvoa, jos NA-arvo on datasetin sisällä, pudotamme sen pois.

# Na-arvojen poistaminen datakehyksestä
def data_na_arvojen_puhdistus(data):
print(”\nBefore cleaning, Data Shape : ”, data.shape)
print(”\nEnnen nolla-arvojen poistamista: – – – – – – – – – – -”)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(”Ennen nolla-arvojen poistamista: – – – – – – – – – – – -”)
print(data.isna().sum())
print(”\nPuhdistuksen jälkeen datan muoto : ”, data.shape)
return data

Koska datassamme ei ole NA-arvoja. Mitään rivejä ei siis ole poistettu. Nyt tarkistamme, onko Datasetissa duplikaattiarvoja.

# Duplikaattiarvojen poistaminen
def duplicate_content_removal(data, col, ini_row):
print(”\nBefore removing duplicates, number of data was : ”, ini_row)
duplicate_count = data.duplicated().sum()
print(”\nDuplikaattien määrä: ”, duplicate_count)

description_data = data.drop_duplicates()
puhdistettu_rivi = len(description_data)
if (ini_row – puhdistettu_rivi) > 0:
print(”\nTietojen kokonaismäärän väheneminen : ”, (ini_row – puhdistettu_row))
print(”\nDuplikaattien poistamisen jälkeen tietojen määrä on :”, puhdistettu_row)
else:
print(”\nDataset ei sisällä yhtään duplikaattidataa.”)
return list(description_data)

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

Poistetaan nyt osana puhdistusta linkit ja välimerkit. Lisäksi paremman harjoittelun vuoksi otamme huomioon vain sanat, emme numeroita ja aakkosnumeerisia sanoja. Poistamme stopwords mallin paremman ymmärtämisen ja tarkkuuden vuoksi.

def remove_link_punc(string):
# linkkien poistaminen
temp_string = re.sub(’http?://(?:||(?:%))+’, ’ ’, merkkijono)

# poistetaan kaikki muu paitsi a-z englanninkieliset kirjaimet
regex = re.compile(”’)
temp_string = regex.sub(’ ’, temp_string)

# poistetaan ylimääräiset välilyönnit
clean_string = re.sub(’ +’, ’ ’, temp_string).lower()

return clean_string

Seuraava metodi data_cleaning

def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content))):
if content !=””:
# Lauseiden tokenisointi NLTK-kirjastoa käyttäen
for each_sent in sent_tokenize(str(content)):
if each_sent != ””:
temp_sent =
# Linkin ja välimerkkien poisto
each_sent = remove_link_punc(each_sent.lower())

# Stop-sanojen poisto ja lemmatisoinnin soveltaminen
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))

# Otetaan vain, että sanaluettelon pituus on suurempi kuin 5
if len(temp_sent) >= 5:
sentences.append(temp_sent)
palauta lauseet

sent_korpus = data_cleaning(posts)

Yritetään saada jokainen sana lauseesta.

# Lauseen sanat stats
len_count =
for l in sent_corpus:
len_count.append(len(l))

print(”Lauseiden kokonaismäärä : ”, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)

Puhdistuksen ja datan esikäsittelyn jälkeen data näyttää jokaiselta sanalta lintissä. Jokainen lista on lauseen esitys. Genism word2vec vaatii harjoittelua varten ’list of lists’ -muodon, jossa jokainen dokumentti sisältyy listaan ja jokainen lista sisältää listoja kyseisen dokumentin tokeneista.

3. Mallin harjoittelu

Jatkossa harjoittelemme word2vec-mallia Gensim-kirjastoa käyttäen omalla aineistolla.

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

sentences : johon voimme välittää valmistelemamme datasetin, joka on sent_corpus

size : Kunkin sanan generoidun vektorimuodon ulottuvuus, oletusarvoisesti koko on 100.

window : Suurin etäisyys nykyisen ja ennustetun sanan välillä lauseen sisällä, oletusarvo on 5

min_count : Jätetään huomioimatta kaikki sanat, joissa kunkin sanan frekvenssi on pienempi kuin min_count, oletusarvo on 5. Koska halusimme lisätä kaikki korpuksen sanat, joten annoimme arvoksi 1.

workers : Käyttää niin monta säiettä mallin harjoitteluun. Oletusarvo on 3

sg : Käytetään koulutusalgoritmin valintaan: 1 skip-grammille; 0 CBOW:lle. Oletuksena koulutukseen käytetään CBOW:ta.

Systeemissäni kesti noin 38 sekuntia 395702 lausetta. Harjoitteluaika riippuu järjestelmävaatimuksista.

4. Vektorimuotoinen sana

Mallin harjoittelun jälkeen. Voimme mennä hakemaan vektoroidun muodon jokaisesta sanasta. Vektorimuodon saamiseksi on kaksi menetelmää. Vektorin muoto on 200 annetun koon mukaan.

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

Or

# Toinen tapa saada sanan vektorimuoto2vec
model.wv.word_vec(’king’)

5. Kahden sanan samankaltaisuus ja etäisyys

Tarjoamme kaksi luetteloa sanoista ’kuningas’,’miespuolinen’ toisessa luettelossa ja ’kuningatar’,’naispuolinen’ toisessa luettelossa. Yritämme selvittää, kuinka samankaltaisia nämä kaksi luettelon sanaa ovat.

# Sanojen samankaltaisuusluettelo
model.wv.n_similarity(,)

Tässä katsomme, mikä on kahden sanan välinen etäisyys.samankaltaisilla sanoilla on pienempi etäisyys.

# Kahden sanan välinen etäisyys
model.wv.distance(’kuningas’,’kuningatar’)

Jos haluamme saada samankaltaisen, niin voimme käyttää alla olevaa koodia.

# Samankaltainen sana kuninkaalle
malli.wv.similar_by_word(’king’)

6. Muita tekniikoita word2Vecin käyttämisessä

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

Tämä auttaa meitä löytämään listassa olevat parittomat sanat.

# sanaparien arviointi
model.wv.evaluate_word_pairs(’data/SimLex-999/SimLex-999_2.txt’,)

Tämä auttaa meitä arvioimaan sanaparia

# Sanojen analogia sanaluettelosta
model.wv.evaluate_word_analogies(’data/kysymykset-sanat.txt’)

Tästä on hyötyä sana-analogiaa varten

7. Koulutetun mallin lataaminen

Jos haluamme käyttää koulutettua mallia, mikä onnistuu alla olevalla koodilla.

# Googlen valmiiksi koulutetun mallin lataaminen
from gensim import models

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

Tässä yritin ladata Googlen valmiiksi koulutetun mallin. Voimme ladata linkistä. Tämä malli on myös erittäin tehokas ja koulutettu valtava dataset.

Lisätietoa toteutuksesta, voit katsoa minun koodi github.

Kiitos lukemisesta, kerro minulle, jos kysymys tai epäilys on olemassa. Vastaan mielelläni kysymyksiisi.

Leave a Reply