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