Word2vecin Toteuttaminen
Kun Word2Vec-menetelmän toimintaperiaate on ymmärretty, siirrytään sen toteuttamiseen Pythonilla. Gensim-kirjasto, vankka avoimen lähdekoodin työkalu luonnollisen kielen käsittelyyn, tarjoaa suoraviivaisen toteutuksen Word2Vec-luokan kautta moduulissa gensim.models.
Datan valmistelu
Word2Vec vaatii tekstidatan tokenisoinnin, eli tekstin jakamisen listaksi listoja, joissa jokainen sisempi lista sisältää tietyn lauseen sanat. Tässä esimerkissä käytämme englantilaisen kirjailijan Jane Austenin romaania Emma korpuksena. Lataamme CSV-tiedoston, joka sisältää esikäsiteltyjä lauseita, ja jaamme jokaisen lauseen sanoiksi:
12345678import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
emma_df['Sentence'].str.split() käyttää .split()-metodia jokaiselle lauseelle 'Sentence'-sarakkeessa, jolloin jokaisesta lauseesta muodostuu sanalista. Koska lauseet on jo esikäsitelty ja sanat eroteltu välilyönneillä, .split()-metodi riittää tähän tokenisointiin.
Word2Vec-mallin kouluttaminen
Seuraavaksi keskitytään Word2Vec-mallin kouluttamiseen tokenisoidulla datalla. Word2Vec-luokka tarjoaa useita parametreja mukautusta varten. Yleisimmin käytetyt parametrit ovat:
vector_size(oletus 100): sanavektorien ulottuvuus tai koko;window(oletus 5): kontekstin ikkunan koko;min_count(oletus 5): tätä harvemmin esiintyvät sanat jätetään huomiotta;sg(oletus 0): käytettävä mallirakenne (1 = Skip-gram, 0 = CBoW).cbow_mean(oletus 1): määrittää summataanko (0) vai keskiarvoistetaanko (1) CBoW:n syötekonteksti
Mallirakenteista CBoW soveltuu suurille aineistoille ja tilanteisiin, joissa laskennallinen tehokkuus on tärkeää. Skip-gram puolestaan sopii tehtäviin, joissa tarvitaan yksityiskohtaista ymmärrystä sanayhteyksistä, erityisesti pienissä aineistoissa tai harvinaisten sanojen yhteydessä.
12345678from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() # Initialize the model model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0)
Tässä asetetaan upotuksen kooksi 200, kontekstin ikkunan kooksi 5, ja kaikki sanat sisällytetään asettamalla min_count=1. Asettamalla sg=0 valitaan CBoW-malli.
Oikean upotuksen koon ja kontekstin ikkunan valinta vaatii kompromisseja. Suuremmat upotukset vangitsevat enemmän merkityksiä, mutta lisäävät laskentatehoa ja ylisovittamisen riskiä. Pienemmät kontekstin ikkunat sopivat paremmin syntaksin havaitsemiseen, kun taas suuremmat vangitsevat paremmin semantiikkaa.
Samankaltaisten sanojen löytäminen
Kun sanat on esitetty vektoreina, niitä voidaan verrata mittaamalla niiden samankaltaisuutta. Etäisyyden käyttäminen on mahdollista, mutta vektorin suunta kantaa usein enemmän semanttista merkitystä kuin sen pituus, erityisesti sanaupotuksissa.
Kulman käyttäminen samankaltaisuusmittarina ei kuitenkaan ole kovin kätevää. Sen sijaan voidaan käyttää kahden vektorin kulman kosinia, eli kosinietäisyyttä. Sen arvot vaihtelevat välillä -1 ja 1, ja suuremmat arvot osoittavat vahvempaa samankaltaisuutta. Tämä lähestymistapa keskittyy vektorien suuntautumiseen pituudesta riippumatta, mikä tekee siitä ihanteellisen sanamerkitysten vertailuun. Tässä on havainnollistus:

Mitä suurempi kosinietäisyys, sitä samanlaisempia kaksi vektoria ovat, ja päinvastoin. Esimerkiksi, jos kahden sanavektorin kosinietäisyys on lähellä 1 (kulma lähellä 0 astetta), se osoittaa, että ne ovat läheisesti yhteydessä toisiinsa tai samankaltaisia kontekstissaan vektoriavaruudessa.
Etsitään nyt viisi sanaa, jotka ovat lähimpänä sanaa "man" kosinietäisyyden perusteella:
12345678910from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0) # Retrieve the top-5 most similar words to 'man' similar_words = model.wv.most_similar('man', topn=5) print(similar_words)
model.wv antaa pääsyn koulutetun mallin sanavektoreihin, kun taas .most_similar()-metodi löytää ne sanat, joiden upotukset ovat lähimpänä määritellyn sanan upotusta kosinietäisyyden perusteella. topn-parametri määrittää palautettavien top-N samankaltaisimpien sanojen määrän.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain how to interpret the output of the most_similar() method?
What other parameters can I adjust in the Word2Vec model for different results?
How can I use the trained model to find similarities between other words?
Awesome!
Completion rate improved to 3.45
Word2vecin Toteuttaminen
Pyyhkäise näyttääksesi valikon
Kun Word2Vec-menetelmän toimintaperiaate on ymmärretty, siirrytään sen toteuttamiseen Pythonilla. Gensim-kirjasto, vankka avoimen lähdekoodin työkalu luonnollisen kielen käsittelyyn, tarjoaa suoraviivaisen toteutuksen Word2Vec-luokan kautta moduulissa gensim.models.
Datan valmistelu
Word2Vec vaatii tekstidatan tokenisoinnin, eli tekstin jakamisen listaksi listoja, joissa jokainen sisempi lista sisältää tietyn lauseen sanat. Tässä esimerkissä käytämme englantilaisen kirjailijan Jane Austenin romaania Emma korpuksena. Lataamme CSV-tiedoston, joka sisältää esikäsiteltyjä lauseita, ja jaamme jokaisen lauseen sanoiksi:
12345678import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
emma_df['Sentence'].str.split() käyttää .split()-metodia jokaiselle lauseelle 'Sentence'-sarakkeessa, jolloin jokaisesta lauseesta muodostuu sanalista. Koska lauseet on jo esikäsitelty ja sanat eroteltu välilyönneillä, .split()-metodi riittää tähän tokenisointiin.
Word2Vec-mallin kouluttaminen
Seuraavaksi keskitytään Word2Vec-mallin kouluttamiseen tokenisoidulla datalla. Word2Vec-luokka tarjoaa useita parametreja mukautusta varten. Yleisimmin käytetyt parametrit ovat:
vector_size(oletus 100): sanavektorien ulottuvuus tai koko;window(oletus 5): kontekstin ikkunan koko;min_count(oletus 5): tätä harvemmin esiintyvät sanat jätetään huomiotta;sg(oletus 0): käytettävä mallirakenne (1 = Skip-gram, 0 = CBoW).cbow_mean(oletus 1): määrittää summataanko (0) vai keskiarvoistetaanko (1) CBoW:n syötekonteksti
Mallirakenteista CBoW soveltuu suurille aineistoille ja tilanteisiin, joissa laskennallinen tehokkuus on tärkeää. Skip-gram puolestaan sopii tehtäviin, joissa tarvitaan yksityiskohtaista ymmärrystä sanayhteyksistä, erityisesti pienissä aineistoissa tai harvinaisten sanojen yhteydessä.
12345678from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() # Initialize the model model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0)
Tässä asetetaan upotuksen kooksi 200, kontekstin ikkunan kooksi 5, ja kaikki sanat sisällytetään asettamalla min_count=1. Asettamalla sg=0 valitaan CBoW-malli.
Oikean upotuksen koon ja kontekstin ikkunan valinta vaatii kompromisseja. Suuremmat upotukset vangitsevat enemmän merkityksiä, mutta lisäävät laskentatehoa ja ylisovittamisen riskiä. Pienemmät kontekstin ikkunat sopivat paremmin syntaksin havaitsemiseen, kun taas suuremmat vangitsevat paremmin semantiikkaa.
Samankaltaisten sanojen löytäminen
Kun sanat on esitetty vektoreina, niitä voidaan verrata mittaamalla niiden samankaltaisuutta. Etäisyyden käyttäminen on mahdollista, mutta vektorin suunta kantaa usein enemmän semanttista merkitystä kuin sen pituus, erityisesti sanaupotuksissa.
Kulman käyttäminen samankaltaisuusmittarina ei kuitenkaan ole kovin kätevää. Sen sijaan voidaan käyttää kahden vektorin kulman kosinia, eli kosinietäisyyttä. Sen arvot vaihtelevat välillä -1 ja 1, ja suuremmat arvot osoittavat vahvempaa samankaltaisuutta. Tämä lähestymistapa keskittyy vektorien suuntautumiseen pituudesta riippumatta, mikä tekee siitä ihanteellisen sanamerkitysten vertailuun. Tässä on havainnollistus:

Mitä suurempi kosinietäisyys, sitä samanlaisempia kaksi vektoria ovat, ja päinvastoin. Esimerkiksi, jos kahden sanavektorin kosinietäisyys on lähellä 1 (kulma lähellä 0 astetta), se osoittaa, että ne ovat läheisesti yhteydessä toisiinsa tai samankaltaisia kontekstissaan vektoriavaruudessa.
Etsitään nyt viisi sanaa, jotka ovat lähimpänä sanaa "man" kosinietäisyyden perusteella:
12345678910from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0) # Retrieve the top-5 most similar words to 'man' similar_words = model.wv.most_similar('man', topn=5) print(similar_words)
model.wv antaa pääsyn koulutetun mallin sanavektoreihin, kun taas .most_similar()-metodi löytää ne sanat, joiden upotukset ovat lähimpänä määritellyn sanan upotusta kosinietäisyyden perusteella. topn-parametri määrittää palautettavien top-N samankaltaisimpien sanojen määrän.
Kiitos palautteestasi!