Výukový program Gensim – úplný průvodce pro začátečníky

Gensim je označován jako balík pro zpracování přirozeného jazyka, který provádí „modelování témat pro lidi“. Prakticky je však mnohem víc než to. Je to přední a nejmodernější balík pro zpracování textů, práci se slovními vektorovými modely (například Word2Vec, FastText atd.) a pro tvorbu tematických modelů.

Učebnice Gensim – kompletní průvodce pro začátečníky. Foto: Jasmin Schreiber

Obsah

1. Úvod
2. Co je to slovník a korpus?
3. Jak vytvořit slovník ze seznamu vět?
4. Jak vytvořit slovník z jednoho nebo více textových souborů?
5. Jak vytvořit v gensimu korpus typu bag of words?
6. Jak vytvořit corpus bag of words z externího textového souboru?
7. Jak uložit slovník a corpus v gensimu na disk a načíst je zpět?
8. Jak vytvořit matici TFIDF (corpus) v gensimu?
9. Jak vytvořit corpus v gensimu? Jak použít API gensim downloader k načtení datových sad?
10. Jak vytvořit bigramy a trigramy pomocí modelů Phraser?
11. Jak vytvořit tematické modely pomocí LDA?
12. Jak interpretovat výstup tematického modelu LDA?
13. Jak vytvořit tematický model LSI pomocí programu gensim?
14. Jak trénovat model Word2Vec pomocí gensimu?
15. Jak aktualizovat stávající model Word2Vec pomocí nových dat?
16. Jak extrahovat slovní vektory pomocí předtrénovaných modelů Word2Vec a FastText?
17. Jak vytvořit vektory dokumentů pomocí Doc2Vec?
18. Jak vypočítat metriky podobnosti, jako je kosinová podobnost a měkká kosinová podobnost?
19. Jak shrnout textové dokumenty?
20. Závěr

Úvod

Co je gensim?

Gensim je označován jako balík pro zpracování přirozeného jazyka, který provádí „modelování témat pro lidi“. Ale prakticky je to mnohem víc.

Pokud modelování témat neznáte, jedná se o techniku, která umožňuje extrahovat základní témata z velkých objemů textu. Gensim poskytuje algoritmy jako LDA a LSI (které uvidíme později v tomto příspěvku) a potřebnou sofistikovanost pro vytvoření vysoce kvalitních tematických modelů.

Můžete namítnout, že tematické modely a vkládání slov jsou k dispozici v jiných balících, jako je scikit, R atd. Ale šíře a rozsah vybavení pro tvorbu a vyhodnocování tematických modelů je v gensimu nesrovnatelná, navíc má mnoho dalších pohodlných vybavení pro zpracování textu.

Je to skvělý balík pro zpracování textů, práci s vektorovými modely slov (jako Word2Vec, FastText atd.) a pro tvorbu tematických modelů.

Další významnou výhodou gensimu je: umožňuje zpracovávat velké textové soubory bez nutnosti načítat celý soubor do paměti.

Tento příspěvek si klade za cíl poskytnout praktický přehled téměř všech hlavních funkcí, vysvětlený jednoduchým a srozumitelným způsobem.

Na konci tohoto kurzu byste měli vědět:

  • Jaké jsou základní pojmy v gensimu?
  • Co je to slovník a korpus, proč jsou důležité a kde je použít?
  • Jak vytvořit slovník a korpus a jak s nimi pracovat?
  • Jak načítat a pracovat s textovými daty z více textových souborů paměťově efektivním způsobem
  • Vytvářet tematické modely pomocí LDA a interpretovat výstupy
  • Vytvářet TFIDF model, bigramy, trigramy, Word2Vec model, Doc2Vec model
  • Vypočítávat metriky podobnosti
  • A mnoho dalšího..

Začněme.

Co je to slovník a korpus?

Pro práci s textovými dokumenty vyžaduje Gensim převod slov (tzv. tokenů) na jedinečné id. Abyste toho dosáhli, umožňuje Gensim vytvořit objekt Dictionary, který mapuje každé slovo na jedinečné id.

V další části uvidíme, jak to vlastně udělat.

Ale proč je objekt slovníku potřeba a kde ho lze použít?

Objekt slovníku se obvykle používá k vytvoření korpusu „pytle slov“. Právě tento slovník a pytel slov (Corpus) se používají jako vstupy pro modelování témat a další modely, na které se Gensim specializuje.

Jaké druhy textových vstupů může Gensim zpracovávat? Vstupní text obvykle přichází ve třech různých formách:

  1. Jako věty uložené v nativním objektu seznamu jazyka python
  2. Jako jeden textový soubor, malý nebo velký.
  3. Ve více textových souborech.

Nyní, když je váš vstupní text velký, potřebujete mít možnost vytvořit objekt slovníku, aniž byste museli načítat celý textový soubor.

Dobrou zprávou je, že Gensim umožňuje číst text a aktualizovat slovník po jednotlivých řádcích, aniž by se celý textový soubor načítal do systémové paměti. Podívejme se, jak to udělat v následujících dvou částech.

Ale než se do toho pustíme, pochopme trochu žargonu NLP.

„Token“ obvykle znamená „slovo“. Dokument“ může obvykle znamenat „větu“ nebo „odstavec“ a „korpus“ je obvykle „soubor dokumentů jako pytel slov“. To znamená, že pro každý dokument obsahuje korpus identifikátor každého slova a počet jeho frekvencí v daném dokumentu. V důsledku toho se ztrácí informace o pořadí slov.

Jestliže je zatím vše jasné, pojďme si namočit ruce a podívat se, jak vytvořit slovník ze seznamu vět.

Jak vytvořit slovník ze seznamu vět?

V gensimu slovník obsahuje mapu všech slov (tokenů) na jejich jedinečné id.

Slovník můžete vytvořit z odstavce vět, z textového souboru, který obsahuje více řádků textu, a z více takových textových souborů obsažených v adresáři. Ve druhém a třetím případě to uděláme bez načítání celého souboru do paměti, takže slovník se bude aktualizovat při čtení textu po řádcích.

Začneme vstupem „Seznam vět“.

Pokud máte více vět, musíte každou větu převést na seznam slov. Běžným způsobem, jak to udělat, je porozumění seznamu.

Jak je uvedeno, slovník má 34 jedinečných tokenů (neboli slov). Podívejme se na unikátní id pro každý z těchto tokenů.

Úspěšně jsme vytvořili objekt Slovník. Gensim použije tento slovník k vytvoření korpusu typu bag-of-words, kde jsou slova v dokumentech nahrazena příslušnými id poskytnutými tímto slovníkem.

Pokud v budoucnu získáte nové dokumenty, je také možné aktualizovat stávající slovník tak, aby obsahoval nová slova.

Jak vytvořit slovník z jednoho nebo více textových souborů?

Slovník můžete vytvořit také z textového souboru nebo z adresáře textových souborů.

Následující příklad načte soubor po řádcích a pomocí gensimovské funkce simple_preprocess zpracuje jeden řádek souboru najednou.

Výhodou je, že vám to umožní přečíst celý textový soubor, aniž byste jej museli načítat do paměti najednou.

Pro demonstraci použijeme ukázkový soubor.txt.

Vytvořili jsme slovník z jednoho textového souboru. Pěkné!

Teď, jak číst po jednom řádku z více souborů?

Předpokládáme, že všechny textové soubory jsou ve stejném adresáři, je třeba definovat třídu s metodou __iter__. Metoda __iter__() by měla iterovat všechny soubory v daném adresáři a poskytnout zpracovaný seznam slovních tokenů.

Definujme jednu takovou třídu jménem ReadTxtFiles, která přebírá cestu k adresáři obsahujícímu textové soubory. Jako vstup používám tento adresář s dokumenty o sportovním stravování.

Tento příspěvek na blogu poskytuje pěkný přehled pro pochopení konceptu iterátorů a generátorů.

Jak vytvořit pytel slov (bag of words corpus) v gensimu?

Teď už víte, jak vytvořit slovník ze seznamu a z textového souboru.

Dalším důležitým objektem, se kterým se musíte seznámit, abyste mohli pracovat v gensimu, je korpus (pytel slov). To znamená, že se jedná o objekt korpusu, který obsahuje id slova a jeho frekvenci v každém dokumentu. Můžete si jej představit jako ekvivalent matice Dokument-Term v gensimu.

Jakmile máte aktualizovaný slovník, vše, co musíte udělat pro vytvoření korpusu typu Bag of words, je předat tokenizovaný seznam slov objektu Dictionary.doc2bow()

Vytvořme s Corpus pro jednoduchý seznam (my_docs) obsahující 2 věty.

Jak interpretovat výše uvedený korpus?

Položka (0, 1) v řádku 1 znamená, že slovo s id=0 se v 1. dokumentu vyskytuje jednou.
Podobně položka (4, 4) v druhé položce seznamu znamená, že slovo s id 4 se v druhém dokumentu vyskytuje čtyřikrát. A tak dále.

No, to není čitelné pro člověka. Chcete-li převést id na slova, budete k tomu potřebovat slovník.

Podívejme se, jak získat zpět původní texty.

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

Všimněte si, že se ztratí pořadí slov. Zůstane zachována pouze informace o slově a jeho frekvenci.

6. Jaké je pořadí slov? Jak vytvořit korpus typu bag of words z textového souboru?

Čtení slov ze seznamu v Pythonu je poměrně jednoduché, protože celý text již byl v paměti.
Můžete však mít velký soubor, který nechcete celý načítat do paměti.

Takové soubory můžete importovat po jednotlivých řádcích definováním třídy a funkce __iter__, která iterativně načte soubor po jednom řádku a získá objekt korpusu. Jak ale vytvořit objekt korpusu?

Funkce __iter__() z BoWCorpus přečte řádek ze souboru, zpracuje jej na seznam slov pomocí simple_preprocess() a ten předá funkci dictionary.doc2bow(). Můžete uvést, jak se to podobá a liší od třídy ReadTxtFiles, kterou jsme vytvořili dříve?“

Všimněte si také, že používám smart_open() z balíčku smart_open, protože umožňuje otevírat a číst velké soubory po řádcích z různých zdrojů, jako jsou S3, HDFS, WebHDFS, HTTP nebo místní a komprimované soubory. To je mimochodem docela úžasné!

Jestliže jste však pro soubor v systému použili open(), bude perfektně fungovat i soubor

Jak uložit slovník a korpus gensim na disk a načíst je zpět?

To je docela jednoduché. Viz příklady níže.

Uložili jsme objekty slovníku a korpusu. Nahrajeme je zpět.

Jak vytvořit matici TFIDF (korpus) v gensimu?

Frekvence termínů – inverzní frekvence dokumentů(TF-IDF) je také model typu bag-of-words, ale na rozdíl od běžného korpusu TFIDF snižuje váhu tokenů (slov), které se v dokumentech vyskytují často.

Jak se TFIDF počítá?

Tf-Idf se vypočítá vynásobením lokální složky, jako je frekvence termínů (TF), globální složkou, tj. inverzní frekvencí dokumentů (IDF), a volitelnou normalizací výsledku na jednotkovou délku.

V důsledku toho se sníží váha slov, která se v dokumentech vyskytují často.

Existuje více variant vzorců pro TF a IDF. Gensim používá systém pro vyhledávání informací SMART, který lze použít k implementaci těchto variant. Můžete určit, jaký vzorec se má použít, zadáním parametru smartirs v TfidfModel. Další podrobnosti najdete v help(models.TfidfModel).

Jak tedy získat váhy TFIDF?

Trénováním korpusu pomocí models.TfidfModel(). Poté použijte korpus v hranatých závorkách natrénovaného modelu tfidf. Viz příklad níže.

Všimněte si rozdílu ve vahách slov mezi původním korpusem a korpusem váženým tfidf.

Slova „je“ a „the“ se vyskytují ve dvou dokumentech a byly jim sníženy váhy. Slovo ‚tento‘ vyskytující se ve všech třech dokumentech bylo zcela odstraněno. Zjednodušeně řečeno, slova, která se v dokumentech vyskytují častěji, dostávají menší váhy.

Jak použít API gensim downloader k načtení datových sad?

Gensim poskytuje vestavěné API ke stažení populárních textových datových sad a modelů pro vkládání slov.

Úplný seznam dostupných datových sad a modelů je udržován zde.

Použití API ke stažení datové sady je stejně jednoduché jako zavolání metody api.load() se správným názvem dat nebo modelu.

Následující příklad ukazuje, jak stáhnout model ‚glove-wiki-gigaword-50‘.

Jak vytvořit bigramy a trigramy pomocí modelů Phraser?

Teď už víte, jak stáhnout datasety a předtrénované modely pomocí gensimu.

Stáhneme si dataset text8, což není nic jiného než „Prvních 100 000 000 bajtů prostého textu z Wikipedie“. Z něj pak budeme generovat bigramy a trigramy.

Ale co jsou to bigramy a trigramy a proč na nich záleží?

V odstavcích mají určitá slova vždy tendenci vyskytovat se ve dvojicích (bigram) nebo ve skupinách po třech (trigram). Protože tato dvě slova dohromady tvoří skutečný celek. Např: Slovo „francouzština“ označuje jazyk nebo oblast a slovo „revoluce“ může odkazovat na planetární revoluci. Ale jejich spojení, tedy ‚francouzská revoluce‘, odkazuje na něco úplně jiného.

Je poměrně důležité vytvářet bigramy a trigramy z vět, zejména při práci s modely typu bag-of-words.

Jak tedy vytvářet bigramy?

Je to poměrně snadné a efektivní pomocí modelu gensim Phrases. Vytvořený model Phrases umožňuje indexování, takže stačí předat původní text (seznam) sestavenému modelu Phrases a vytvořit bigramy. Příklad je uveden níže:

Bigramy jsou připraveny. Dokážete odhadnout, jak vytvořit trigram?“

No, jednoduše opláchněte a zopakujte stejný postup na výstupu bigramového modelu. Po vytvoření bigramů můžete výstup předat k trénování nového modelu Phrases. Poté aplikujte bigramový korpus na natrénovaný trigramový model. Jste zmateni? Podívejte se na příklad níže.

Jak vytvořit tematické modely pomocí LDA?

Cílem tematických modelů je extrahovat základní témata z dané kolekce textových dokumentů. Každý dokument v textu je považován za kombinaci témat a každé téma je považováno za kombinaci souvisejících slov.

Tématické modelování lze provádět pomocí algoritmů, jako je Latentní Dirichletova alokace (LDA) a Latentní sémantické indexování (LSI).

V obou případech je třeba jako vstup zadat počet témat. Tematický model zase poskytne klíčová slova pro každé téma a procentuální podíl témat v každém dokumentu.

Kvalita témat je velmi závislá na kvalitě zpracování textu a počtu témat, která algoritmu poskytnete. Dřívější příspěvek o tom, jak vytvořit nejlepší modely témat, vysvětluje postup podrobněji. Doporučuji však porozumět základním krokům a výkladu v níže uvedeném příkladu.

Krok 0: Načtení potřebných balíčků a import stopwords.

Krok 1: Import datasetu. Použiji dataset text8, který lze stáhnout pomocí API downloaderu gensimu.

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

Krok 2: Připravte stažená data odstraněním stopslov a lemmatizujte je. Pro lemmatizaci vyžaduje gensim balíček pattern. Před spuštěním tohoto příkazu se ujistěte, že jste v terminálu nebo v příkazovém řádku provedli příkaz pip install pattern. Lemmatizaci jsem nastavil tak, že jsou zachována pouze podstatná jména (NN), přídavná jména (JJ) a zájmena (RB). Protože dávám přednost tomu, aby pouze taková slova šla jako klíčová slova tématu. Jedná se o osobní volbu.

Slovo data_processed je nyní zpracováno jako seznam slov. Nyní z něj můžete vytvořit Dictionary a Corpus, které pak budou použity jako vstupy do modelu LDA.

Máme vytvořený slovník a korpus. Vytvoříme tematický model LDA se 7 tématy pomocí LdaMulticore(). 7 témat je prozatím libovolná volba.

V lda_model.print_topics je uvedeno, jaká slova přispěla ke kterému ze 7 témat, spolu s váhou příspěvku slova k danému tématu.

Vidíte, že slova jako „také“, „mnoho“ se objevují v různých tématech. Taková slova bych tedy přidal do seznamu stop_words, abych je odstranil a dále vyladil tematický model pro optimální počet témat.

LdaMulticore() podporuje paralelní zpracování. Případně byste také mohli zkusit zjistit, jaká témata dává LdaModel().

Jak interpretovat výstup tematického modelu LDA?

Objekt lda_model podporuje indexování. To znamená, že pokud objektu lda_model předáte dokument (seznam slov), poskytne vám 3 věci:

  1. Témata, ke kterým dokument patří, spolu s procenty.
  2. Témata, ke kterým patří každé slovo v tomto dokumentu.
  3. Téma(a), ke kterému každé slovo v tomto dokumentu patří, A hodnoty phi.

Takže, co je hodnota phi?

Hodnota phi je pravděpodobnost, že slovo patří k danému tématu. A součet hodnot phi pro dané slovo se sčítá s počtem výskytů tohoto slova v daném dokumentu.

Například v níže uvedeném výstupu pro 0. dokument patří slovo s id=0 k tématu číslo 6 a hodnota phi je 3,999. To znamená, že slovo s id=0 se v 0. dokumentu vyskytlo 4krát.

Jak vytvořit tematický model LSI pomocí gensimu?

Syntaxe pro použití modelu LSI je podobná tomu, jak jsme sestavili model LDA, s tím rozdílem, že použijeme LsiModel().

Jak trénovat model Word2Vec pomocí gensimu?

Model vkládání slov je model, který může poskytnout číselné vektory pro dané slovo. Pomocí rozhraní API programu Gensim pro stahování si můžete stáhnout předpřipravené modely pro vkládání slov, jako jsou word2vec, fasttext, GloVe a ConceptNet. Ty jsou postaveny na rozsáhlých korpusech běžně se vyskytujících textových dat, jako je wikipedie, zprávy Google atd.

Pokud však pracujete ve specializované nice, jako jsou technické dokumenty, nemusí se vám podařit získat word embeddings pro všechna slova. V takových případech je tedy žádoucí natrénovat vlastní model.

Implementace Word2VecGensim umožňuje natrénovat vlastní model vkládání slov pro daný korpus.

Našemu dokumentu jsme natrénovali a uložili model Word2Vec. Když však přijde nový dataset, chcete model aktualizovat tak, aby zohledňoval nová slova.

Jak aktualizovat existující model Word2Vec s novými daty?

V existujícím modelu Word2Vec zavolejte build_vocab() na nový dataset a poté zavolejte metodu train(). build_vocab() se volá jako první, protože model musí být informován o tom, jaká nová slova má v příchozím korpusu očekávat.

Jak extrahovat vektory slov pomocí předtrénovaných modelů Word2Vec a FastText?

Před chvílí jsme viděli, jak získat vektory slov pro právě natrénovaný model Word2Vec. Gensim však umožňuje stáhnout nejmodernější předtrénované modely prostřednictvím rozhraní API downloaderu. Podívejme se, jak získat slovní vektory z několika těchto modelů.

Máme 3 různé modely s vloženými slovy. Který z nich funguje lépe, můžete vyhodnotit pomocí evaluate_word_analogies() příslušného modelu na standardní sadě analogických dat.

Jak vytvořit vektory dokumentu pomocí Doc2Vec?

Na rozdíl od Word2Vec model Doc2Vec poskytuje vektorizovanou reprezentaci skupiny slov braných dohromady jako jedna jednotka. Nejedná se o prostý průměr slovních vektorů slov ve větě.

Použijeme datovou sadu text8 k trénování Doc2Vec.

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

Tréninkovými daty pro Doc2Vec by měl být seznam TaggedDocument. Abychom jej vytvořili, předáme seznam slov a jedinečné celé číslo jako vstup do models.doc2vec.TaggedDocument().

Vstup je připraven. Pro trénování modelu je třeba inicializovat model Doc2Vec, vytvořit slovník a nakonec model trénovat.

Chceme-li získat vektor dokumentu věty, předáme jej jako seznam slov metodě infer_vector().

Jak vypočítat metriky podobnosti, jako je kosinová podobnost a měkká kosinová podobnost?

Měkká kosinová podobnost je podobná kosinové podobnosti, ale navíc zohledňuje sémantický vztah mezi slovy prostřednictvím jejich vektorové reprezentace.

Pro výpočet měkkých kosinů budete potřebovat model vkládání slov, jako je Word2Vec nebo FastText. Nejprve vypočtěte similarity_matrix. Poté převeďte vstupní věty na korpus typu bag-of-words a předejte je softcossim() spolu s maticí podobnosti.

Níže jsou uvedeny některé užitečné metriky podobnosti a vzdálenosti založené na modelech vkládání slov, jako jsou fasttext a GloVe. Tyto modely jsme již stáhli pomocí rozhraní API downloaderu.

Jak shrnout textové dokumenty?

Gensim implementuje shrnutí textu pomocí funkce summarize() v modulu summarization. Stačí předat tet řetězec spolu s výstupní sumarizací ratio nebo maximálním count počtem slov v sumarizovaném výstupu.

Není třeba rozdělovat větu na tokenizovaný seznam, protože gensim provádí rozdělení pomocí vestavěné metody split_sentences() v modulu gensim.summarization.texcleaner.

Sumarizujme výňatek z nového článku v souboru sample.txt.

Další informace o sumarizaci pomocí gensimu najdete v tomto návodu.

Závěr

Probrali jsme mnoho informací o různých funkcích gensimu a dobře jsme pochopili, jak pracovat s texty a jak s nimi manipulovat. Výše uvedené příklady by vám měly posloužit jako pěkné šablony, na kterých můžete začít stavět při řešení různých úloh NLP. Doufám, že vám budou užitečné a že se vám bude chtít gensim častěji používat ve vašich projektech NLP.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.