Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Word2Vecin Toteuttaminen | Osio
Luonnollisen Kielen Käsittely

bookWord2Vecin Toteuttaminen

Pyyhkäise näyttääksesi valikon

Ymmärrettyämme, miten Word2Vec toimii, 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 sen pilkkomisen 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 sitten jokaisen lauseen sanoiksi:

12345678
import pandas as pd emma_df = pd.read_csv( 'https://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): sanat, joita esiintyy tätä vähemmän, 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 paremmin suuriin aineistoihin ja tilanteisiin, joissa laskennallinen tehokkuus on tärkeää. Skip-gram puolestaan soveltuu 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://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 koko arvoksi 200, kontekstin ikkunan kooksi 5, ja kaikki sanat sisällytetään asettamalla min_count=1. Asettamalla sg=0 valitaan käytettäväksi CBoW-malli.

Note
Lisätietoa

Oikean upotuksen koon ja kontekstin ikkunan valinta vaatii kompromisseja. Suuremmat upotukset vangitsevat enemmän merkityksiä, mutta lisäävät laskennallista kustannusta 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 vertailla 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 siihen, kuinka samansuuntaisia vektorit ovat, riippumatta niiden pituudesta, mikä tekee siitä ihanteellisen sanamerkitysten vertailuun. Tässä on havainnollistus:

Angles

Mitä suurempi kosinietäisyys on, sitä samankaltaisempia 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ä 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://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 etsii 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 1. Luku 28

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 1. Luku 28
some-alt