Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Implementering af Word2Vec | Ordindlejringer
Introduktion til NLP med Python

bookImplementering af Word2Vec

Efter at have forstået, hvordan Word2Vec fungerer, fortsætter vi med at implementere det ved hjælp af Python. Gensim-biblioteket, et robust open source-værktøj til behandling af naturligt sprog, tilbyder en ligetil implementering gennem klassen Word2Vec i gensim.models.

Forberedelse af data

Word2Vec kræver, at tekstdataene tokeniseres, dvs. opdeles i en liste af lister, hvor hver indre liste indeholder ord fra en bestemt sætning. I dette eksempel bruger vi romanen Emma af den engelske forfatter Jane Austen som vores korpus. Vi indlæser en CSV-fil med forbehandlede sætninger og opdeler derefter hver sætning i ord:

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() anvender .split()-metoden på hver sætning i kolonnen 'Sentence', hvilket resulterer i en liste af ord for hver sætning. Da sætningerne allerede er forbehandlet, med ord adskilt af mellemrum, er .split()-metoden tilstrækkelig til denne tokenisering.

Træning af Word2Vec-modellen

Nu fokuseres der på at træne Word2Vec-modellen ved hjælp af de tokeniserede data. Word2Vec-klassen tilbyder en række parametre til tilpasning. De mest anvendte parametre er dog følgende:

  • vector_size (standard 100): dimensionalitet eller størrelsen på word embeddings;
  • window (standard 5): størrelsen på kontekstvinduet;
  • min_count (standard 5): ord, der forekommer færre gange end dette antal, ignoreres;
  • sg (standard 0): valg af modelarkitektur (1 for Skip-gram, 0 for CBoW).
  • cbow_mean (standard 1): angiver om CBoW-indgangskonteksten summeres (0) eller gennemsnittes (1)

Med hensyn til modelarkitekturer er CBoW velegnet til større datasæt og situationer, hvor beregningseffektivitet er afgørende. Skip-gram foretrækkes derimod til opgaver, der kræver detaljeret forståelse af ordkontekster, særligt effektiv ved mindre datasæt eller når der arbejdes med sjældne ord.

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

Her sætter vi embedding-størrelsen til 200, kontekstvinduesstørrelsen til 5, og inkluderer alle ord ved at sætte min_count=1. Ved at sætte sg=0 har vi valgt at bruge CBoW-modellen.

Note
Læs Mere

Valg af den rette embedding-størrelse og kontekstvindue indebærer afvejninger. Større embeddings fanger mere betydning, men øger beregningsomkostningerne og risikoen for overfitting. Mindre kontekstvinduer er bedre til at fange syntaks, mens større er bedre til at fange semantik.

At finde lignende ord

Når ord er repræsenteret som vektorer, kan vi sammenligne dem for at måle lighed. Selvom afstand kan bruges, bærer retningen af en vektor ofte mere semantisk betydning end dens størrelse, især i word embeddings.

Det er dog ikke så praktisk at bruge vinklen direkte som et lighedsmetrik. I stedet kan vi bruge cosinus til vinklen mellem to vektorer, også kendt som cosinus-lighed. Den spænder fra -1 til 1, hvor højere værdier indikerer stærkere lighed. Denne metode fokuserer på, hvor ensrettede vektorerne er, uanset deres længde, hvilket gør den ideel til at sammenligne ords betydning. Her er en illustration:

Angles

Jo højere cosinus-lighed, desto mere ligner de to vektorer hinanden, og omvendt. For eksempel, hvis to ordvektorer har en cosinus-lighed tæt på 1 (vinklen tæt på 0 grader), indikerer det, at de er nært beslægtede eller ligner hinanden i kontekst inden for vektorrummet.

Lad os nu finde de 5 mest lignende ord til ordet "man" ved hjælp af cosinus-lighed:

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 giver adgang til ordvektorerne i den trænede model, mens metoden .most_similar() finder de ord, hvis indlejringer ligger tættest på indlejringen af det angivne ord, baseret på cosinus-lighed. Parameteren topn bestemmer antallet af top-N lignende ord, der returneres.

question mark

Hvilken model er bedre til at håndtere sjældne ord i et korpus?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 3.45

bookImplementering af Word2Vec

Stryg for at vise menuen

Efter at have forstået, hvordan Word2Vec fungerer, fortsætter vi med at implementere det ved hjælp af Python. Gensim-biblioteket, et robust open source-værktøj til behandling af naturligt sprog, tilbyder en ligetil implementering gennem klassen Word2Vec i gensim.models.

Forberedelse af data

Word2Vec kræver, at tekstdataene tokeniseres, dvs. opdeles i en liste af lister, hvor hver indre liste indeholder ord fra en bestemt sætning. I dette eksempel bruger vi romanen Emma af den engelske forfatter Jane Austen som vores korpus. Vi indlæser en CSV-fil med forbehandlede sætninger og opdeler derefter hver sætning i ord:

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() anvender .split()-metoden på hver sætning i kolonnen 'Sentence', hvilket resulterer i en liste af ord for hver sætning. Da sætningerne allerede er forbehandlet, med ord adskilt af mellemrum, er .split()-metoden tilstrækkelig til denne tokenisering.

Træning af Word2Vec-modellen

Nu fokuseres der på at træne Word2Vec-modellen ved hjælp af de tokeniserede data. Word2Vec-klassen tilbyder en række parametre til tilpasning. De mest anvendte parametre er dog følgende:

  • vector_size (standard 100): dimensionalitet eller størrelsen på word embeddings;
  • window (standard 5): størrelsen på kontekstvinduet;
  • min_count (standard 5): ord, der forekommer færre gange end dette antal, ignoreres;
  • sg (standard 0): valg af modelarkitektur (1 for Skip-gram, 0 for CBoW).
  • cbow_mean (standard 1): angiver om CBoW-indgangskonteksten summeres (0) eller gennemsnittes (1)

Med hensyn til modelarkitekturer er CBoW velegnet til større datasæt og situationer, hvor beregningseffektivitet er afgørende. Skip-gram foretrækkes derimod til opgaver, der kræver detaljeret forståelse af ordkontekster, særligt effektiv ved mindre datasæt eller når der arbejdes med sjældne ord.

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

Her sætter vi embedding-størrelsen til 200, kontekstvinduesstørrelsen til 5, og inkluderer alle ord ved at sætte min_count=1. Ved at sætte sg=0 har vi valgt at bruge CBoW-modellen.

Note
Læs Mere

Valg af den rette embedding-størrelse og kontekstvindue indebærer afvejninger. Større embeddings fanger mere betydning, men øger beregningsomkostningerne og risikoen for overfitting. Mindre kontekstvinduer er bedre til at fange syntaks, mens større er bedre til at fange semantik.

At finde lignende ord

Når ord er repræsenteret som vektorer, kan vi sammenligne dem for at måle lighed. Selvom afstand kan bruges, bærer retningen af en vektor ofte mere semantisk betydning end dens størrelse, især i word embeddings.

Det er dog ikke så praktisk at bruge vinklen direkte som et lighedsmetrik. I stedet kan vi bruge cosinus til vinklen mellem to vektorer, også kendt som cosinus-lighed. Den spænder fra -1 til 1, hvor højere værdier indikerer stærkere lighed. Denne metode fokuserer på, hvor ensrettede vektorerne er, uanset deres længde, hvilket gør den ideel til at sammenligne ords betydning. Her er en illustration:

Angles

Jo højere cosinus-lighed, desto mere ligner de to vektorer hinanden, og omvendt. For eksempel, hvis to ordvektorer har en cosinus-lighed tæt på 1 (vinklen tæt på 0 grader), indikerer det, at de er nært beslægtede eller ligner hinanden i kontekst inden for vektorrummet.

Lad os nu finde de 5 mest lignende ord til ordet "man" ved hjælp af cosinus-lighed:

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 giver adgang til ordvektorerne i den trænede model, mens metoden .most_similar() finder de ord, hvis indlejringer ligger tættest på indlejringen af det angivne ord, baseret på cosinus-lighed. Parameteren topn bestemmer antallet af top-N lignende ord, der returneres.

question mark

Hvilken model er bedre til at håndtere sjældne ord i et korpus?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 3
some-alt