Implementering av Word2Vec
Efter att ha förstått hur Word2Vec fungerar, går vi vidare till att implementera det med Python. Gensim-biblioteket, ett kraftfullt open source-verktyg för bearbetning av naturligt språk, erbjuder en enkel implementation via sin Word2Vec-klass i gensim.models.
Förbereda data
Word2Vec kräver att textdata tokeniseras, det vill säga delas upp i en lista av listor där varje inre lista innehåller ord från en specifik mening. I detta exempel använder vi romanen Emma av den engelska författaren Jane Austen som vårt korpus. Vi laddar en CSV-fil som innehåller förbehandlade meningar och delar sedan upp varje mening i ord:
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() tillämpar metoden .split() på varje mening i kolumnen 'Sentence', vilket resulterar i en lista med ord för varje mening. Eftersom meningarna redan har förbehandlats, med ord separerade av blanksteg, är metoden .split() tillräcklig för denna tokenisering.
Träning av Word2Vec-modellen
Nu fokuseras på att träna Word2Vec-modellen med den tokeniserade datan. Klassen Word2Vec erbjuder flera parametrar för anpassning. De vanligaste parametrarna är:
vector_size(100 som standard): dimensionen eller storleken på ordbäddarna;window(5 som standard): storleken på kontextfönstret;min_count(5 som standard): ord som förekommer färre gånger än detta ignoreras;sg(0 som standard): modellarkitektur (1 för Skip-gram, 0 för CBoW).cbow_mean(1 som standard): anger om CBoW-kontexten summeras (0) eller medelvärdesberäknas (1)
När det gäller modellarkitekturer är CBoW lämplig för större datamängder och situationer där beräkningsprestanda är avgörande. Skip-gram är däremot att föredra för uppgifter som kräver detaljerad förståelse av ordkontext, särskilt effektivt vid mindre datamängder eller när man hanterar ovanliga ord.
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)
Här sätter vi inbäddningsstorleken till 200, kontextfönstrets storlek till 5, och inkluderar alla ord genom att sätta min_count=1. Genom att sätta sg=0 valde vi att använda CBoW-modellen.
Att välja rätt inbäddningsstorlek och kontextfönster innebär avvägningar. Större inbäddningar fångar mer betydelse men ökar beräkningskostnaden och risken för överanpassning. Mindre kontextfönster är bättre på att fånga syntax, medan större är bättre på att fånga semantik.
Hitta liknande ord
När ord representeras som vektorer kan vi jämföra dem för att mäta likhet. Även om avstånd kan användas, bär riktningen hos en vektor ofta mer semantisk betydelse än dess magnitud, särskilt i ordbäddningar.
Att använda vinkeln som likhetsmått är dock inte särskilt praktiskt. Istället kan vi använda cosinus för vinkeln mellan två vektorer, även känt som cosinuslikhet. Den varierar från -1 till 1, där högre värden indikerar starkare likhet. Detta tillvägagångssätt fokuserar på hur väl vektorerna är riktade mot varandra, oavsett deras längd, vilket gör det idealiskt för att jämföra ords betydelser. Här är en illustration:

Ju högre cosinuslikhet, desto mer lika är de två vektorerna, och vice versa. Om till exempel två ordvektorer har en cosinuslikhet nära 1 (vinkeln nära 0 grader), indikerar det att de är nära relaterade eller liknande i kontext inom vektorrummet.
Låt oss nu hitta de fem mest liknande orden till ordet "man" med hjälp av cosinuslikhet:
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 ger åtkomst till ordvektorerna i den tränade modellen, medan metoden .most_similar() hittar de ord vars inbäddningar ligger närmast inbäddningen för det angivna ordet, baserat på cosinuslikhet. Parametern topn bestämmer antalet topp-N liknande ord som returneras.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 3.45
Implementering av Word2Vec
Svep för att visa menyn
Efter att ha förstått hur Word2Vec fungerar, går vi vidare till att implementera det med Python. Gensim-biblioteket, ett kraftfullt open source-verktyg för bearbetning av naturligt språk, erbjuder en enkel implementation via sin Word2Vec-klass i gensim.models.
Förbereda data
Word2Vec kräver att textdata tokeniseras, det vill säga delas upp i en lista av listor där varje inre lista innehåller ord från en specifik mening. I detta exempel använder vi romanen Emma av den engelska författaren Jane Austen som vårt korpus. Vi laddar en CSV-fil som innehåller förbehandlade meningar och delar sedan upp varje mening i ord:
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() tillämpar metoden .split() på varje mening i kolumnen 'Sentence', vilket resulterar i en lista med ord för varje mening. Eftersom meningarna redan har förbehandlats, med ord separerade av blanksteg, är metoden .split() tillräcklig för denna tokenisering.
Träning av Word2Vec-modellen
Nu fokuseras på att träna Word2Vec-modellen med den tokeniserade datan. Klassen Word2Vec erbjuder flera parametrar för anpassning. De vanligaste parametrarna är:
vector_size(100 som standard): dimensionen eller storleken på ordbäddarna;window(5 som standard): storleken på kontextfönstret;min_count(5 som standard): ord som förekommer färre gånger än detta ignoreras;sg(0 som standard): modellarkitektur (1 för Skip-gram, 0 för CBoW).cbow_mean(1 som standard): anger om CBoW-kontexten summeras (0) eller medelvärdesberäknas (1)
När det gäller modellarkitekturer är CBoW lämplig för större datamängder och situationer där beräkningsprestanda är avgörande. Skip-gram är däremot att föredra för uppgifter som kräver detaljerad förståelse av ordkontext, särskilt effektivt vid mindre datamängder eller när man hanterar ovanliga ord.
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)
Här sätter vi inbäddningsstorleken till 200, kontextfönstrets storlek till 5, och inkluderar alla ord genom att sätta min_count=1. Genom att sätta sg=0 valde vi att använda CBoW-modellen.
Att välja rätt inbäddningsstorlek och kontextfönster innebär avvägningar. Större inbäddningar fångar mer betydelse men ökar beräkningskostnaden och risken för överanpassning. Mindre kontextfönster är bättre på att fånga syntax, medan större är bättre på att fånga semantik.
Hitta liknande ord
När ord representeras som vektorer kan vi jämföra dem för att mäta likhet. Även om avstånd kan användas, bär riktningen hos en vektor ofta mer semantisk betydelse än dess magnitud, särskilt i ordbäddningar.
Att använda vinkeln som likhetsmått är dock inte särskilt praktiskt. Istället kan vi använda cosinus för vinkeln mellan två vektorer, även känt som cosinuslikhet. Den varierar från -1 till 1, där högre värden indikerar starkare likhet. Detta tillvägagångssätt fokuserar på hur väl vektorerna är riktade mot varandra, oavsett deras längd, vilket gör det idealiskt för att jämföra ords betydelser. Här är en illustration:

Ju högre cosinuslikhet, desto mer lika är de två vektorerna, och vice versa. Om till exempel två ordvektorer har en cosinuslikhet nära 1 (vinkeln nära 0 grader), indikerar det att de är nära relaterade eller liknande i kontext inom vektorrummet.
Låt oss nu hitta de fem mest liknande orden till ordet "man" med hjälp av cosinuslikhet:
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 ger åtkomst till ordvektorerna i den tränade modellen, medan metoden .most_similar() hittar de ord vars inbäddningar ligger närmast inbäddningen för det angivna ordet, baserat på cosinuslikhet. Parametern topn bestämmer antalet topp-N liknande ord som returneras.
Tack för dina kommentarer!