寫在前面:筆者最近在梳理自己的文本挖掘知識結構,藉助gensim、sklearn、keras等庫的文檔做了些擴充,會陸陸續續介紹文本向量化、tfidf、主題模型、word2vec,既會涉及理論,也會有詳細的代碼和案例進行講解,希望在梳理自身知識體系的同時也能對想學習文本挖掘的朋友有一點幫助,這是筆者寫該系列的初衷。

緊接着前面的兩篇文章,筆者今天要聊的主題是:主題模型和文本數據轉換(Topics and Text Data Transformation),這是在上篇文章涉及的詞袋模型( Bag-of-Words)的基礎上做的進一步文本特徵提取。

可能有讀者要問,爲什麼要做文本數據轉換呢?

一個較爲形象化的解釋是:

機器不懂人類的自然語言,我們要將自然語言轉換爲機器易於理解的“語言”。轉換成機器容易理解的語言就是說“機話”,變成一連串有阿拉伯數字構成的字符串,且這些字符串儘量保留原來人類語言的語義。舉個例子,我們讓機器理解一句話 --- “我們今天要去喫披薩”,進行轉換後,可能出現部分的語義信息損失,比如機器會理解爲“我們要去喫飯”,這在某些場合是可以接受的,但不能讓機器理解爲“我們要去打遊戲”,這就離原始的語義信息偏離太遠了。

簡而言之,掌握了主題模型和文本數據轉換以後,我們可以進行後面比較複雜且實用的文本挖掘應用了,比如文本相似度檢索、文本聚類、文本分類等,這些都會在筆者後續的文章中提到。

正式開始前,設置日誌,培養碼代碼的好習慣,打印程序運行中的細節,以便後面找到報錯。

import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

工作路徑查詢:

import tempfile

import os.path



TEMP_FOLDER = tempfile.gettempdir()

print('文件夾"{}" 將被用來存儲語料和臨時性的字典'.format(TEMP_FOLDER))

文件夾"C:\Users\hp\AppData\Local\Temp" 將被用來存儲語料和臨時性的字典

1. 數據轉換接口(Transformation interface)

在上一篇文章 《文本挖掘從小白到精通(二)---語料庫和詞向量空間》 中,我們以向量流的形式創建了一個文檔語料庫。這次,筆者將繼續使用該語料庫:

from gensim import corpora, models, similarities

if os.path.isfile(os.path.join(TEMP_FOLDER, 'deerwester.dict')):

dictionary = corpora.Dictionary.load(os.path.join(TEMP_FOLDER, 'deerwester.dict'))

corpus = corpora.MmCorpus(os.path.join(TEMP_FOLDER, 'deerwester.mm'))

print("使用前面教程中產生的語料文件。")

else:

print("請運行前面的教程,以生成語料文件。")

2019-05-09 10:15:55,630 : INFO : 'pattern' package not found; tag filters are not available for English
2019-05-09 10:15:55,637 : INFO : loading Dictionary object from C:\Users\hp\AppData\Local\Temp\deerwester.dict
2019-05-09 10:15:55,642 : INFO : loaded C:\Users\hp\AppData\Local\Temp\deerwester.dict
2019-05-09 10:15:55,646 : INFO : loaded corpus index from C:\Users\hp\AppData\Local\Temp\deerwester.mm.index
2019-05-09 10:15:55,647 : INFO : initializing cython corpus reader from C:\Users\hp\AppData\Local\Temp\deerwester.mm

2019-05-09 10:15:55,649 : INFO : accepted corpus with 12 documents, 12 features, 35 non-zero entries

使用前面教程中產生的語料文件。

前面教程的語料庫由這些文檔構成:

  • 商業新知:知識圖譜爲內核,構建商業創新服務完整生態。

  • 如何更好利用知識圖譜技術做反欺詐? 360金融首席數據科學家沈贇開講。

  • 知識管理 | 基於知識圖譜的國際知識管理領域可視化分析。

  • 一文詳解達觀數據知識圖譜技術與應用。

  • 知識圖譜技術落地金融行業的關鍵四步。

  • 一文讀懂知識圖譜的商業應用進程及技術背景。

  • 海雲數據CPO王斌:打造大數據可視分析與AI應用的高科技企業。

  • 智能產業|《人工智能標準化白皮書2018》帶來創新創業新技術標準。

  • 國家語委重大科研項目“中華經典詩詞知識圖譜構建技術研究”開題。

  • 最全知識圖譜介紹:關鍵技術、開放數據集、應用案例彙總

  • 中譯語通Jove Mind知識圖譜平臺 引領企業智能化發展。

  • 知識圖譜:知識圖譜賦能企業數字化轉型,爲企業升級轉型注入新能量。

查看保存字典( Dictionary )中的前3個詞彙:

print(dictionary[0])

print(dictionary[1])

print(dictionary[2])

創新 商業 知識圖譜 

準備工作做好了,下面要進入正題了,筆者將重點展示 如何將文檔從一個向量表示(Vector Representation )是轉換爲另一個向量表示 。 在此過程中,會涉及到兩個目標:

  • 挖掘語料庫中潛藏的結構,發現詞彙之間的關聯性。 前一篇文章中提到的詞袋模型/表示,並不能很好的挖掘語料中的 詞序特徵 (語句中詞彙的先後順序)和 語義 特徵 (上下文、詞性搭配等),進行文本數據轉換後則可以一種更加反映語義相關性的方式來表徵文檔,以提高後續文本聚類、文本分類等高階文本挖掘應用的效果。

  • 使文檔表示更緊湊。 這既提高了 效率 (新的文檔表示會消耗更少的計算資源,轉換過程會更快),也提升了 效果 (邊際數據的趨勢被忽略,也就是語料中的超低頻和超高頻詞彙對語料的影響被削弱,從而達到數據降噪的目的,更能抓住文本中的重要特徵)。

下面進入實際的代碼操作:

1.1 創建轉換(Creating a Transformation)

TF-IDF模型用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度,它是一個標準的Python對象,可通過對語料庫訓練進行初始化。

step 1 -- 初始化模型:

tfidf = models.TfidfModel(corpus)
2019-05-09 10:16:04,390 : INFO : collecting document frequencies
2019-05-09 10:16:04,393 : INFO : PROGRESS: processing document #0
2019-05-09 10:16:04,395 : INFO : calculating IDF weights for 12 documents and 11 features (35 matrix non-zeros)

通過打印出的日誌可以看到,該TF-IDF轉換模型在這12個經詞袋錶示的文檔中抽取出了11個特徵。

值得注意的是,不同的轉換可能需要不同的初始化參數 --- 在TF-IDF的情境下,“訓練”僅包括通過一次性提供語料庫並計算其所有特徵的文檔頻率,模型不需要額外設置參數。訓練其他文本轉換模型,比如潛在語義分析模型(Latent Semantic Analysis,LSI)或隱含狄利克雷分佈模型(Latent Dirichlet Allocation),可能複雜很多,會涉及更多的參數設置,同時也需要更多的時間進行訓練。

注意:

(文本數據)轉換總是在兩個特定的向量空間(Two Specific Vector Spaces)之間進行。必須使用相同的向量空間(即同一組特徵id)進行模型訓練和後續的向量轉換。如果不能使用相同的輸入特徵空間(Input Feature Space),例如使用不同的字符串進行預處理,或者使用不同的特徵ID,抑或本應使用TF-IDF向量卻採用詞袋錶示來輸入向量,這些“誤操作”將產生轉換期間的特徵不匹配,進而導致錯誤的運行結果或產生異常。

step 2 -- 使用模型對詞袋錶示向量進行轉換:

doc_bow = [(0, 3), (1, 5)]

print(tfidf[doc_bow])

[(0, 0.5144957554275265), (1, 0.8574929257125441)]

或者,直接對整個(訓練)語料庫進行特徵轉換:

corpus_tfidf = tfidf[corpus]

for doc in corpus_tfidf:

print(doc)

[(0, 0.4467512594633994), (1, 0.8935025189267988), (2, 0.045459441696222264)]
[(2, 0.07982263066186342), (3, 0.38329103210095783), (4, 0.48098603643475885), (5, 0.7844544378738532)]
[(2, 0.025128868703899597), (6, 0.24695318119778994), (7, 0.6849754251993109), (8, 0.6849754251993109)]
[(2, 0.07982263066186342), (3, 0.38329103210095783), (4, 0.48098603643475885), (9, 0.7844544378738532)]
[(2, 0.0910460341905888), (3, 0.43718339178067905), (5, 0.8947520894690928)]
[(1, 0.6668011702142979), (2, 0.06785075201967737), (3, 0.32580465658435587), (9, 0.6668011702142979)]
[(4, 0.6962169034343767), (6, 0.5677404313752555), (10, 0.4392639593161345)]
[(0, 1.0)]
[(2, 0.20388162893651843), (3, 0.9789955471717897)]
[(2, 0.16371704169295062), (4, 0.9865073391816752)]
[(2, 0.13039433685974838), (10, 0.9914622115415728)]

[(2, 0.06394369208554566), (10, 0.4862002131078655), (11, 0.8715047659171663)]

可以看到,每個轉換後的語句中,單個詞彙的表示由整數型數值的詞彙計數轉變成了浮點型的詞彙權重。該權重表示字詞對於該語句的重要性程度,數值越大,則重要性程度越高,反之越小,對於其原理,可以進行如此直覺性的理解:

字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在 語料庫 中出現的頻率成反比下降。

比如,示例語料庫中的第一句話 --- ' 商業新知:知識圖譜爲內核,構建商業創新服務完整生態。 ',它原先可由詞袋模型表徵爲

[(0, 1), (1, 2), (2, 1)]

經過 TF-IDF轉換模型轉換後則變爲:

[(0, 0.4467512594633994), (1, 0.8935025189267988), (2, 0.045459441696222264)]

請注意,這裏0,1,2在字典中分別對應‘創新'、'商業'、'知識圖譜' 這3個詞彙,根據這3個詞的權重大小可知,對於這句話,最重要(最能代表這句話含義)的詞彙是“商業”,其次是“創新”,最次是“知識圖譜”。這很符合直覺:這12句話中都包含“知識圖譜”,因此該詞對各個文檔/語句的代表性很弱。

此外,因爲是示例數據,我們用這12個文檔訓練出TF-IDF模型後,又用這訓練出來的模型對這12個文檔的詞袋錶示進行轉換。但在實際應用中,該模型可以對訓練語料之外的語料/語句進行轉換。當然,用於轉換的語料/語句中的若干詞彙不在模型的詞彙表中,那麼該語料/語句的部分信息會缺失。所以說,實際任務中,訓練語料能大則大,絕對是“大力出奇跡”!

注意:

調用 model[corpus] 在已有的語料庫文檔流上創建一個包裝器(Wrapper) --- 實際的文本數據轉換在文檔迭代期間即時完成(Done on-the-Fly)。我們無法在調用 corpus_transformed = model [corpus] 時轉換整個語料庫 --- 因爲這意味着結果將會存儲在本地內存中,這與gensim的內存獨立(Memory-Independence)的目標相悖。如果你將多次迭代待轉換的corpus_transformed,且轉換代價較高,請先將生成的語料庫序列化(Serialize)到本地,以便後續使用。

轉換後的結果也可以序列化,它將一層層嵌套。

step 3 --- 基於前面的特徵,進行LSI模型構建

lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=3) # 初始化 LSI 轉換

corpus_lsi = lsi[corpus_tfidf] #在原始語料詞袋錶示的基礎上創建一個雙包裝器(Double Wrapper):bow-> tfidf-> lsi

2019-05-09 10:16:29,942 : INFO : using serial LSI version on this node
2019-05-09 10:16:29,947 : INFO : updating model with new documents
2019-05-09 10:16:29,950 : INFO : preparing a new chunk of documents
2019-05-09 10:16:29,951 : INFO : using 100 extra samples and 2 power iterations
2019-05-09 10:16:29,951 : INFO : 1st phase: constructing (12, 103) action matrix
2019-05-09 10:16:29,989 : INFO : orthonormalizing (12, 103) action matrix
2019-05-09 10:16:30,045 : INFO : 2nd phase: running dense svd on (12, 12) matrix
2019-05-09 10:16:30,061 : INFO : computing the final decomposition
2019-05-09 10:16:30,061 : INFO : keeping 3 factors (discarding 45.442% of energy spectrum)
2019-05-09 10:16:30,171 : INFO : processed documents up to #12
2019-05-09 10:16:30,175 : INFO : topic #0(1.715): -0.590*"數據" + -0.540*"技術" + -0.406*"金融" + -0.316*"一文" + -0.169*"商業" + -0.163*"企業" + -0.160*"知識圖譜" + -0.109*"分析" + -0.041*"創新" + -0.036*"轉型"
2019-05-09 10:16:30,176 : INFO : topic #1(1.382): 0.565*"企業" + 0.449*"數據" + -0.385*"商業" + -0.351*"技術" + 0.217*"分析" + -0.216*"創新" + -0.215*"一文" + 0.208*"轉型" + -0.146*"金融" + 0.038*"管理"
2019-05-09 10:16:30,178 : INFO : topic #2(1.302): 0.580*"商業" + 0.468*"創新" + -0.444*"金融" + 0.330*"企業" + 0.264*"一文" + -0.198*"技術" + 0.150*"轉型" + 0.075*"分析" + 0.026*"數據" + 0.018*"知識圖譜"

在這裏,我們通過潛在語義索引(Latent Semantic Indexing)( http://en.wikipedia.org/wiki/Latent_semantic_indexing)  將前面轉換得到的TF-IDF語料庫轉換到潛在的3-D空間(3-D因爲筆者在這裏設置了num_topics = 3)。現在你可能想知道:這3個潛在的維度代表什麼?讓我們用 models.LsiModel.show_topics() 一探究竟:

lsi.show_topics()
[(0,
'-0.590*"數據" + -0.540*"技術" + -0.406*"金融" + -0.316*"一文" + -0.169*"商業" + -0.163*"企業" + -0.160*"知識圖譜" + -0.109*"分析" + -0.041*"創新" + -0.036*"轉型"'),
(1,
'0.565*"企業" + 0.449*"數據" + -0.385*"商業" + -0.351*"技術" + 0.217*"分析" + -0.216*"創新" + -0.215*"一文" + 0.208*"轉型" + -0.146*"金融" + 0.038*"管理"'),
(2,
'0.580*"商業" + 0.468*"創新" + -0.444*"金融" + 0.330*"企業" + 0.264*"一文" + -0.198*"技術" + 0.150*"轉型" + 0.075*"分析" + 0.026*"數據" + 0.018*"知識圖譜"')]

1.2 對LSI主題模型的結果進行解釋

再看看語料庫中的文檔,並給每個文檔加上序號,便於索引。根據上述主題及主題詞構成,即可發現文檔的主題歸屬:

  • 1 商業新知:知識圖譜爲內核,構建商業創新服務完整生態。

  • 2 如何更好利用知識圖譜技術做反欺詐? 360金融首席數據科學家沈贇開講。

  • 3 知識管理 | 基於知識圖譜的國際知識管理領域可視化分析。

  • 4 一文詳解達觀數據知識圖譜技術與應用。

  • 5 知識圖譜技術落地金融行業的關鍵四步。

  • 6 一文讀懂知識圖譜的商業應用進程及技術背景。

  • 7 海雲數據CPO王斌:打造大數據可視分析與AI應用的高科技企業。

  • 8 智能產業|《人工智能標準化白皮書2018》帶來創新創業新技術標準。

  • 9 國家語委重大科研項目“中華經典詩詞知識圖譜構建技術研究”開題。

  • 10 最全知識圖譜介紹:關鍵技術、開放數據集、應用案例彙總

  • 11 中譯語通Jove Mind知識圖譜平臺 引領企業智能化發展。

  • 12 知識圖譜:知識圖譜賦能企業數字化轉型,爲企業升級轉型注入新能量。

因爲我們的語料庫較小,方便起見,僅查看每個主題的前3個最具代表性的主題詞。

根據LSI的原理可知,“數據”、“技術”和“金融”都是相關詞(並且對第一個主題的方向貢獻最大),可大體推測該主題跟數據技術在金融領域的應用有關,那麼,文檔2、5跟該主題的相關性最大;根據第二個主題的TOP3主題詞(“企業”、“數據”、“商業”)可知,該主題主要談論企業將數據應用於商業實踐,那麼,文檔1、6、7、10、12跟該主題的相關性最大;以此類推,第三個主題討論的主要是(藉助數據技術)在商業領域的創新,尤其是金融方面的,那麼,文檔1、8跟該主題相關性最大。

由於LSI、LDA等主題模型在本質上屬於軟聚類(Soft Clustering),也就是說,每個主題上的概率就是文章對於這個主題的隸屬度,同一個文檔可能夾雜着多個主題,只是對應的各個主題的概率不同罷了。 上述文檔對應的主題應該是混合的,每個主題的概率大小不盡相同,在實際應用中,我們一般找出其中概率最大的一個主題。

for doc in corpus_lsi: # bow->tfidf轉換 和 tfidf->lsi轉換實際上是在這裏即時完成的

print(doc)

[(0, -0.17690867499072602), (1, -0.44016836447597885), (2, 0.7284335174782008)]
[(0, -0.821902042820486), (1, -0.03184788440523527), (2, -0.4098203903108002)]
[(0, -0.045384645077792767), (1, 0.10578780781807381), (2, 0.042559710380774426)]
[(0, -0.7515191768805072), (1, -0.08599404650088843), (2, 0.1452967034805242)]
[(0, -0.6136428537043512), (1, -0.28286688523868675), (2, -0.4818653950021932)]
[(0, -0.5104995586789475), (1, -0.5136313252286587), (2, 0.49976771121730945)]
[(0, -0.5441363960445108), (1, 0.6841975713452622), (2, 0.20580754225199666)]
[(0, -0.040719186823048786), (1, -0.21597858129605113), (2, 0.46786434413537753)]
[(0, -0.5608211518743773), (1, -0.3417930476335039), (2, -0.18966593031566448)]
[(0, -0.6084914634082519), (1, 0.44488378344921975), (2, 0.028910120373434968)]
[(0, -0.18200362025117117), (1, 0.5612899057224641), (2, 0.32933606191854775)]

[(0, -0.12032756763512721), (1, 0.4568857150530911), (2, 0.2925478388144471)]

TF-IDF和LDA等模型也可以用先前的方法進行本地化存儲:

lsi.save(os.path.join(TEMP_FOLDER, 'model.lsi'))

lsi = models.LsiModel.load(os.path.join(TEMP_FOLDER, 'model.lsi'))

2019-05-09 10:16:46,340 : INFO : saving Projection object under C:\Users\hp\AppData\Local\Temp\model.lsi.projection, separately None
2019-05-09 10:16:46,345 : INFO : saved C:\Users\hp\AppData\Local\Temp\model.lsi.projection
2019-05-09 10:16:46,347 : INFO : saving LsiModel object under C:\Users\hp\AppData\Local\Temp\model.lsi, separately None
2019-05-09 10:16:46,348 : INFO : not storing attribute projection
2019-05-09 10:16:46,349 : INFO : not storing attribute dispatcher
2019-05-09 10:16:46,351 : INFO : saved C:\Users\hp\AppData\Local\Temp\model.lsi
2019-05-09 10:16:46,353 : INFO : loading LsiModel object from C:\Users\hp\AppData\Local\Temp\model.lsi
2019-05-09 10:16:46,356 : INFO : loading id2word recursively from C:\Users\hp\AppData\Local\Temp\model.lsi.id2word.* with mmap=None
2019-05-09 10:16:46,357 : INFO : setting ignored attribute projection to None
2019-05-09 10:16:46,360 : INFO : setting ignored attribute dispatcher to None
2019-05-09 10:16:46,361 : INFO : loaded C:\Users\hp\AppData\Local\Temp\model.lsi
2019-05-09 10:16:46,364 : INFO : loading LsiModel object from C:\Users\hp\AppData\Local\Temp\model.lsi.projection
2019-05-09 10:16:46,366 : INFO : loaded C:\Users\hp\AppData\Local\Temp\model.lsi.projection

看到這裏,你可能會問:這些文檔之間的相似度怎樣?
如何利用LSI產生的文本特徵,對給定文檔的輸入文檔(不在模型的訓練語料庫中),根據文檔間的語義相似性對檢索結果進行相似度降序排列,並從中找到和輸入文檔最爲相似的文檔?
不要着急,筆者將會下面的文章中介紹基於LSI模型 文檔相似性查詢 (Similarity Queries Based LSI)。 此外 ,除了用於文檔檢索任務外,基於LSI模型(LSA和LDA也是一樣)提取的文本特徵可用於文本分類和文本聚類任務

最後,筆者在梳理下目前比較流行的 文本轉換模型 ,它們都可以用gensim的接口實現。

2. Gensim中可用的幾種文本數據轉換模型(Available Transformations Model in Gensim)

gensim這個庫中,有幾種常見的詞向量空間算法(Vector Space Model Algorithms),下面且聽筆者娓娓道來:

2.1 詞頻-逆向文件頻率(Term Frequency * Inverse Document Frequency)

TF-IDF模型需要一個基於詞袋錶示(Bag-of-Words  Representation )的 訓練語料庫來進行初始化。在數據轉換期間,它採用向量作爲輸入並返回另一個具有相同維度的向量,只有在訓練語料庫中出現較少的特徵(出現越少對文檔的代表性就越強)才能增加該數值。因此,TF-IDF模型將整型向量轉換爲實值向量(比如[(1,2),(0,10),(4,2),(5,1)]轉換爲[(1,0.002),(0,0.121),(4,0.0401),(5,0.5241)]),且保持維度的數量不變。值得注意的是,該模型返回的結果還可以將得到的向量歸一化爲(歐幾里得)單位長度,使(詞彙權重)值介於0到1之間。

model = models.TfidfModel(corpus, normalize=True)

2.2 潛在語義索引(LSI)

LSI將文檔從詞袋錶示( Bag-of-Words  Representation ,優先選擇詞袋錶示,經大量實驗,這樣得到的效果較好)或者TF-IDF加權空間轉換爲較低維度的潛在向量空間。對於上面的示例語料庫,我們只使用了3個潛在維度(Latent Dimensions),但在實際語料庫處理中,建議將200-500的目標維度作爲“黃金標準”[詳情見參考資料1]。

model = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=6)
2019-05-09 10:16:51,102 : INFO : using serial LSI version on this node
2019-05-09 10:16:51,103 : INFO : updating model with new documents
2019-05-09 10:16:51,105 : INFO : preparing a new chunk of documents
2019-05-09 10:16:51,107 : INFO : using 100 extra samples and 2 power iterations
2019-05-09 10:16:51,108 : INFO : 1st phase: constructing (12, 106) action matrix
2019-05-09 10:16:51,108 : INFO : orthonormalizing (12, 106) action matrix
2019-05-09 10:16:51,110 : INFO : 2nd phase: running dense svd on (12, 12) matrix
2019-05-09 10:16:51,111 : INFO : computing the final decomposition
2019-05-09 10:16:51,112 : INFO : keeping 6 factors (discarding 15.684% of energy spectrum)
2019-05-09 10:16:51,113 : INFO : processed documents up to #12
2019-05-09 10:16:51,115 : INFO : topic #0(1.715): 0.590*"數據" + 0.540*"技術" + 0.406*"金融" + 0.316*"一文" + 0.169*"商業" + 0.163*"企業" + 0.160*"知識圖譜" + 0.109*"分析" + 0.041*"創新" + 0.036*"轉型"
2019-05-09 10:16:51,116 : INFO : topic #1(1.382): -0.565*"企業" + -0.449*"數據" + 0.385*"商業" + 0.351*"技術" + -0.217*"分析" + 0.216*"創新" + 0.215*"一文" + -0.208*"轉型" + 0.146*"金融" + -0.038*"知識"
2019-05-09 10:16:51,118 : INFO : topic #2(1.302): 0.580*"商業" + 0.468*"創新" + -0.444*"金融" + 0.330*"企業" + 0.264*"一文" + -0.198*"技術" + 0.150*"轉型" + 0.075*"分析" + 0.026*"數據" + 0.018*"知識圖譜"
2019-05-09 10:16:51,121 : INFO : topic #3(1.173): 0.561*"數據" + -0.553*"企業" + -0.386*"轉型" + -0.326*"金融" + -0.272*"技術" + 0.179*"一文" + 0.095*"分析" + -0.073*"知識圖譜" + -0.040*"創新" + 0.034*"知識"
2019-05-09 10:16:51,123 : INFO : topic #4(1.090): 0.685*"創新" + -0.499*"一文" + 0.421*"金融" + -0.221*"技術" + 0.163*"數據" + -0.097*"轉型" + -0.095*"企業" + 0.069*"分析" + 0.045*"知識" + 0.045*"管理"

將模型訓練得出的主題展示出來:

model.print_topics()
2019-05-09 10:16:53,259 : INFO : topic #0(1.715): 0.590*"數據" + 0.540*"技術" + 0.406*"金融" + 0.316*"一文" + 0.169*"商業" + 0.163*"企業" + 0.160*"知識圖譜" + 0.109*"分析" + 0.041*"創新" + 0.036*"轉型"
2019-05-09 10:16:53,261 : INFO : topic #1(1.382): -0.565*"企業" + -0.449*"數據" + 0.385*"商業" + 0.351*"技術" + -0.217*"分析" + 0.216*"創新" + 0.215*"一文" + -0.208*"轉型" + 0.146*"金融" + -0.038*"知識"
2019-05-09 10:16:53,263 : INFO : topic #2(1.302): 0.580*"商業" + 0.468*"創新" + -0.444*"金融" + 0.330*"企業" + 0.264*"一文" + -0.198*"技術" + 0.150*"轉型" + 0.075*"分析" + 0.026*"數據" + 0.018*"知識圖譜"
2019-05-09 10:16:53,264 : INFO : topic #3(1.173): 0.561*"數據" + -0.553*"企業" + -0.386*"轉型" + -0.326*"金融" + -0.272*"技術" + 0.179*"一文" + 0.095*"分析" + -0.073*"知識圖譜" + -0.040*"創新" + 0.034*"知識"
2019-05-09 10:16:53,266 : INFO : topic #4(1.090): 0.685*"創新" + -0.499*"一文" + 0.421*"金融" + -0.221*"技術" + 0.163*"數據" + -0.097*"轉型" + -0.095*"企業" + 0.069*"分析" + 0.045*"知識" + 0.045*"管理"
2019-05-09 10:16:53,267 : INFO : topic #5(1.003): -0.670*"知識" + -0.670*"管理" + -0.265*"分析" + 0.141*"數據" + -0.074*"技術" + 0.063*"創新" + 0.037*"轉型" + -0.030*"商業" + 0.023*"企業" + -0.012*"知識圖譜"
[(0,
'0.590*"數據" + 0.540*"技術" + 0.406*"金融" + 0.316*"一文" + 0.169*"商業" + 0.163*"企業" + 0.160*"知識圖譜" + 0.109*"分析" + 0.041*"創新" + 0.036*"轉型"'),
(1,
'-0.565*"企業" + -0.449*"數據" + 0.385*"商業" + 0.351*"技術" + -0.217*"分析" + 0.216*"創新" + 0.215*"一文" + -0.208*"轉型" + 0.146*"金融" + -0.038*"知識"'),
(2,
'0.580*"商業" + 0.468*"創新" + -0.444*"金融" + 0.330*"企業" + 0.264*"一文" + -0.198*"技術" + 0.150*"轉型" + 0.075*"分析" + 0.026*"數據" + 0.018*"知識圖譜"'),
(3,
'0.561*"數據" + -0.553*"企業" + -0.386*"轉型" + -0.326*"金融" + -0.272*"技術" + 0.179*"一文" + 0.095*"分析" + -0.073*"知識圖譜" + -0.040*"創新" + 0.034*"知識"'),
(4,
'0.685*"創新" + -0.499*"一文" + 0.421*"金融" + -0.221*"技術" + 0.163*"數據" + -0.097*"轉型" + -0.095*"企業" + 0.069*"分析" + 0.045*"知識" + 0.045*"管理"'),
(5,
'-0.670*"知識" + -0.670*"管理" + -0.265*"分析" + 0.141*"數據" + -0.074*"技術" + 0.063*"創新" + 0.037*"轉型" + -0.030*"商業" + 0.023*"企業" + -0.012*"知識圖譜"')]

LSI模型訓練的獨特之處在於: 我們可以在任何時間對模型進行 再次訓練 ,只需提供更多用於 訓練 的語料。它通過一種稱爲 在線訓練/學習 增量訓練/學習 (Online Training/Online Learning或者Incremental Training/Incremental Learning 的過程來完成,該過程對底層模型(Underlying Model)進行增量更新。由於這個特性,輸入的文檔流(Document Stream)甚至可能是無窮無盡的 --- 只要在LSI模型需要語料時再喂進新文檔,對訓練模型 保持 持續性的新文檔輸入。

增量學習的使用方法說明:

model.add_documents(another_tfidf_corpus) # 現在LSI模型已經在tfidf_corpus + 另一個tfidf_corpus上進行訓練了

lsi_vec = model[tfidf_vec] # 將一個新文檔轉換到LSI空間,但不影響模型

model.add_documents(more_documents) # tfidf_corpus + another_tfidf_corpus + 更多的文檔 lsi_vec = model[tfidf_vec]

詳情請參閱 gensim.models.lsimodel 的接口文檔,瞭解如何使LSI逐漸“忘記”源源不斷的文檔流中的陳舊信息。調節該接口中的一些參數可能會影響運行的速度、內存的使用率以及LSI算法的數值精度。

gensim在很多模型上使用了一種新穎的在線增量流分佈式訓練算法(Online Incremental Streamed Distributed Training Algorithm,相當拗口的說辭!),如果想了解該算法的細節,請參看結尾[參考資料5]中的論文。

2.3 隨機映射(Random Projections)

RP算法旨在減少向量空間的維度。這是一種非常有效的(對內存和CPU友好)方法,通過加入一點隨機性來近似表示文檔之間的TF-IDF距離。比較推薦的目標維度最好是幾百/幾千,具體數值取決於語料庫的大小。

model = models.RpModel(corpus_tfidf, num_topics=3)
2019-05-09 10:16:56,243 : INFO : no word id mapping provided; initializing from corpus, assuming identity
2019-05-09 10:16:56,248 : INFO : constructing (3, 12) random matrix
model.num_topics #主題數有多少?
model.num_terms  #主題模型中參與訓練的詞彙數有多少?

12

2.4 隱狄利克雷分配模型(Latent Dirichlet Allocation, LDA)

LDA是另一種從詞袋錶示轉變爲低維度主題空間的文本數據轉換模型。LDA是LSA(也稱爲多項PCA)的概率擴展(Probabilistic Extension),因此LDA的主題可以解釋爲詞彙的概率分佈。與LSA一樣,這些分佈也是從訓練語料庫中自動推斷出來的,不需要人爲介入。文檔又被解釋爲這些主題的(軟)混合,這跟LSI和LSA一樣。

model = models.LdaModel(corpus, id2word=dictionary, num_topics=3)
2019-05-09 10:17:01,014 : INFO : using symmetric alpha at 0.3333333333333333
2019-05-09 10:17:01,017 : INFO : using symmetric eta at 0.3333333333333333
2019-05-09 10:17:01,018 : INFO : using serial LDA version on this node
2019-05-09 10:17:01,020 : INFO : running online (single-pass) LDA training, 3 topics, 1 passes over the supplied corpus of 12 documents, updating model once every 12 documents, evaluating perplexity every 12 documents, iterating 50x with a convergence threshold of 0.001000
2019-05-09 10:17:01,021 : WARNING : too few updates, training might not converge; consider increasing the number of passes or iterations to improve accuracy
2019-05-09 10:17:01,112 : INFO : -3.650 per-word bound, 12.6 perplexity estimate based on a held-out corpus of 12 documents with 42 words
2019-05-09 10:17:01,113 : INFO : PROGRESS: pass 0, at document #12/12
2019-05-09 10:17:01,124 : INFO : topic #0 (0.333): 0.189*"技術" + 0.187*"知識圖譜" + 0.167*"一文" + 0.104*"數據" + 0.098*"商業" + 0.075*"創新" + 0.039*"金融" + 0.033*"企業" + 0.027*"分析" + 0.027*"知識"
2019-05-09 10:17:01,125 : INFO : topic #1 (0.333): 0.281*"知識圖譜" + 0.101*"企業" + 0.094*"技術" + 0.072*"轉型" + 0.072*"管理" + 0.072*"知識" + 0.071*"商業" + 0.070*"數據" + 0.066*"金融" + 0.048*"創新"
2019-05-09 10:17:01,127 : INFO : topic #2 (0.333): 0.271*"數據" + 0.154*"企業" + 0.148*"分析" + 0.064*"知識圖譜" + 0.054*"創新" + 0.052*"技術" + 0.047*"商業" + 0.044*"一文" + 0.043*"金融" + 0.041*"知識"
2019-05-09 10:17:01,128 : INFO : topic diff=1.179380, rho=1.000000

展示主題模型中的各個主體及其主題詞分佈情況:

model.show_topics()
[(0,
  '0.189*"技術" + 0.187*"知識圖譜" + 0.167*"一文" + 0.104*"數據" + 0.098*"商業" + 0.075*"創新" + 0.039*"金融" + 0.033*"企業" + 0.027*"分析" + 0.027*"知識"'),
 (1,
  '0.281*"知識圖譜" + 0.101*"企業" + 0.094*"技術" + 0.072*"轉型" + 0.072*"管理" + 0.072*"知識" + 0.071*"商業" + 0.070*"數據" + 0.066*"金融" + 0.048*"創新"'),
 (2,
  '0.271*"數據" + 0.154*"企業" + 0.148*"分析" + 0.064*"知識圖譜" + 0.054*"創新" + 0.052*"技術" + 0.047*"商業" + 0.044*"一文" + 0.043*"金融" + 0.041*"知識"')]

gensim這個庫採用一種叫做在線學習(Online Learning)的策略實現,運行速度較快,它還可以以分佈式模式(Distributed Mode)在計算機集羣上運行,詳情請參看參考文獻[2]。

2.5 層次狄利克雷過程(Hierarchical Dirichlet Process, HDP)

HDP是一種非參數貝葉斯方法(跟其他的主題模型不同,它不需要事先確定主題的數量),它對於想偷懶的同學來說,簡直是福音!以下是它的接口調用方法:

model = models.HdpModel(corpus, id2word=dictionary)
2019-05-09 10:17:05,932 : INFO : (0, '0.229*轉型 + 0.181*管理 + 0.172*一文 + 0.107*知識 + 0.088*商業 + 0.085*知識圖譜 + 0.052*技術 + 0.028*企業 + 0.026*分析 + 0.023*創新')
2019-05-09 10:17:05,936 : INFO : (1, '0.294*創新 + 0.158*轉型 + 0.139*知識圖譜 + 0.088*知識 + 0.075*金融 + 0.074*管理 + 0.060*商業 + 0.055*數據 + 0.037*一文 + 0.012*技術')
2019-05-09 10:17:05,938 : INFO : (2, '0.381*金融 + 0.140*知識 + 0.129*創新 + 0.103*技術 + 0.093*企業 + 0.050*數據 + 0.034*商業 + 0.031*分析 + 0.024*轉型 + 0.006*一文')
2019-05-09 10:17:05,939 : INFO : (3, '0.239*知識 + 0.234*分析 + 0.180*金融 + 0.086*數據 + 0.084*創新 + 0.069*一文 + 0.041*知識圖譜 + 0.038*轉型 + 0.025*管理 + 0.002*商業')
2019-05-09 10:17:05,941 : INFO : (4, '0.250*轉型 + 0.199*管理 + 0.167*技術 + 0.145*企業 + 0.069*商業 + 0.054*一文 + 0.042*知識圖譜 + 0.021*創新 + 0.020*金融 + 0.018*數據')
2019-05-09 10:17:05,943 : INFO : (5, '0.205*技術 + 0.166*企業 + 0.124*商業 + 0.118*轉型 + 0.107*數據 + 0.069*金融 + 0.068*創新 + 0.046*管理 + 0.034*一文 + 0.027*分析')
2019-05-09 10:17:05,944 : INFO : (6, '0.250*企業 + 0.163*金融 + 0.113*創新 + 0.099*知識 + 0.090*數據 + 0.057*轉型 + 0.055*一文 + 0.044*商業 + 0.043*分析 + 0.043*管理')
2019-05-09 10:17:05,948 : INFO : (7, '0.311*一文 + 0.247*創新 + 0.129*金融 + 0.078*知識 + 0.073*商業 + 0.058*數據 + 0.038*技術 + 0.022*分析 + 0.015*管理 + 0.013*轉型')
2019-05-09 10:17:05,949 : INFO : (8, '0.156*知識圖譜 + 0.144*創新 + 0.142*轉型 + 0.102*金融 + 0.089*商業 + 0.071*數據 + 0.059*知識 + 0.057*管理 + 0.056*企業 + 0.050*分析')
2019-05-09 10:17:05,951 : INFO : (9, '0.215*創新 + 0.191*技術 + 0.178*分析 + 0.094*知識 + 0.070*管理 + 0.063*企業 + 0.051*商業 + 0.038*金融 + 0.034*知識圖譜 + 0.029*數據')
2019-05-09 10:17:05,952 : INFO : (10, '0.346*一文 + 0.164*商業 + 0.150*管理 + 0.110*分析 + 0.090*知識圖譜 + 0.042*企業 + 0.033*數據 + 0.022*創新 + 0.022*技術 + 0.011*金融')
2019-05-09 10:17:05,953 : INFO : (11, '0.216*金融 + 0.165*商業 + 0.140*分析 + 0.082*知識圖譜 + 0.079*轉型 + 0.074*知識 + 0.068*數據 + 0.059*企業 + 0.042*創新 + 0.035*一文')
2019-05-09 10:17:05,955 : INFO : (12, '0.397*轉型 + 0.120*創新 + 0.110*技術 + 0.101*分析 + 0.069*金融 + 0.057*商業 + 0.050*知識 + 0.028*知識圖譜 + 0.025*一文 + 0.023*企業')
2019-05-09 10:17:05,956 : INFO : (13, '0.299*分析 + 0.274*一文 + 0.121*數據 + 0.087*創新 + 0.061*金融 + 0.059*企業 + 0.043*知識圖譜 + 0.014*知識 + 0.014*管理 + 0.012*商業')
2019-05-09 10:17:05,958 : INFO : (14, '0.185*商業 + 0.144*創新 + 0.108*轉型 + 0.100*管理 + 0.098*一文 + 0.092*分析 + 0.072*數據 + 0.060*金融 + 0.053*企業 + 0.036*技術')
2019-05-09 10:17:05,958 : INFO : (15, '0.235*轉型 + 0.163*商業 + 0.140*企業 + 0.102*技術 + 0.074*數據 + 0.072*分析 + 0.067*管理 + 0.046*知識 + 0.039*一文 + 0.027*知識圖譜')
2019-05-09 10:17:05,959 : INFO : (16, '0.165*商業 + 0.164*管理 + 0.159*分析 + 0.126*數據 + 0.109*創新 + 0.079*企業 + 0.066*知識圖譜 + 0.041*技術 + 0.038*知識 + 0.029*一文')
2019-05-09 10:17:05,961 : INFO : (17, '0.204*管理 + 0.193*知識圖譜 + 0.166*一文 + 0.163*轉型 + 0.088*創新 + 0.048*知識 + 0.045*金融 + 0.038*商業 + 0.020*企業 + 0.016*數據')
2019-05-09 10:17:05,962 : INFO : (18, '0.225*企業 + 0.136*金融 + 0.136*技術 + 0.099*知識 + 0.098*商業 + 0.095*一文 + 0.078*創新 + 0.076*管理 + 0.034*知識圖譜 + 0.019*分析')

2019-05-09 10:17:05,963 : INFO : (19, '0.232*企業 + 0.205*一文 + 0.121*技術 + 0.089*金融 + 0.076*數據 + 0.076*創新 + 0.075*轉型 + 0.069*商業 + 0.017*管理 + 0.016*分析')

model.num_topics  # 該模型自動生成 主題數有多少?

20

展示 HDP 主題模型中的各個主題及其主題詞分佈情況:

model.show_topics()  #
[(0,
'0.229*轉型 + 0.181*管理 + 0.172*一文 + 0.107*知識 + 0.088*商業 + 0.085*知識圖譜 + 0.052*技術 + 0.028*企業 + 0.026*分析 + 0.023*創新 + 0.008*數據 + 0.000*金融'),
(1,
'0.294*創新 + 0.158*轉型 + 0.139*知識圖譜 + 0.088*知識 + 0.075*金融 + 0.074*管理 + 0.060*商業 + 0.055*數據 + 0.037*一文 + 0.012*技術 + 0.004*企業 + 0.004*分析'),
(2,
'0.381*金融 + 0.140*知識 + 0.129*創新 + 0.103*技術 + 0.093*企業 + 0.050*數據 + 0.034*商業 + 0.031*分析 + 0.024*轉型 + 0.006*一文 + 0.005*知識圖譜 + 0.004*管理'),
(3,
'0.239*知識 + 0.234*分析 + 0.180*金融 + 0.086*數據 + 0.084*創新 + 0.069*一文 + 0.041*知識圖譜 + 0.038*轉型 + 0.025*管理 + 0.002*商業 + 0.001*技術 + 0.001*企業'),
(4,
'0.250*轉型 + 0.199*管理 + 0.167*技術 + 0.145*企業 + 0.069*商業 + 0.054*一文 + 0.042*知識圖譜 + 0.021*創新 + 0.020*金融 + 0.018*數據 + 0.013*分析 + 0.003*知識'),
(5,
'0.205*技術 + 0.166*企業 + 0.124*商業 + 0.118*轉型 + 0.107*數據 + 0.069*金融 + 0.068*創新 + 0.046*管理 + 0.034*一文 + 0.027*分析 + 0.019*知識圖譜 + 0.017*知識'),
(6,
'0.250*企業 + 0.163*金融 + 0.113*創新 + 0.099*知識 + 0.090*數據 + 0.057*轉型 + 0.055*一文 + 0.044*商業 + 0.043*分析 + 0.043*管理 + 0.039*知識圖譜 + 0.004*技術'),
(7,
'0.311*一文 + 0.247*創新 + 0.129*金融 + 0.078*知識 + 0.073*商業 + 0.058*數據 + 0.038*技術 + 0.022*分析 + 0.015*管理 + 0.013*轉型 + 0.010*知識圖譜 + 0.006*企業'),
(8,
'0.156*知識圖譜 + 0.144*創新 + 0.142*轉型 + 0.102*金融 + 0.089*商業 + 0.071*數據 + 0.059*知識 + 0.057*管理 + 0.056*企業 + 0.050*分析 + 0.038*技術 + 0.037*一文'),
(9,
'0.215*創新 + 0.191*技術 + 0.178*分析 + 0.094*知識 + 0.070*管理 + 0.063*企業 + 0.051*商業 + 0.038*金融 + 0.034*知識圖譜 + 0.029*數據 + 0.019*一文 + 0.017*轉型'),
(10,
'0.346*一文 + 0.164*商業 + 0.150*管理 + 0.110*分析 + 0.090*知識圖譜 + 0.042*企業 + 0.033*數據 + 0.022*創新 + 0.022*技術 + 0.011*金融 + 0.007*知識 + 0.002*轉型'),
(11,
'0.216*金融 + 0.165*商業 + 0.140*分析 + 0.082*知識圖譜 + 0.079*轉型 + 0.074*知識 + 0.068*數據 + 0.059*企業 + 0.042*創新 + 0.035*一文 + 0.032*管理 + 0.009*技術'),
(12,
'0.397*轉型 + 0.120*創新 + 0.110*技術 + 0.101*分析 + 0.069*金融 + 0.057*商業 + 0.050*知識 + 0.028*知識圖譜 + 0.025*一文 + 0.023*企業 + 0.019*數據 + 0.001*管理'),
(13,
'0.299*分析 + 0.274*一文 + 0.121*數據 + 0.087*創新 + 0.061*金融 + 0.059*企業 + 0.043*知識圖譜 + 0.014*知識 + 0.014*管理 + 0.012*商業 + 0.009*轉型 + 0.009*技術'),
(14,
'0.185*商業 + 0.144*創新 + 0.108*轉型 + 0.100*管理 + 0.098*一文 + 0.092*分析 + 0.072*數據 + 0.060*金融 + 0.053*企業 + 0.036*技術 + 0.032*知識 + 0.020*知識圖譜'),
(15,
'0.235*轉型 + 0.163*商業 + 0.140*企業 + 0.102*技術 + 0.074*數據 + 0.072*分析 + 0.067*管理 + 0.046*知識 + 0.039*一文 + 0.027*知識圖譜 + 0.025*創新 + 0.010*金融'),
(16,
'0.165*商業 + 0.164*管理 + 0.159*分析 + 0.126*數據 + 0.109*創新 + 0.079*企業 + 0.066*知識圖譜 + 0.041*技術 + 0.038*知識 + 0.029*一文 + 0.014*金融 + 0.011*轉型'),
(17,
'0.204*管理 + 0.193*知識圖譜 + 0.166*一文 + 0.163*轉型 + 0.088*創新 + 0.048*知識 + 0.045*金融 + 0.038*商業 + 0.020*企業 + 0.016*數據 + 0.015*分析 + 0.004*技術'),
(18,
'0.225*企業 + 0.136*金融 + 0.136*技術 + 0.099*知識 + 0.098*商業 + 0.095*一文 + 0.078*創新 + 0.076*管理 + 0.034*知識圖譜 + 0.019*分析 + 0.004*數據 + 0.001*轉型'),
(19,

'0.232*企業 + 0.205*一文 + 0.121*技術 + 0.089*金融 + 0.076*數據 + 0.076*創新 + 0.075*轉型 + 0.069*商業 + 0.017*管理 + 0.016*分析 + 0.012*知識圖譜 + 0.012*知識')]

從上面的示例中可以看到,添加新的向量空間轉換(Vetor Space Modle Transformations)(比如不同的加權策略)相當簡單; 有關更多信息和示例,請參閱gensim的API參考或參閱各類庫的源代碼。

值得重申的是,這些都是獨特的增量實現,不需要一次性將整個訓練語料庫載入到本地內存中。另外,如果你有多個CPU和較大的內存,你可以採用分佈式計算,最大限度的提高計算效率。好了,打了這麼多的基礎以後,我們可以進入到第一個實際應用的環節 - 相似文本檢索,給定一個待查語句和一系列的相關文檔,從這些文檔中找到和待查語句相似度最高的一個來。

在下一篇文章中,筆者會接着本次的主題,聊聊基於LSI模型抽取的文本特徵進行文檔相似性檢索,也就是給定一個新文檔,在已有的語料庫中找到和它語義或主題最爲相似的文檔。

參考資料:
[1] Bradford. 2008. An empirical study of required dimensionality for large-scale latent semantic indexing applications.
[2] Hoffman, Blei, Bach. 2010. Online learning for Latent Dirichlet Allocation.
[3] Wang, Paisley, Blei. 2011. Online variational inference for the hierarchical Dirichlet process.
[4] Halko, Martinsson, Tropp. 2009. Finding structure with randomness.
[5] Řehůřek. 2011. Subspace tracking for Latent Semantic Analysis.

推薦閱讀

這個NLP工具,玩得根本停不下來

徵稿啓示| 200元稿費+5000DBC(價值20個小時GPU算力)

文本自動摘要任務的“不完全”心得總結番外篇——submodular函數優化

Node2Vec 論文+代碼筆記

模型壓縮實踐收尾篇——模型蒸餾以及其他一些技巧實踐小結

中文命名實體識別工具(NER)哪家強?

學自然語言處理,其實更應該學好英語

斯坦福大學NLP組Python深度學習自然語言處理工具Stanza試用

關於AINLP

AINLP 是一個有趣有AI的自然語言處理社區,專注於 AI、NLP、機器學習、深度學習、推薦算法等相關技術的分享,主題包括文本摘要、智能問答、聊天機器人、機器翻譯、自動生成、知識圖譜、預訓練模型、推薦系統、計算廣告、招聘信息、求職經驗分享等,歡迎關注!加技術交流羣請添加AINLPer(id:ainlper),備註工作/研究方向+加羣目的。

閱讀至此了,分享、點贊、在看三選一吧:pray:

相關文章