Gensim Tutorial – en komplet begynderguide

Gensim er beskrevet som en pakke til behandling af naturligt sprog, der laver “Topic Modeling for Humans”. Men det er praktisk talt meget mere end det. Det er en førende og en state-of-the-art pakke til behandling af tekster, arbejde med ordvektormodeller (såsom Word2Vec, FastText osv.) og til opbygning af emne-modeller.

Gensim Tutorial – A Complete Beginners Guide. Foto af Jasmin Schreiber

Indholdsfortegnelse

1. Introduktion
2. Hvad er en ordbog og et korpus?
3. Hvordan oprettes en ordbog ud fra en liste af sætninger?
4. Hvordan oprettes en ordbog ud fra en eller flere tekstfiler?
5. Hvordan oprettes et bag of words korpus i gensim?
6. Hvordan oprettes et bag of words corpus fra en ekstern tekstfil?
7. Hvordan gemmes en gensim-ordbog og et korpus på disk og indlæses igen?
8. Hvordan oprettes TFIDF-matrixen (korpus) i gensim?
9. Hvordan man bruger gensim downloader API til at indlæse datasæt?
10. Hvordan man opretter bigrammer og trigrammer ved hjælp af Phraser-modeller?
11. Hvordan man opretter emne modeller med LDA?
12. Hvordan man fortolker LDA-temamodelens output?
13. Sådan oprettes en LSI-temamodel ved hjælp af gensim?
14. Hvordan man træner Word2Vec-modellen ved hjælp af gensim?
15. Sådan opdateres en eksisterende Word2Vec-model med nye data?
16. Sådan udtrækkes ordvektorer ved hjælp af forud trænede Word2Vec- og FastText-modeller?
17. Sådan oprettes dokumentvektorer ved hjælp af Doc2Vec?
18. Hvordan man beregner lighedsmetrikker som cosinuslighed og blød cosinuslighed?
19. Hvordan man opsummerer tekstdokumenter?
20. Konklusion

Introduktion

Hvad er gensim?

Gensim er beskrevet som en pakke til behandling af naturligt sprog, der laver “Topic Modeling for Humans”. Men den er praktisk talt meget mere end det.

Hvis du ikke er bekendt med topic modeling, er det en teknik til at udtrække de underliggende emner fra store mængder tekst. Gensim leverer algoritmer som LDA og LSI (som vi vil se senere i dette indlæg) og den nødvendige sofistikering til at bygge emne-modeller af høj kvalitet.

Du kan argumentere for, at emne-modeller og ordindlejring er tilgængelige i andre pakker som scikit, R osv. Men bredden og omfanget af faciliteter til at bygge og evaluere emne-modeller er uden sidestykke i gensim, plus mange flere praktiske faciliteter til tekstbehandling.

Det er en fantastisk pakke til behandling af tekster, arbejde med ordvektormodeller (såsom Word2Vec, FastText osv.) og til at bygge emne-modeller.

En anden væsentlig fordel ved gensim er også: den lader dig håndtere store tekstfiler uden at skulle indlæse hele filen i hukommelsen.

Dette indlæg har til hensigt at give et praktisk overblik over næsten alle de vigtigste funktioner, forklaret på en enkel og letforståelig måde.

I slutningen af denne vejledning vil du vide:

  • Hvad er de centrale koncepter i gensim?
  • Hvad er ordbog og korpus, hvorfor de er vigtige, og hvor man kan bruge dem?
  • Hvordan man opretter og arbejder med ordbog og korpus?
  • Sådan indlæses og arbejdes der med tekstdata fra flere tekstfiler på en hukommelseseffektiv måde
  • Opret emne-modeller med LDA og fortolk output
  • Opret TFIDF-model, bigrammer, trigrammer, Word2Vec-model, Doc2Vec-model
  • Beregn lighedsmålinger
  • Og meget mere..

Lad os begynde.

Hvad er en ordbog og et korpus?

For at kunne arbejde med tekstdokumenter kræver Gensim, at ordene (alias tokens) konverteres til unikke id’er. For at opnå dette kan du i Gensim oprette et Dictionary objekt, der kortlægger hvert ord til et unikt id.

Vi vil se, hvordan du rent faktisk gør dette i næste afsnit.

Men hvorfor er der brug for ordbogsobjektet, og hvor kan det bruges?

Dordbogsobjektet bruges typisk til at oprette en ‘bag of words’ Corpus. Det er denne ordbog og bag-of-words (Corpus), der bruges som input til emne-modellering og andre modeller, som Gensim har specialiseret sig i.

Okay, hvilken slags tekstinput kan gensim håndtere? Inputteksten kommer typisk i 3 forskellige former:

  1. Som sætninger gemt i pythons native list-objekt
  2. Som en enkelt tekstfil, lille eller stor.
  3. I flere tekstfiler.

Nu skal du, når dit tekstinput er stort, kunne oprette ordbogsobjektet uden at skulle indlæse hele tekstfilen.

Den gode nyhed er, at Gensim lader dig læse teksten og opdatere ordbogen, én linje ad gangen, uden at indlæse hele tekstfilen i systemhukommelsen. Lad os se, hvordan du gør det i de næste 2 afsnit.

Men før vi går i gang, skal vi forstå noget NLP-jargon.

Et “token” betyder typisk et “ord”. Et ‘dokument’ kan typisk henvise til en ‘sætning’ eller et ‘afsnit’, og et ‘korpus’ er typisk en ‘samling af dokumenter som en ‘bag of words’. Det vil sige, at et korpus for hvert dokument indeholder hvert ords id og dets hyppighedstal i det pågældende dokument. Som følge heraf går information om ordenes rækkefølge tabt.

Hvis alt er klart indtil videre, så lad os få fingrene i det hele og se, hvordan man opretter ordbogen ud fra en liste af sætninger.

Hvordan opretter man en ordbog ud fra en liste af sætninger?

I gensim indeholder ordbogen et kort over alle ord (tokens) til deres unikke id.

Du kan oprette en ordbog fra et afsnit med sætninger, fra en tekstfil, der indeholder flere linjer tekst, og fra flere sådanne tekstfiler, der er indeholdt i en mappe. I det andet og tredje tilfælde vil vi gøre det uden at indlæse hele filen i hukommelsen, så ordbogen bliver opdateret, når du læser teksten linje for linje.

Lad os starte med indgangen ‘Liste af sætninger’.

Når du har flere sætninger, skal du konvertere hver sætning til en liste af ord. Listeforståelser er en almindelig måde at gøre dette på.

Som det fremgår, har ordbogen 34 unikke tokens (eller ord). Lad os se de unikke id’er for hvert af disse tokens.

Vi har med succes oprettet et Dictionary-objekt. Gensim vil bruge denne ordbog til at oprette et bag-of-words-korpus, hvor ordene i dokumenterne erstattes med deres respektive id, der leveres af denne ordbog.

Hvis du får nye dokumenter i fremtiden, er det også muligt at opdatere en eksisterende ordbog, så den indeholder de nye ord.

Hvordan oprettes en ordbog fra en eller flere tekstfiler?

Du kan også oprette en ordbog fra en tekstfil eller fra en mappe af tekstfiler.

Det nedenstående eksempel læser en fil linje for linje og bruger gensim’s simple_preprocess til at behandle en linje af filen ad gangen.

Førdelen her er, at du kan læse en hel tekstfil uden at indlæse filen i hukommelsen på én gang.

Lad os bruge en eksempel.txt-fil til at demonstrere dette.

Vi har oprettet en ordbog fra en enkelt tekstfil. Flot!

Hvordan læser vi nu en linje ad gangen fra flere filer?

Antaget, at du har alle tekstfilerne i samme mappe, skal du definere en klasse med en __iter__ metode. __iter__()-metoden skal iterere gennem alle filerne i en given mappe og give den behandlede liste over ordtokens.

Lad os definere en sådan klasse med navnet ReadTxtFiles, som tager stien til mappen, der indeholder tekstfilerne, ind. Jeg bruger denne mappe med sportsfodbolddokumenter som input.

Dette blogindlæg giver et godt overblik for at forstå begrebet iteratorer og generatorer.

Hvordan opretter man et bag of words corpus i gensim?

Nu ved du, hvordan du opretter en ordbog fra en liste og fra en tekstfil.

Det næste vigtige objekt, du skal gøre dig bekendt med for at kunne arbejde i gensim, er korpus (en Bag of Words). Det vil sige, at det er et korpusobjekt, der indeholder ordets id og dets frekvens i hvert dokument. Du kan tænke på det som gensims ækvivalent til en Document-Term matrix.

Når du har den opdaterede ordbog, er det eneste du skal gøre for at oprette et bag of words corpus at videregive den tokeniserede liste af ord til Dictionary.doc2bow()

Lad os oprette s Corpus for en simpel liste (my_docs), der indeholder 2 sætninger.

Hvordan fortolkes ovenstående korpus?

Den (0, 1) i linje 1 betyder, at ordet med id=0 forekommer én gang i det første dokument.
Sådan betyder den (4, 4) i det andet listepunkt, at ordet med id 4 forekommer 4 gange i det andet dokument. Og så videre.

Det er jo ikke læsbart for mennesker. For at konvertere id’erne til ord skal du bruge ordbogen til at foretage konverteringen.

Lad os se, hvordan vi får de oprindelige tekster tilbage.

word_counts = , count) for id, count in line] for line in mycorpus]pprint(word_counts)#> , ]

Bemærk, ords rækkefølge går tabt. Kun ordet og dets frekvensoplysninger bevares.

6. Hvordan oprettes et bag of words corpus fra en tekstfil?

Læsning af ord fra en python-liste er ret ligetil, fordi hele teksten allerede var i hukommelsen.
Det kan dog være, at du har en stor fil, som du ikke ønsker at indlæse hele filen i hukommelsen.

Du kan importere sådanne filer én linje ad gangen ved at definere en klasse og __iter__-funktionen, der iterativt læser filen én linje ad gangen og giver et corpusobjekt. Men hvordan opretter man korpusobjektet?

Den __iter__() fra BoWCorpus læser en linje fra filen, behandler den til en liste af ord ved hjælp af simple_preprocess() og videregiver den til dictionary.doc2bow(). Kan du relatere hvordan dette ligner og adskiller sig fra ReadTxtFiles-klassen, som vi oprettede tidligere?

Bemærk også, at jeg bruger smart_open() fra smart_open-pakken, fordi, den lader dig åbne og læse store filer linje for linje fra en række forskellige kilder såsom S3, HDFS, WebHDFS, HTTP eller lokale og komprimerede filer. Det er forresten ret fedt!

Hvis du havde brugt open() til en fil i dit system, vil det også fungere perfekt fil.

Hvordan gemmer man en gensim-ordbog og et korpus på disken og indlæser dem tilbage?

Dette er ret ligetil. Se eksemplerne nedenfor.

Vi har gemt ordbøgerne og korpusobjekterne. Lad os indlæse dem igen.

Hvordan oprettes TFIDF-matrixen (korpus) i gensim?

The Term Frequency – Inverse Document Frequency(TF-IDF) er også en bag-of-words-model, men i modsætning til det almindelige korpus nedvejer TFIDF tokens (ord), der forekommer hyppigt på tværs af dokumenter.

Hvordan beregnes TFIDF?

Tf-Idf beregnes ved at gange en lokal komponent som termfrekvens (TF) med en global komponent, dvs. omvendt dokumentfrekvens (IDF), og eventuelt normalisere resultatet til en enhedslængde.

Dermed vil de ord, der forekommer hyppigt på tværs af dokumenter, blive nedvægtet.

Der findes flere variationer af formler for TF og IDF. Gensim anvender SMART Information Retrieval-systemet, som kan bruges til at implementere disse variationer. Du kan angive, hvilken formel der skal anvendes, ved at angive parameteren smartirs i TfidfModel. Se help(models.TfidfModel) for flere oplysninger.

Så, hvordan får man TFIDF-vægtene?

Derved at træne korpus med models.TfidfModel(). Anvend derefter korpus inden for de firkantede parenteser af den trænede tfidf-model. Se eksemplet nedenfor.

Bemærk forskellen i vægtene af ordene mellem det oprindelige korpus og det tfidf-vægtede korpus.

Ordene “is” og “the” forekommer i to dokumenter og blev vægtet ned. Ordet ‘denne’, der optræder i alle tre dokumenter, blev helt fjernet. Enkelt sagt får ord, der forekommer hyppigere på tværs af dokumenterne, mindre vægte.

Hvordan bruger man gensim downloader API til at indlæse datasæt?

Gensim tilbyder en indbygget API til at downloade populære tekstdatasæt og ordindlejringsmodeller.

En omfattende liste over tilgængelige datasæt og modeller vedligeholdes her.

Anvendelse af API’et til at downloade datasættet er lige så enkelt som at kalde api.load()-metoden med det rigtige data- eller modelnavn.

Det nedenstående eksempel viser, hvordan man downloader modellen “glove-wiki-gigaword-50”.

Hvordan skaber man bigrammer og trigrammer ved hjælp af Phraser-modeller?

Nu ved du, hvordan du downloader datasæt og prætrænede modeller med gensim.

Lad os downloade datasættet text8, som ikke er andet end “First 100.000.000 bytes of plain text from Wikipedia”. Derefter vil vi ud fra dette generere bigrammer og trigrammer.

Men hvad er bigrammer og trigrammer? og hvorfor er de vigtige?

I afsnit har visse ord altid en tendens til at forekomme parvis (bigram) eller i grupper af tre (trigram). Fordi de to ord tilsammen udgør den egentlige enhed. For eksempel: Ordet “fransk” henviser til sproget eller regionen, og ordet “revolution” kan henvise til den planetariske revolution. Men hvis man kombinerer dem, ‘fransk revolution’, henviser det til noget helt andet.

Det er ret vigtigt at danne bigrammer og trigrammer ud fra sætninger, især når man arbejder med bag-of-words-modeller.

Så hvordan danner man bigrammer?

Det er ret nemt og effektivt med gensims Phrases model. Den oprettede Phrases-model tillader indeksering, så du skal blot sende den oprindelige tekst (liste) til den opbyggede Phrases-model for at danne bigrammerne. Et eksempel er vist nedenfor:

Bigrammerne er klar. Kan du gætte, hvordan man danner et trigram?

Jamen, du skal blot skylle og gentage den samme procedure til output af bigrammodellen. Når du har genereret bigrammerne, kan du videregive output til at træne en ny Phrases model. Derefter skal du anvende det bigrammede korpus på den trænede trigrammodel. Er du forvirret? Se eksemplet nedenfor.

Hvordan oprettes emne-modeller med LDA?

Målet med emne-modeller er at udtrække de underliggende emner fra en given samling af tekstdokumenter. Hvert dokument i teksten betragtes som en kombination af emner, og hvert emne betragtes som en kombination af relaterede ord.

Temamodellering kan udføres ved hjælp af algoritmer som Latent Dirichlet Allocation (LDA) og Latent Semantic Indexing (LSI).

I begge tilfælde skal du angive antallet af emner som input. Emnemodellen vil til gengæld give emneord for hvert emne og det procentvise bidrag fra emnerne i hvert dokument.

Kvaliteten af emnerne afhænger i høj grad af kvaliteten af tekstbehandlingen og det antal emner, du giver algoritmen. I det tidligere indlæg om, hvordan man opbygger de bedste emne-modeller, forklares proceduren mere detaljeret. Jeg anbefaler dog, at du forstår de grundlæggende trin og fortolkningen i nedenstående eksempel.

Stræk 0: Indlæs de nødvendige pakker og importer stopord.

Stræk 1: Importer datasættet. Jeg vil bruge datasættet text8, der kan downloades ved hjælp af gensim’s downloader API.

# Step 1: Import the dataset and get the text and real topic of each news articledataset = api.load("text8")data = 

Stræk 2: Forbered de downloadede data ved at fjerne stopord og lemmatisere dem. Til Lemmatisering kræver gensim pakken pattern. Så sørg for at gøre pip install pattern i din terminal eller prompt, før du kører dette. Jeg har opsat lemmatiseringen således, at kun navneord (NN), adjektiver (JJ) og pronominer (RB) er bevaret. Fordi jeg foretrækker kun sådanne ord til at gå som emneord. Dette er et personligt valg.

Den data_processed er nu behandlet som en liste af liste af liste af ord. Du kan nu bruge dette til at oprette Dictionary og Corpus, som derefter vil blive brugt som input til LDA-modellen.

Vi har oprettet ordbogen og korpuset. Lad os opbygge en LDA-temamodel med 7 emner ved hjælp af LdaMulticore(). 7 emner er et vilkårligt valg for nu.

Den lda_model.print_topics viser, hvilke ord der har bidraget til hvilke af de 7 emner, sammen med vægtningen af ordets bidrag til det pågældende emne.

Du kan se ord som ‘også’, ‘mange’, der kommer på tværs af forskellige emner. Så jeg ville tilføje sådanne ord til stop_words-listen for at fjerne dem og yderligere afstemme emne-modellen til det optimale antal emner.

LdaMulticore() understøtter parallel behandling. Alternativt kan du også prøve at se, hvilke emner LdaModel() giver.

Hvordan fortolker man LDA-temamodellens output?

Objektet lda_model understøtter indeksering. Det vil sige, at hvis du sender et dokument (liste af ord) til lda_model, giver det 3 ting:

  1. Temaet/emnerne, som dokumentet tilhører, sammen med procentdel.
  2. Temaet/emnerne, som hvert ord i dokumentet tilhører.
  3. Temaet/emnerne, som hvert ord i det pågældende dokument tilhører, OG phi-værdierne.

Så, hvad er phi-værdi?

Phi-værdien er sandsynligheden for, at ordet tilhører det pågældende emne. Og summen af phi-værdierne for et givet ord er lig med antallet af gange, det pågældende ord optrådte i det pågældende dokument.

For eksempel i nedenstående output for det 0. dokument tilhører ordet med id=0 emne nummer 6, og phi-værdien er 3,999. Det betyder, at ordet med id=0 optrådte 4 gange i det 0. dokument.

Hvordan oprettes en LSI-temamodel ved hjælp af gensim?

Syntaksen for brug af en LSI-model svarer til, hvordan vi opbyggede LDA-modellen, bortset fra at vi vil bruge LsiModel().

Hvordan træner man Word2Vec-modellen ved hjælp af gensim?

En ordindlejringsmodel er en model, der kan levere numeriske vektorer for et givet ord. Ved hjælp af Gensim’s downloader API kan du downloade forudbyggede word embedding-modeller som word2vec, fasttext, GloVe og ConceptNet. Disse er bygget på store korpusser af almindeligt forekommende tekstdata som f.eks. wikipedia, google news osv.

Hvis du arbejder i en specialiseret niche som f.eks. tekniske dokumenter, er du måske ikke i stand til at få ordindlejringer for alle ord. Så i sådanne tilfælde er det ønskeligt at træne din egen model.

Gensim’s Word2Vec implementering lader dig træne din egen ordindlejringsmodel for et givet korpus.

Vi har trænet og gemt en Word2Vec-model for vores dokument. Men når der kommer et nyt datasæt, vil du gerne opdatere modellen, så den tager højde for nye ord.

Hvordan opdaterer man en eksisterende Word2Vec-model med nye data?

På en eksisterende Word2Vec-model skal du kalde build_vocab() på det nye datasæt og derefter kalde train()-metoden. build_vocab() kaldes først, fordi modellen skal informeres om, hvilke nye ord den kan forvente i det indkommende korpus.

Hvordan udtrækkes ordvektorer ved hjælp af forud trænede Word2Vec- og FastText-modeller?

Vi har lige set, hvordan vi får ordvektorerne til den Word2Vec-model, vi netop har trænet. Men gensim giver dig mulighed for at downloade state of the art pretrained modeller via downloader API’en. Lad os se, hvordan vi kan udtrække ordvektorerne fra et par af disse modeller.

Vi har 3 forskellige indlejringsmodeller. Du kan evaluere, hvilken der klarer sig bedst ved hjælp af den respektive models evaluate_word_analogies() på et standard analogidatasæt.

Hvordan oprettes dokumentvektorer ved hjælp af Doc2Vec?

I modsætning til Word2Vec giver en Doc2Vec-model en vektoriseret repræsentation af en gruppe af ord taget samlet som en enkelt enhed. Det er ikke et simpelt gennemsnit af ordvektorerne for ordene i sætningen.

Lad os bruge text8-datasættet til at træne Doc2Vec.

import gensimimport gensim.downloader as api# Download datasetdataset = api.load("text8")data = 

Træningsdataene for Doc2Vec skal være en liste af TaggedDocuments. For at oprette en sådan sender vi en liste af ord og et entydigt heltal som input til models.doc2vec.TaggedDocument().

Inputtet er forberedt. For at træne modellen skal du initialisere Doc2Vec-modellen, opbygge ordforrådet og endelig træne modellen.

For at få dokumentvektoren for en sætning skal du sende den som en liste af ord til infer_vector()-metoden.

Hvordan beregnes lighedsmetrikker som cosinuslighed og blød cosinuslighed?

Soft cosine similarity svarer til cosine similarity, men tager desuden hensyn til det semantiske forhold mellem ordene gennem sin vektorrepræsentation.

For at beregne soft cosines skal du bruge en ordindlejringsmodel som Word2Vec eller FastText. Først skal du beregne similarity_matrix. Derefter konverteres de indtastede sætninger til bag-of-words corpus og overføres til softcossim() sammen med lighedsmatrixen.

Nedenfor er der nogle nyttige ligheds- og afstandsmålinger baseret på ordindlejringsmodeller som fasttext og GloVe. Vi har allerede downloadet disse modeller ved hjælp af downloader-API’en.

Hvordan opsummeres tekstdokumenter?

Gensim implementerer textrank-sammenfatningen ved hjælp af summarize()-funktionen i summarization-modulet. Det eneste, du skal gøre, er at overgive tet-strengen sammen med enten outputresumeet ratio eller det maksimale count antal ord i det opsummerede output.

Det er ikke nødvendigt at opdele sætningen i en tokeniseret liste, fordi gensim foretager opdelingen ved hjælp af den indbyggede split_sentences()-metode i gensim.summarization.texcleaner-modulet.

Lad os opsummere udklippet fra en ny artikel i sample.txt.

For flere oplysninger om opsummering med gensim henvises til denne vejledning.

Konklusion

Vi har dækket en masse om de forskellige funktioner i gensim og fået et godt greb om, hvordan man arbejder med og manipulerer tekster. Ovenstående eksempler bør tjene som gode skabeloner til at komme i gang og bygge videre på til forskellige NLP-opgaver. Jeg håber, at du vil finde det nyttigt og føle dig tryg ved at bruge gensim oftere i dine NLP-projekter.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.