Gensim Tutorial – A Complete Beginners Guide

Gensim är ett paket för behandling av naturligt språk som gör ”Topic Modeling for Humans”. Men det är praktiskt taget mycket mer än så. Det är ett ledande och toppmodernt paket för att bearbeta texter, arbeta med ordvektormodeller (som Word2Vec, FastText etc.) och för att bygga ämnesmodeller.

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

Innehåll

1. Introduktion
2. Vad är ett lexikon och en korpus?
3. Hur skapar man ett lexikon från en lista med meningar?
4. Hur skapar man ett lexikon från en eller flera textfiler?
5. Hur skapar man en korpus av ord i gensim?
6. Hur skapar man en korpus av ordsäckar från en extern textfil?
7. Hur sparar man en ordbok och en korpus i gensim till disk och laddar in dem igen?
8. Hur skapar man en TFIDF-matris (korpus) i gensim?
9. Hur man använder gensim downloader API för att ladda dataset?
10. Hur man skapar bigrams och trigrams med hjälp av Phraser-modeller?
11. Hur man skapar ämnesmodeller med LDA?
12. Hur man tolkar LDA-ämnesmodellens resultat?
13. Hur man skapar en LSI-ämnesmodell med gensim?
14. Hur man tränar Word2Vec-modellen med gensim?
15. Hur uppdaterar man en befintlig Word2Vec-modell med nya data?
16. Hur extraherar man ordvektorer med hjälp av förtränade Word2Vec- och FastText-modeller?
17. Hur man skapar dokumentvektorer med hjälp av Doc2Vec?
18. Hur man beräknar likhetsmått som cosinuslikhet och mjuk cosinuslikhet?
19. Hur man sammanfattar textdokument?
20. Slutsats

Introduktion

Vad är gensim?

Gensim är ett paket för behandling av naturligt språk som gör ”Topic Modeling for Humans”. Men det är i praktiken mycket mer än så.

Om du inte är bekant med ämnesmodellering är det en teknik för att extrahera de underliggande ämnena från stora mängder text. Gensim tillhandahåller algoritmer som LDA och LSI (som vi kommer att se senare i det här inlägget) och den nödvändiga sofistikeringen för att bygga högkvalitativa ämnesmodeller.

Du kan hävda att ämnesmodeller och ordinbäddning finns tillgängliga i andra paket som scikit, R osv. Men bredden och omfattningen av faciliteter för att bygga och utvärdera ämnesmodeller saknar motstycke i gensim, plus många fler praktiska faciliteter för textbearbetning.

Det är ett utmärkt paket för att bearbeta texter, arbeta med ordvektormodeller (t.ex. Word2Vec, FastText etc.) och för att bygga ämnesmodeller.

En annan viktig fördel med gensim är också: det låter dig hantera stora textfiler utan att behöva ladda hela filen i minnet.

Detta inlägg avser att ge en praktisk översikt över nästan alla de viktigaste funktionerna, förklarat på ett enkelt och lättförståeligt sätt.

I slutet av den här handledningen kommer du att veta:

  • Vad är de centrala begreppen i gensim?
  • Vad är lexikon och korpus, varför är de viktiga och var kan man använda dem?
  • Hur man skapar och arbetar med lexikon och korpus?
  • Hur man laddar och arbetar med textdata från flera textfiler på ett minneseffektivt sätt
  • Skapa ämnesmodeller med LDA och tolka resultaten
  • Skapa TFIDF-modell, bigrams, trigrams, Word2Vec-modell, Doc2Vec-modell
  • Beräkna likhetsmått
  • och mycket mer..

Låt oss börja.

Vad är ett lexikon och en korpus?

För att kunna arbeta med textdokument kräver Gensim att orden (även kallade tokens) konverteras till unika id:er. För att uppnå detta låter Gensim dig skapa ett Dictionary objekt som mappar varje ord till ett unikt id.

Vi kommer att se hur man faktiskt gör detta i nästa avsnitt.

Men varför behövs ordboksobjektet och var kan det användas?

Objektet ordbok används typiskt sett för att skapa en korpus med ”bag of words”. Det är detta ordboksobjekt och ordsäckarna (Corpus) som används som indata till ämnesmodellering och andra modeller som Gensim specialiserar sig på.

Okej, vilken typ av textinmatning kan gensim hantera? Inmatningstexten kommer vanligtvis i 3 olika former:

  1. Som meningar som lagras i pythons infödda listobjekt
  2. Som en enda textfil, liten eller stor.
  3. I flera textfiler.

När din textinmatning är stor måste du kunna skapa ordboksobjektet utan att behöva ladda hela textfilen.

Den goda nyheten är att Gensim låter dig läsa texten och uppdatera ordboken, en rad i taget, utan att ladda hela textfilen i systemminnet. Vi ska se hur man gör det i de två följande avsnitten.

Men innan vi går in i det, ska vi förstå lite NLP-jargong.

En ”token” betyder vanligtvis ett ”ord”. Ett ”dokument” kan typiskt sett avse en ”mening” eller ett ”stycke” och en ”korpus” är typiskt sett en ”samling av dokument som en väska av ord”. Det vill säga, för varje dokument innehåller en korpus varje ords id och dess frekvens i det dokumentet. Som ett resultat av detta går information om ords ordning förlorad.

Om allt är klart så här långt, låt oss få våra händer blöta och se hur man skapar ordboken från en lista med meningar.

Hur skapar man en ordbok från en lista med meningar?

I gensim innehåller ordboken en karta över alla ord (tokens) till dess unika id.

Du kan skapa en ordbok från ett stycke med meningar, från en textfil som innehåller flera rader text och från flera sådana textfiler som finns i en katalog. I det andra och tredje fallet gör vi det utan att ladda hela filen i minnet så att ordboken uppdateras när du läser texten rad för rad.

Låt oss börja med inmatningen ”Lista av meningar”.

När du har flera meningar måste du omvandla varje mening till en lista av ord. List comprehensions är ett vanligt sätt att göra detta.

Som det står har ordboken 34 unika tokens (eller ord). Låt oss se de unika id:erna för var och en av dessa tokens.

Vi har framgångsrikt skapat ett Dictionary-objekt. Gensim kommer att använda detta lexikon för att skapa en bag-of-words korpus där orden i dokumenten ersätts med respektive id som tillhandahålls av detta lexikon.

Om du får nya dokument i framtiden är det också möjligt att uppdatera ett befintligt lexikon för att inkludera de nya orden.

Hur skapar man ett lexikon från en eller flera textfiler?

Du kan också skapa ett lexikon från en textfil eller från en katalog med textfiler.

Det nedanstående exemplet läser en fil rad för rad och använder gensims simple_preprocess för att bearbeta en rad i filen i taget.

Fördelen här är att det låter dig läsa en hel textfil utan att ladda filen i minnet på en gång.

Låt oss använda en sample.txt-fil för att demonstrera detta.

Vi har skapat en ordbok från en enda textfil. Snyggt!

Nu, hur läser man en rad i taget från flera filer?

Antagen att du har alla textfiler i samma katalog måste du definiera en klass med en __iter__ metod. __iter__()-metoden ska iterera genom alla filer i en given katalog och ge den bearbetade listan över ordtoken.

Låt oss definiera en sådan klass med namnet ReadTxtFiles, som tar in sökvägen till den katalog som innehåller textfilerna. Jag använder denna katalog med dokument om sportmat som indata.

Detta blogginlägg ger en bra översikt för att förstå begreppet iteratorer och generatorer.

Hur skapar man en korpus av ord i gensim?

Nu vet du hur man skapar en ordbok från en lista och från en textfil.

Nästa viktiga objekt som du måste bekanta dig med för att kunna arbeta i gensim är korpus (en bag of words). Det vill säga det är ett korpusobjekt som innehåller ordets id och dess frekvens i varje dokument. Du kan se det som gensims motsvarighet till en Document-Term-matris.

När du har det uppdaterade lexikonet är allt du behöver göra för att skapa en bag of words corpus att skicka den tokeniserade listan av ord till Dictionary.doc2bow()

Låt oss skapa s Corpus för en enkel lista (my_docs) som innehåller 2 meningar.

Hur tolkar vi ovanstående korpus?

Den (0, 1) i rad 1 betyder att ordet med id=0 förekommer en gång i det första dokumentet.
På samma sätt betyder (4, 4) i den andra listposten att ordet med id 4 förekommer 4 gånger i det andra dokumentet. Och så vidare.

Detta är inte läsbart för människor. För att konvertera id:erna till ord behöver du en ordbok för att göra konverteringen.

Vi ska se hur vi får tillbaka originaltexterna.

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

Märk väl att ordsordningen går förlorad. Bara ordet och dess frekvensinformation behålls.

6. Hur skapar man en korpus med ordsäckar från en textfil?

Läsning av ord från en pythonlista är ganska okomplicerat eftersom hela texten redan fanns i minnet.
Det kan dock hända att du har en stor fil som du inte vill läsa in hela filen i minnet.

Du kan importera sådana filer en rad i taget genom att definiera en klass och funktionen __iter__ som iterativt läser filen en rad i taget och ger ett korpusobjekt. Men hur skapar man korpusobjektet?

Funktionen __iter__() från BoWCorpus läser en rad från filen, bearbetar den till en lista med ord med hjälp av simple_preprocess() och överlämnar den till dictionary.doc2bow(). Kan du relatera hur detta liknar och skiljer sig från klassen ReadTxtFiles som vi skapade tidigare?

Märk också att jag använder paketet smart_open() från smart_open eftersom det låter dig öppna och läsa stora filer rad för rad från en mängd olika källor, t.ex. S3, HDFS, WebHDFS, HTTP, eller lokala och komprimerade filer. Det är förresten ganska häftigt!

Hursomhelst, om du hade använt open() för en fil i ditt system kommer det att fungera perfekt fil också.

Hur man sparar en gensim-ordbok och korpus till disken och laddar in dem tillbaka?

Det här är ganska okomplicerat. Se exemplen nedan.

Vi har sparat ordboks- och korpusobjekten. Nu laddar vi in dem igen.

Hur skapar man TFIDF-matrisen (korpus) i gensim?

Term Frequency – Inverse Document Frequency (TF-IDF) är också en bag-of-words-modell, men till skillnad från den vanliga korpusen viktar TFIDF ner tokens (ord) som förekommer ofta i olika dokument.

Hur beräknas TFIDF?

Tf-Idf beräknas genom att multiplicera en lokal komponent som termfrekvens (TF) med en global komponent, dvs. omvänd dokumentfrekvens (IDF), och eventuellt normalisera resultatet till en enhetslängd.

Som ett resultat av detta kommer de ord som förekommer ofta i dokumenten att nedviktas.

Det finns flera varianter av formler för TF och IDF. Gensim använder informationssökningssystemet SMART som kan användas för att genomföra dessa variationer. Du kan ange vilken formel som ska användas genom att ange parametern smartirs i TfidfModel. Se help(models.TfidfModel) för mer information.

Hur får man fram TFIDF-vikterna?

Genom att träna korpusen med models.TfidfModel(). Applicera sedan korpusen inom de fyrkantiga parenteserna för den tränade tfidf-modellen. Se exempel nedan.

Märk skillnaden i viktning av orden mellan den ursprungliga korpusen och den tfidf-viktade korpusen.

Vorden ”is” och ”the” förekommer i två dokument och viktades ner. Ordet ”this” som förekommer i alla tre dokumenten togs bort helt och hållet. Enkelt uttryckt får ord som förekommer oftare i dokumenten mindre vikter.

Hur använder man gensim downloader API för att ladda dataset?

Gensim har ett inbyggt API för att ladda ner populära textdataset och ordinbäddningsmodeller.

En omfattande lista över tillgängliga datamängder och modeller upprätthålls här.

Att använda API:et för att ladda ner datamängden är lika enkelt som att anropa api.load()-metoden med rätt data- eller modellnamn.

Det nedanstående exemplet visar hur man laddar ner modellen ”glove-wiki-gigaword-50”.

Hur skapar man bigrams och trigrams med hjälp av Phraser-modeller?

Nu vet du hur du laddar ner dataset och förtränade modeller med gensim.

Låt oss ladda ner datasetet text8, som inte är något annat än ”First 100,000,000 bytes of plain text from Wikipedia”. Från detta kommer vi sedan att generera bigrams och trigrams.

Men vad är bigrams och trigrams? och varför spelar de roll?

I stycken tenderar vissa ord alltid att förekomma i par (bigram) eller i grupper av tre (trigram). Eftersom de två orden tillsammans bildar den egentliga enheten. Till exempel: Ordet ”franska” hänvisar till språket eller regionen och ordet ”revolution” kan hänvisa till den planetariska revolutionen. Men om man kombinerar dem, ”fransk revolution”, hänvisar det till något helt annat.

Det är ganska viktigt att bilda bigrams och trigrams från meningar, särskilt när man arbetar med bag-of-words-modeller.

Hur skapar man då bigrams?

Det är ganska enkelt och effektivt med gensims Phrases modell. Den skapade Phrases-modellen tillåter indexering, så det är bara att skicka originaltexten (lista) till den byggda Phrases-modellen för att bilda bigrammen. Ett exempel visas nedan:

Bigrammen är klara. Kan du gissa hur man skapar ett trigram?

Ja, det är bara att skölja och upprepa samma procedur till bigrammodellens resultat. När du har genererat bigramerna kan du skicka utgången för att träna en ny Phrases modell. Tillämpa sedan den bigrammiska korpusen på den tränade trigrammodellen. Är du förvirrad? Se exemplet nedan.

Hur man skapar ämnesmodeller med LDA?

Målet med ämnesmodeller är att extrahera de underliggande ämnena från en given samling textdokument. Varje dokument i texten betraktas som en kombination av ämnen och varje ämne betraktas som en kombination av relaterade ord.

Tema-modellering kan göras med hjälp av algoritmer som Latent Dirichlet Allocation (LDA) och Latent Semantic Indexing (LSI).

I båda fallen måste du ange antalet ämnen som indata. Ämnesmodellen ger i sin tur ämnesnyckelord för varje ämne och det procentuella bidraget från ämnena i varje dokument.

Kvaliteten på ämnena är i hög grad beroende av kvaliteten på textbehandlingen och antalet ämnen som du ger algoritmen. I det tidigare inlägget om hur man bygger de bästa ämnesmodellerna förklaras förfarandet mer ingående. Jag rekommenderar dock att du förstår de grundläggande stegen och tolkningen i exemplet nedan.

Steg 0: Ladda de nödvändiga paketen och importera stoppord.

Steg 1: Importera datasetet. Jag kommer att använda datasetet text8 som kan laddas ner med hjälp av gensims nedladdnings-API.

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

Steg 2: Förbered det nedladdade datamaterialet genom att ta bort stoppord och lemmatisera det. För Lemmatisering kräver gensim paketet pattern. Se därför till att göra pip install pattern i din terminal eller prompt innan du kör detta. Jag har ställt in lemmatiseringen så att endast substantiv (NN), adjektiv (JJ) och pronomen (RB) behålls. Eftersom jag föredrar att endast sådana ord går som ämnesnyckelord. Detta är ett personligt val.

Den data_processed behandlas nu som en lista med lista med ord. Du kan nu använda den för att skapa Dictionary och Corpus, som sedan kommer att användas som indata till LDA-modellen.

Vi har skapat ordboken och korpusen. Låt oss bygga en LDA-ämnesmodell med 7 ämnen med hjälp av LdaMulticore(). 7 ämnen är ett godtyckligt val för tillfället.

lda_model.print_topics visar vilka ord som bidragit till vilket av de 7 ämnena, tillsammans med viktningen av ordets bidrag till det ämnet.

Du kan se att ord som ”also”, ”many” kommer i olika ämnen. Jag skulle därför lägga till sådana ord i stop_words-listan för att ta bort dem och ytterligare anpassa ämnesmodellen för det optimala antalet ämnen.

LdaMulticore() stöder parallell bearbetning. Alternativt kan du också försöka se vilka ämnen LdaModel() ger.

Hur tolkar man LDA Topic Model’s output?

Objektet lda_model stöder indexering. Det vill säga, om du skickar ett dokument (lista med ord) till lda_model ger det 3 saker:

  1. Tema(n) som dokumentet tillhör tillsammans med procentsats.
  2. Tema(n) som varje ord i dokumentet tillhör.
  3. Tema(n) som varje ord i dokumentet tillhör OCH phi-värdena.

Vad är phi-värdet?

Phi-värdet är sannolikheten för att ordet tillhör just det ämnet. Summan av phi-värdena för ett visst ord är lika med antalet gånger som ordet förekom i dokumentet.

I nedanstående utdata för det 0:e dokumentet hör ordet med id=0 till ämne nummer 6 och phi-värdet är 3,999. Det betyder att ordet med id=0 förekom 4 gånger i det 0:e dokumentet.

Hur skapar man en LSI-ämnesmodell med gensim?

Syntaxen för att använda en LSI-modell liknar den som vi använde för att bygga upp LDA-modellen, förutom att vi kommer att använda LsiModel().

Hur man tränar Word2Vec-modellen med gensim?

En ordinbäddningsmodell är en modell som kan tillhandahålla numeriska vektorer för ett givet ord. Med hjälp av Gensims nedladdnings-API kan du ladda ner förbyggda ordinbäddningsmodeller som word2vec, fasttext, GloVe och ConceptNet. Dessa är byggda på stora korpusar av vanligt förekommande textdata som wikipedia, google news etc.

Och om du arbetar i en specialiserad nisch, t.ex. tekniska dokument, kanske du inte kan få word embeddings för alla ord. Så i sådana fall är det önskvärt att träna en egen modell.

Gensims Word2Vecimplementation låter dig träna din egen ordinbäddningsmodell för en given korpus.

Vi har tränat och sparat en Word2Vec-modell för vårt dokument. När ett nytt dataset kommer vill du dock uppdatera modellen så att den tar hänsyn till nya ord.

Hur uppdaterar man en befintlig Word2Vec-modell med nya data?

På en befintlig Word2Vec-modell anropar du build_vocab() på det nya datasetet och anropar sedan train()-metoden. build_vocab() anropas först eftersom modellen måste få veta vilka nya ord den kan förvänta sig i den inkommande korpusen.

Hur extraherar man ordvektorer med hjälp av förtränade Word2Vec- och FastText-modeller?

Vi såg nyss hur man får fram ordvektorerna för Word2Vec-modellen som vi just tränat. I gensim kan du dock ladda ner toppmoderna förtränade modeller via API:et för nedladdare. Låt oss se hur man hämtar ordvektorerna från ett par av dessa modeller.

Vi har 3 olika inbäddningsmodeller. Du kan utvärdera vilken som presterar bäst med hjälp av respektive modells evaluate_word_analogies() på ett standarddataset för analogier.

Hur skapar man dokumentvektorer med Doc2Vec?

Till skillnad från Word2Vec ger en Doc2Vec-modell en vektoriserad representation av en grupp ord som tas kollektivt som en enda enhet. Det är inte ett enkelt genomsnitt av ordvektorerna för orden i meningen.

Låt oss använda datasetet text8 för att träna Doc2Vec.

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

Träningsdata för Doc2Vec bör vara en lista med TaggedDocuments. För att skapa en sådan skickar vi en lista med ord och ett unikt heltal som indata till models.doc2vec.TaggedDocument().

Inmatningen är förberedd. För att träna modellen måste du initialisera Doc2Vec-modellen, bygga upp vokabulären och slutligen träna modellen.

För att få fram dokumentvektorn för en mening skickar du den som en lista med ord till infer_vector()-metoden.

Hur beräknar man likhetsmått som cosinuslikhet och mjuk cosinuslikhet?

Soft cosine similarity liknar cosine similarity men tar dessutom hänsyn till det semantiska förhållandet mellan orden genom sin vektorrepresentation.

För att beräkna soft cosines behöver du en ordinbäddningsmodell som Word2Vec eller FastText. Beräkna först similarity_matrix. Konvertera sedan de ingående meningarna till bag-of-words corpus och skicka dem till softcossim() tillsammans med likhetsmatrisen.

Nedan följer några användbara likhets- och avståndsmått baserade på ordinbäddningsmodeller som fasttext och GloVe. Vi har redan laddat ner dessa modeller med hjälp av API:et för nedladdare.

Hur sammanfattar man textdokument?

Gensim implementerar textrank-sammanfattningen med hjälp av summarize()-funktionen i summarization-modulen. Allt du behöver göra är att skicka in tetsträngen tillsammans med antingen utdatasummeringen ratio eller det maximala count antalet ord i det summerade resultatet.

Det finns inget behov av att dela upp meningen i en tokeniserad lista eftersom gensim gör uppdelningen med hjälp av den inbyggda split_sentences() metoden i gensim.summarization.texcleaner modulen.

Låt oss sammanfatta utklippet från en ny artikel i sample.txt.

För mer information om sammanfattning med gensim hänvisar vi till den här handledningen.

Slutsats

Vi har täckt en hel del om de olika funktionerna i gensim och fått ett bra grepp om hur man arbetar med och manipulerar texter. Exemplen ovan bör fungera som fina mallar för att komma igång och bygga vidare på för olika NLP-uppgifter. Jag hoppas att du kommer att finna det användbart och känna dig bekväm med att använda gensim oftare i dina NLP-projekt.

Lämna ett svar

Din e-postadress kommer inte publiceras.