Sådan kommer du i gang med Word2Vec - og hvordan du får det til at fungere

Ideen bag Word2Vec er ret enkel. Vi antager, at betydningen af ​​et ord kan udledes af det firma, det holder. Dette er analogt med ordsproget, “ vis mig dine venner, og jeg fortæller, hvem du er.

Hvis du har to ord, der har meget ens naboer (hvilket betyder: den sammenhæng, hvori det bruges, er omtrent det samme), så er disse ord sandsynligvis ret ens i betydningen eller er i det mindste beslægtede. F.eks. Bruges ordene chokeret , forfærdet og forbavset normalt i en lignende sammenhæng.

Ved hjælp af denne underliggende antagelse kan du bruge Word2Vec til at overflade lignende koncepter, finde ikke-relaterede begreber, beregne lighed mellem to ord og mere!

Ned til forretning

I denne vejledning lærer du, hvordan du bruger Gensim-implementeringen af ​​Word2Vec og faktisk får det til at fungere. Jeg har længe hørt klager over dårlig præstation generelt, men det er virkelig en kombination af to ting: (1) dine inputdata og (2) dine parameterindstillinger .

Bemærk, at træningsalgoritmerne i Gensim-pakken faktisk blev porteret fra den oprindelige Word2Vec-implementering af Google og udvidet med yderligere funktionalitet.

Import og logning

Først starter vi med vores import og etablerer logføring:

# imports needed and loggingimport gzipimport gensim import logging
logging.basicConfig(format=’%(asctime)s : %(levelname)s : %(message)s’, level=logging.INFO)

Datasæt

Vores næste opgave er at finde et rigtig godt datasæt. Hemmeligheden bag at få Word2Vec til at arbejde virkelig for dig er at have masser og masser af tekstdata i det relevante domæne. For eksempel, hvis dit mål er at opbygge et følelsesleksikon, er det muligvis ikke effektivt at bruge et datasæt fra det medicinske domæne eller endda Wikipedia. Så vælg dit datasæt klogt.

Til denne vejledning skal jeg bruge data fra OpinRank-datasættet fra nogle af mine ph.d.-arbejde. Dette datasæt har fulde brugeranmeldelser af biler og hoteller. Jeg har specifikt samlet alle hotelanmeldelser i en stor fil, der er omkring 97 MB komprimeret og 229 MB ukomprimeret. Vi bruger den komprimerede fil til denne tutorial. Hver linje i denne fil repræsenterer en hotelanmeldelse.

Lad os nu se nærmere på disse data nedenfor ved at udskrive den første linje.

Du skal se følgende:

b"Oct 12 2009 \tNice trendy hotel location not too bad.\tI stayed in this hotel for one night. As this is a fairly new place some of the taxi drivers did not know where it was and/or did not want to drive there. Once I have eventually arrived at the hotel, I was very pleasantly surprised with the decor of the lobby/ground floor area. It was very stylish and modern. I found the reception's staff geeting me with 'Aloha' a bit out of place, but I guess they are briefed to say that to keep up the coroporate image.As I have a Starwood Preferred Guest member, I was given a small gift upon-check in. It was only a couple of fridge magnets in a gift box, but nevertheless a nice gesture.My room was nice and roomy, there are tea and coffee facilities in each room and you get two complimentary bottles of water plus some toiletries by 'bliss'.The location is not great. It is at the last metro stop and you then need to take a taxi, but if you are not planning on going to see the historic sites in Beijing, then you will be ok.I chose to have some breakfast in the hotel, which was really tasty and there was a good selection of dishes. There are a couple of computers to use in the communal area, as well as a pool table. There is also a small swimming pool and a gym area.I would definitely stay in this hotel again, but only if I did not plan to travel to central Beijing, as it can take a long time. The location is ok if you plan to do a lot of shopping, as there is a big shopping centre just few minutes away from the hotel and there are plenty of eating options around, including restaurants that serve a dog meat!\t\r\n"

Du kan se, at dette er en ret god, fuld gennemgang med mange ord, og det er det, vi vil have. Vi har cirka 255.000 sådanne anmeldelser i dette datasæt.

For at undgå forvirring siger Gensims Word2Vec-tutorial, at du skal sende en sekvens af sætninger som input til Word2Vec. Du kan dog faktisk videregive en hel anmeldelse som en sætning (det vil sige en meget større tekststørrelse), hvis du har mange data, og det ikke skulle gøre meget af en forskel. I sidste ende er alt, hvad vi bruger datasættet til, at hente alle tilstødende ord for et givet målord.

Læs filer på en liste

Nu hvor vi har haft en snegetop på vores datasæt, kan vi læse det på en liste, så vi kan videregive dette til Word2Vec-modellen. Bemærk i koden nedenfor, at jeg læser direkte den komprimerede fil. Jeg laver også en mild forbehandling af anmeldelserne ved hjælp af gensim.utils.simple_preprocess (line). Dette udfører nogle grundlæggende forbehandlinger såsom tokenisering, lavere bogstaver osv. Og returnerer en liste med tokens (ord). Dokumentation af denne forbehandlingsmetode kan findes på det officielle Gensim-dokumentationssted.

Uddannelse af Word2Vec-modellen

At træne modellen er ret ligetil. Du instantiate bare Word2Vec og videregive de anmeldelser, som vi læste i det foregående trin. Så vi videregiver i det væsentlige en liste over lister, hvor hver liste på hovedlisten indeholder et sæt tokens fra en brugeranmeldelse. Word2Vec bruger alle disse tokens til internt at oprette et ordforråd. Og med ordforråd mener jeg et sæt unikke ord.

Efter opbygningen af ​​ordforrådet er vi bare nødt til at ringe for train(...)at begynde at træne Word2Vec-modellen. Bag kulisserne træner vi faktisk et simpelt neuralt netværk med et enkelt skjult lag. Men vi vil faktisk ikke bruge det neurale netværk efter træning. I stedet er målet at lære vægten af ​​det skjulte lag. Disse vægte er i det væsentlige ordvektorerne, som vi prøver at lære.

Træning i Word2Vec OpinRank-datasættet tager cirka 10–15 minutter. så vær tålmodig, mens du kører din kode på dette datasæt

Den sjove del - nogle resultater!

Lad os komme til de sjove ting allerede! Da vi underviste i brugeranmeldelser, ville det være rart at se lighed med nogle adjektiver. Dette første eksempel viser et simpelt opslag af ord, der ligner ordet 'snavset'. Alt hvad vi skal gøre her er at kalde most_similarfunktionen og give ordet 'beskidt' som det positive eksempel. Dette returnerer de top 10 lignende ord.

Ooh, det ser ret godt ud. Lad os se på mere.

Svarende til høflig:

Svarende til Frankrig:

Svarende til chokeret:

Samlet set giver resultaterne faktisk mening. Alle relaterede ord har tendens til at blive brugt i samme sammenhæng for det givne forespørgselsord.

Nu kan du endda bruge Word2Vec til at beregne ligheden mellem to ord i ordforrådet ved at påkalde similarity(...)funktionen og videregive de relevante ord.

Under hætten beregner de ovennævnte tre uddrag cosinus-ligheden mellem de to angivne ord ved hjælp af ordvektorer for hver. Ud fra de ovenstående scorer, giver det mening, at dirtyer meget lig smelly, men dirtyer ulig clean. Hvis du gør en lighed mellem to identiske ord, vil scoren være 1,0, da rækkevidden af ​​cosinus-lighedsscore altid vil være mellem [0,0-1,0]. Du kan læse mere om cosinus-lighedsscore her.

Du finder flere eksempler på, hvordan du kan bruge Word2Vec i min Jupyter Notebook.

Et nærmere kig på parameterindstillingerne

To train the model earlier, we had to set some parameters. Now, let’s try to understand what some of them mean. For reference, this is the command that we used to train the model.

model = gensim.models.Word2Vec (documents, size=150, window=10, min_count=2, workers=10)

size

The size of the dense vector that is to represent each token or word. If you have very limited data, then size should be a much smaller value. If you have lots of data, its good to experiment with various sizes. A value of 100–150 has worked well for me for similarity lookups.

window

The maximum distance between the target word and its neighboring word. If your neighbor’s position is greater than the maximum window width to the left or the right, then some neighbors are not considered as being related to the target word. In theory, a smaller window should give you terms that are more related. If you have lots of data, then the window size should not matter too much, as long as its not overly narrow or overly broad. If you are not too sure about this, just use the default value.

min_count

Minimium frequency count of words. The model would ignore words that do not statisfy the min_count. Extremely infrequent words are usually unimportant, so its best to get rid of those. Unless your dataset is really tiny, this does not really affect the model.

workers

How many threads to use behind the scenes?

When should you use Word2Vec?

There are many application scenarios for Word2Vec. Imagine if you need to build a sentiment lexicon. Training a Word2Vec model on large amounts of user reviews helps you achieve that. You have a lexicon for not just sentiment, but for most words in the vocabulary.

Beyond raw unstructured text data, you could also use Word2Vec for more structured data. For example, if you had tags for a million StackOverflow questions and answers, you could find related tags and recommend those for exploration. You can do this by treating each set of co-occuring tags as a “sentence” and train a Word2Vec model on this data. Granted, you still need a large number of examples to make it work.

Source code

For at bruge denne tutorials Jupyter Notebook kan du gå til min GitHub repo og følge instruktionerne om, hvordan du får notebook'en til at køre lokalt. Jeg planlægger at uploade de foruddannede vektorer, der kan bruges til dit eget arbejde.

For at følge Kavitas artikel via e-mail, bedes du abonnere på hendes blog.

Denne artikel blev oprindeligt offentliggjort på kavita-ganesan.com