Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Word2vecin Toteuttaminen | Sanaesitykset
Johdatus NLP:hen

bookWord2vecin 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:

12345678
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') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
copy

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ä.

12345678
from 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)
copy

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.

Note
Lisätietoa

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:

Angles

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:

12345678910
from 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)
copy

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.

question mark

Mikä malli soveltuu paremmin harvinaisten sanojen käsittelyyn korpuksessa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

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

bookWord2vecin 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:

12345678
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') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
copy

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ä.

12345678
from 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)
copy

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.

Note
Lisätietoa

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:

Angles

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:

12345678910
from 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)
copy

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.

question mark

Mikä malli soveltuu paremmin harvinaisten sanojen käsittelyyn korpuksessa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3
some-alt