本文給大家介紹幾個在使用gensim進行文本挖掘所需了解的基本概念和術語,並提供一些簡單的用法示例。enjoy~
筆者最近在梳理自己的文本挖掘知識結構,藉助gensim、sklearn、keras等庫的文檔做了些擴充,希望在梳理自身知識體系的同時也能對想學習文本挖掘的朋友有一點幫助,這是筆者寫該系列的初衷。
本文會介紹幾個在使用gensim進行文本挖掘所需了解的基本概念和術語,並提供一些簡單的用法示例。
在更高層次上,gensim是一種通過檢查詞彙模式(或更高級別的結構,如語句或文檔)來發現文檔語義結構(Semantic Structure)的工具。
gensim通過語料庫——一組文本文檔,並在語料庫中生成文本的向量表示(Vector Representation of the Text)來實現這一點。 然後,文本的向量表示可用於訓練模型——它是用於創建不同的文本數據(蘊含語義)表示的算法。
這三個概念是理解gensim如何工作的關鍵,所以讓我們花一點時間來解釋它們的含義。與此同時,我們將通過一個簡單的例子來說明每個概念。
一個語料庫是數字文檔的集合(A Collection of Digital Documents)。 這個集合是gensim的輸入,它將從中推斷文檔的結構或主題。從語料庫中推斷出的潛在結構(Latent Structure)可用於將主題分配給先前不存在於僅用於訓練的語料庫中的新文檔。 出於這個原因,我們也將此集合稱為訓練語料庫(Training Corpus)。
這個過程不需要人工幹預(比如手動給文檔打標籤)——因為主題分類是無監督的(Unsupervised)(https://en.wikipedia.org/wiki/Unsupervised_learning)。
對於筆者用於示例的語料庫,有12個文檔,每個文檔只有一個語句:
這只是一個很小的語料庫,其實你可以用其他的語料庫進行替代,比如:微信上的文章、微博博文,或者新聞標題等。
收集語料庫之後,通常會進行一系列的文本預處理。 作為示例,為了簡潔起見,筆者僅刪除語料庫中的停用詞和在語料庫中只出現一次的詞彙。 在此過程中,筆者將進行分詞操作,將文檔分解為由詞彙組成的列表(在本例中使用空格作為分隔符)。
在繼續之前,筆者希望將語料庫中的每個詞彙與唯一的整數ID相關聯。 我們可以使用gensim.corpora.Dictionary這個類來完成,這個詞典定義了筆者之前預處理後的語料中的詞彙。
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Dictionary(14 unique tokens: [『創新』, 『商業』, 『知識圖譜』, 『技術』, 『數據』]…)
因為筆者給定的語料較小, 只有14個不同的詞彙在這個 Dictionary中。 對於較大的語料庫,詞典中會包含成千上萬的詞彙,數量龐大。
為了推斷語料庫中的潛在結構(Latent Structure),我們需要一種可用於數學操作(比如,加減乘除等運算)的文檔表示方法。一種方法是將每個文檔表示為向量,有各種用於創建文檔的向量表示的方法,其中一個簡單的方法是詞袋模型(Bag-of-Words Model)。
在詞袋模型下,每個文檔由包含字典中每個單詞的頻率計數的向量表示。例如:給定一個包含詞彙[『咖啡』,』牛奶』,』糖果』,』勺子』]的字典,那麼,一個由字符串』咖啡 牛奶 糖果 勺子』組成的文檔可以用向量表示為[2 ,1,0,0],其中向量的元素(按順序)對應文檔中出現的「咖啡」,「牛奶」,「糖」和「勺子」。向量的長度是字典中的詞彙數。詞袋模型的一個主要特性是它完全忽略了編碼文檔(the Encoded Document )中的詞彙順序,這就是詞袋模型的由來。
我們處理過的語料庫中有14個不同的詞彙,這意味著語料庫中的每個文檔將由這個14維向量的詞袋模型來表示,我們可以使用字典將分詞後的文檔轉換為14維向量。由此,我們可以看到這些ID對應的詞彙:print(dictionary.token2id)
{『創新』: 0, 『商業』: 1, 『知識圖譜』: 2, 『技術』: 3, 『數據』: 4, 『金融』: 5, 『分析』: 6, 『知識』: 7, 『管理』: 8, 『一文』: 9, 『關鍵』: 10, 『企業』: 11, 『智能』: 12, 『轉型』: 13}
例如,假設我們想要對「知識圖譜為企業轉型助力」這個語句進行向量化(請注意,該語句不在我們原來的語料庫中)。 我們可以使用dictionary的doc2bow方法為該語句創建詞袋錶示,該方法返回詞彙計數的稀疏表示:
每個元組中的第一個元素對應字典中的詞彙ID,第二個條目對應於該詞彙的計數。
請注意,原始語料庫中沒有出現「為」、「助力」,因此它們將不包含於新生成的向量表示中。 另請注意,此向量僅包含實際出現在文檔中的詞彙。 因為任何給定文檔只包含字典中許多單詞中的幾個單詞,所以未參與向量化的詞彙會直接被剔除,以節省空間。
我們可以將整個原始語料庫轉換為向量列表:
請注意,雖然此列表完全保存在內存中,但在大多數的應用場景,你需要更具伸縮性的解決方案(A More Scalable Solution)。幸運的是,gensim允許流式迭代器。 後面筆者會談及。
現在,我們已經對測試語料庫進行了向量化,我們可以開始使用models對其進行轉換了。 我們使用模型作為抽象術語,指的是從一個文檔表示到另一個文檔表示的轉換。 在gensim中,文檔表示為向量,因而模型可以被認為是兩個向量空間之間的轉換。 從訓練語料庫中學習這種轉換的細節。
一個簡單的模型示例是TF-IDF。 TF-IDF模型將向量從詞袋錶示(Bag-of-Words Representation)轉換為向量空間,其中頻率計數根據語料庫中每個單詞的相對稀有度(the relative rarity of each word in the corpus)進行加權。
這是一個簡單的例子。 讓我們初始化tf-idf模型,在測試語料庫上進行訓練,然後對字符串「知識圖譜這種技術是企業轉型的利器」進行轉換:
TF-IDF模型再次返回元組列表,每個元組的第一個元素是詞彙ID,第二個條目是TF-IDF加權值。 注意,對應於「知識圖譜」的ID(在訓練語料庫中出現10次)的加權值低於對應於「轉型」的ID(在訓練語料庫中出現2次)權重值。
gensim提供了許多不同的模型/轉換。 有關詳細信息,請看筆者後續的文章。
蘇格蘭折耳喵(微信公眾號:Social Listening與文本挖掘),人人都是產品經理專欄作家,數據PM一隻,擅長數據分析和可視化表達,熱衷於用數據發現洞察,指導實踐。
本文原創發布於人人都是產品經理。未經許可,禁止轉載。
題圖來自Unsplash,基於CC0協議