Implementing Word2Vec with Gensim Library in Python

Introduktion

Människor har en naturlig förmåga att förstå vad andra människor säger och vad de ska säga som svar. Denna förmåga utvecklas genom att konsekvent interagera med andra människor och samhället under många år. Språket spelar en mycket viktig roll för hur människor interagerar. Språk som människor använder för interaktion kallas naturliga språk.

Reglerna för olika naturliga språk är olika. Det finns dock en sak som är gemensam för de naturliga språken: flexibilitet och utveckling.

Naturliga språk är mycket mycket flexibla. Anta att du kör bil och din vän säger ett av dessa tre yttranden: ”Stanna”, ”Stanna bilen”, ”Halt”. Du förstår genast att han ber dig att stanna bilen. Detta beror på att naturliga språk är extremt flexibla. Det finns flera sätt att säga en sak på.

En annan viktig aspekt av naturliga språk är att de ständigt utvecklas. För några år sedan fanns det till exempel ingen term som ”Google it”, som syftar på att söka efter något på Googles sökmotor. Naturliga språk är ständigt under utveckling.

Tvärtom följer datorspråk en strikt syntax. Om du vill be en dator att skriva ut något på skärmen finns det ett särskilt kommando för det. Uppgiften för Natural Language Processing är att få datorer att förstå och generera mänskligt språk på ett sätt som liknar människans.

Detta är en enorm uppgift och det finns många hinder. Den här videoföreläsningen från University of Michigan innehåller en mycket bra förklaring till varför NLP är så svårt.

I den här artikeln kommer vi att implementera Word2Vec-tekniken för ordinbäddning som används för att skapa ordvektorer med Pythons Gensim-bibliotek. Men innan vi hoppar direkt till kodningsavsnittet ska vi först kortfattat gå igenom några av de mest använda ordinbäddningsteknikerna, tillsammans med deras för- och nackdelar.

Word Embedding Approaches

En av anledningarna till att Natural Language Processing är ett svårt problem att lösa är det faktum att datorer, till skillnad från människor, bara kan förstå siffror. Vi måste representera ord i ett numeriskt format som är begripligt för datorerna. Word embedding avser numeriska representationer av ord.

Flera metoder för word embedding finns för närvarande och alla har sina för- och nackdelar. Vi kommer att diskutera tre av dem här:

  1. Bag of Words
  2. TF-IDF Scheme
  3. Word2Vec

Bag of Words

The bag of words approach is one of the simplest word embedding approaches. Följande är steg för att generera ordinbäddningar med hjälp av metoden bag of words.

Vi kommer att se de ordinbäddningar som genereras med hjälp av metoden bag of words med hjälp av ett exempel. Anta att du har en korpus med tre meningar.

  • S1 = Jag älskar regn
  • S2 = Regn regn gå bort
  • S3 = Jag är borta

För att omvandla ovanstående meningar till motsvarande ordinbäddningsrepresentationer med hjälp av metoden bag of words måste vi utföra följande steg:

Bemärk att för S2 har vi lagt till 2 i stället för ”rain” i ordboken; detta beror på att S2 innehåller ”rain” två gånger.

Fördelar och nackdelar med ordsäckar

Omgången med ordsäckar har både för- och nackdelar. Den största fördelen med metoden bag of words är att man inte behöver en mycket stor korpus av ord för att få bra resultat. Du kan se att vi bygger en mycket grundläggande modell med tre meningar. Beräkningsmässigt är en bag of words-modell inte särskilt komplex.

En stor nackdel med bag of words-metoden är att vi måste skapa enorma vektorer med tomma utrymmen för att representera ett tal (sparse matrix), vilket förbrukar minne och utrymme. I exemplet ovan hade vi bara tre meningar. Ändå kan du se tre nollor i varje vektor.

Föreställ dig en korpus med tusentals artiklar. I ett sådant fall kan antalet unika ord i en ordbok vara tusentals. Om ett dokument innehåller 10 % av de unika orden kommer motsvarande inbäddningsvektor ändå att innehålla 90 % nollor.

Ett annat stort problem med metoden bag of words är att den inte upprätthåller någon kontextinformation. Den bryr sig inte om i vilken ordning orden förekommer i en mening. Den behandlar till exempel meningarna ”Bottle is in the car” och ”Car is in the bottle” lika, vilket är helt olika meningar.

En typ av metod med ordsäckar, så kallade n-gram, kan hjälpa till att upprätthålla förhållandet mellan ord. N-gram avser en sammanhängande sekvens av n ord. Exempelvis är 2-gram för meningen ”Du är inte lycklig” ”Du är”, ”är inte” och ”inte lycklig”. Även om n-grams tillvägagångssättet kan fånga relationer mellan ord, växer storleken på funktionsuppsättningen exponentiellt med för många n-grams.

TF-IDF-schema

TF-IDF-schemat är en typ av bag-words tillvägagångssätt där man i stället för att lägga till nollor och ettor i inbäddningsvektorn lägger man till flytande tal som innehåller mer användbar information jämfört med nollor och ettor. Tanken bakom TF-IDF-systemet är att ord som har en hög frekvens av förekomst i ett dokument och en lägre frekvens av förekomst i alla andra dokument är mer avgörande för klassificering.

TF-IDF är en produkt av två värden: Termfrekvens (TF) och omvänd dokumentfrekvens (IDF).

Termfrekvens avser antalet gånger ett ord förekommer i dokumentet och kan beräknas på följande sätt:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

Om vi till exempel tittar på meningen S1 från föregående avsnitt, dvs. ”Jag älskar regn”, förekommer varje ord i meningen en gång och har därför frekvensen 1. För S2, dvs. ”rain rain go away” är frekvensen för ”rain” två, medan den för resten av orden är 1.

IDF är logaritmen av det totala antalet dokument dividerat med antalet dokument där ordet förekommer, och kan beräknas på följande sätt:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

Till exempel är IDF-värdet för ordet ”rain” 0,1760, eftersom det totala antalet dokument är 3 och rain förekommer i 2 av dem, därför är log(3/2) 0,1760. Om man däremot tittar på ordet ”love” i den första meningen förekommer det i ett av de tre dokumenten och därför är dess IDF-värde log(3), vilket är 0,4771.

Fördelar och nackdelar med TF-IDF

Tyvärr är TF-IDF en förbättring jämfört med det enkla tillvägagångssättet med ordsäckar och ger bättre resultat för vanliga NLP-uppgifter, men de övergripande för- och nackdelarna är fortfarande desamma. Vi måste fortfarande skapa en enorm sparsam matris, vilket också kräver mycket mer beräkning än den enkla metoden med bag of words.

Word2Vec

Den <a target=”_blank rel=”nofollow””” href=”https://en.wikipedia.org/wiki/Word2vec”>Word2Vec-inbäddningsmetoden, som har utvecklats av Tomas Mikolov, anses vara den senaste tekniken. Word2Vec använder djupinlärning och neurala nätverksbaserade tekniker för att omvandla ord till motsvarande vektorer på ett sådant sätt att de semantiskt likartade vektorerna ligger nära varandra i N-dimensionellt utrymme, där N avser vektorns dimensioner.

Word2Vec ger en del häpnadsväckande resultat. Word2Vecs förmåga att upprätthålla semantisk relation återspeglas av ett klassiskt exempel där om man har en vektor för ordet ”kung” och man tar bort den vektor som representeras av ordet ”man” från ”kung” och lägger till ”kvinnor” till den, får man en vektor som ligger nära vektorn ”drottning”. Denna relation representeras vanligen som:

King - Man + Women = Queen

Word2Vec-modellen finns i två varianter: Skip Gram-modellen och Continuous Bag of Words Model (CBOW).

I Skip Gram-modellen förutsägs kontextorden med hjälp av basordet. Om man till exempel ger en mening ”Jag älskar att dansa i regnet” kommer Skip Gram-modellen att förutsäga ”love” och ”dance” om ordet ”to” används som indata.

Tvärtom kommer CBOW-modellen att förutsäga ”to” om kontextorden ”love” och ”dance” används som indata till modellen. Modellen lär sig dessa relationer med hjälp av djupa neurala nätverk.

Fördelar och nackdelar med Word2Vec

Word2Vec har flera fördelar jämfört med bag of words och IF-IDF-schemat. Word2Vec behåller den semantiska betydelsen av olika ord i ett dokument. Kontextinformationen går inte förlorad. En annan stor fördel med Word2Vec-metoden är att storleken på inbäddningsvektorn är mycket liten. Varje dimension i inbäddningsvektorn innehåller information om en aspekt av ordet. Vi behöver inte enorma sparsamma vektorer, till skillnad från metoderna bag of words och TF-IDF.

Anmärkning: De matematiska detaljerna om hur Word2Vec fungerar innebär en förklaring av neurala nätverk och softmax-sannolikhet, vilket ligger utanför den här artikelns räckvidd. Om du vill förstå de matematiska grunderna för Word2Vec kan du läsa den här artikeln: https://arxiv.org/abs/1301.3781

Word2Vec in Python with Gensim Library

I det här avsnittet kommer vi att implementera Word2Vec-modellen med hjälp av Pythons Gensim-bibliotek. Följ dessa steg:

Skapa korpus

Vi diskuterade tidigare att för att skapa en Word2Vec-modell behöver vi en korpus. I verkliga tillämpningar skapas Word2Vec-modeller med hjälp av miljarder dokument. Googles Word2Vec-modell tränas till exempel med hjälp av 3 miljoner ord och fraser. För enkelhetens skull kommer vi dock att skapa en Word2Vec-modell med hjälp av en enda Wikipedia-artikel. Vår modell kommer inte att vara lika bra som Googles. Även om den är tillräckligt bra för att förklara hur Word2Vec-modellen kan implementeras med hjälp av Gensim-biblioteket.

För att vi ska kunna sammanfatta Wikipediaartiklar måste vi hämta dem. För att göra det kommer vi att använda ett par bibliotek. Det första biblioteket som vi behöver ladda ner är biblioteket Beautiful Soup, som är ett mycket användbart Python-verktyg för webbskrapning. Utför följande kommando i kommandotolken för att ladda ner verktyget Beautiful Soup.

$ pip install beautifulsoup4

Ett annat viktigt bibliotek som vi behöver för att analysera XML och HTML är biblioteket lxml. Utför följande kommando i kommandotolken för att ladda ner lxml:

$ pip install lxml

Artikeln vi ska skrapa är Wikipedias artikel om artificiell intelligens. Låt oss skriva ett Pythonskript för att skrapa artikeln från Wikipedia:

I skriptet ovan hämtar vi först Wikipediaartikeln med hjälp av metoden urlopen i klassen request i biblioteket urllib. Därefter läser vi artikelns innehåll och analyserar det med hjälp av ett objekt i klassen BeautifulSoup. Wikipedia lagrar artikelns textinnehåll i p-taggar. Vi använder find_all-funktionen i BeautifulSoup-objektet för att hämta allt innehåll från artikelns stycke-taggar.

Slutligt sammanfogar vi alla stycken och lagrar den skrapade artikeln i article_text-variabeln för senare användning.

Förbehandling

I det här läget har vi nu importerat artikeln. Nästa steg är att förbehandla innehållet för Word2Vec-modellen. Följande skript förbehandlar texten:

I skriptet ovan konverterar vi all text till små bokstäver och tar sedan bort alla siffror, specialtecken och extra mellanslag från texten. Efter förbehandlingen har vi bara kvar orden.

Word2Vec-modellen tränas på en samling ord. Först måste vi omvandla vår artikel till meningar. Vi använder verktyget nltk.sent_tokenize för att konvertera vår artikel till meningar. För att konvertera meningar till ord använder vi verktyget nltk.word_tokenize. Som ett sista förbehandlingssteg tar vi bort alla stoppord från texten.

När skriptet avslutar sin exekvering innehåller all_words-objektet en lista över alla ord i artikeln. Vi kommer att använda denna lista för att skapa vår Word2Vec-modell med biblioteket Gensim.

Skapa Word2Vec-modell

Med Gensim är det extremt enkelt att skapa Word2Vec-modellen. Ordlistan skickas till klassen Word2Vec i paketet gensim.models. Vi måste ange värdet för parametern min_count. Ett värde på 2 för min_count anger att endast de ord som förekommer minst två gånger i korpusen ska ingå i Word2Vec-modellen. Följande skript skapar Word2Vec-modellen med hjälp av Wikipediaartikeln som vi skrapat.

from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)

För att se ordlistan med unika ord som förekommer minst två gånger i korpusen, kör följande skript:

vocabulary = word2vec.wv.vocabprint(vocabulary)

När skriptet ovan körs kommer du att se en lista med alla unika ord som förekommer minst två gånger.

Modellanalys

Vi har lyckats skapa vår Word2Vec-modell i det förra avsnittet. Nu är det dags att utforska vad vi skapat.

Finnande av vektorer för ett ord

Vi vet att Word2Vec-modellen omvandlar ord till motsvarande vektorer. Låt oss se hur vi kan visa vektorrepresentationen för ett visst ord.

v1 = word2vec.wv

Vektorn v1 innehåller vektorrepresentationen för ordet ”artificiell”. Som standard skapas en hundradimensionell vektor av Gensim Word2Vec. Detta är en mycket, mycket mindre vektor jämfört med vad som skulle ha producerats av bag of words. Om vi använder metoden med ordsäckar för att bädda in artikeln kommer längden på vektorn för varje ord att vara 1206 eftersom det finns 1206 unika ord med en minsta frekvens på 2. Om den minsta frekvensen sätts till 1 kommer storleken på vektorn med ordsäckar att öka ytterligare. Å andra sidan påverkas inte de vektorer som genereras genom Word2Vec av storleken på ordförrådet.

Finnande av liknande ord

Förut sa vi att kontextuell information om orden inte går förlorad med Word2Vec-metoden. Vi kan verifiera detta genom att hitta alla ord som liknar ordet ”intelligence”.

Ta en titt på följande skript:

sim_words = word2vec.wv.most_similar('intelligence')

Om du skriver ut sim_words-variabeln till konsolen kommer du att se de ord som liknar ”intelligence” mest enligt nedan:

Från utmatningen kan du se de ord som liknar ”intelligence” tillsammans med deras likhetsindex. Ordet ”ai” är det ord som är mest likt ”intelligence” enligt modellen, vilket faktiskt är logiskt. På samma sätt förekommer ord som ”mänsklig” och ”artificiell” ofta tillsammans med ordet ”intelligens”. Vår modell har framgångsrikt fångat dessa relationer med hjälp av en enda Wikipedia-artikel.

Slutsats

I den här artikeln har vi implementerat en Word2Vec-modell för inbäddning av ord med Pythons Gensim-bibliotek. Vi gjorde detta genom att skrapa en Wikipedia-artikel och byggde vår Word2Vec-modell med artikeln som korpus. Vi gick också kortfattat igenom de vanligaste metoderna för ordinbäddning tillsammans med deras för- och nackdelar som en jämförelse med Word2Vec.

Jag föreslår att du skapar en egen Word2Vec-modell med hjälp av en textkorpus och ser om du kan få bättre resultat jämfört med metoden bag of words.

Lämna ett svar

Din e-postadress kommer inte publiceras.