Gensim Tutorials(一)

前言

最近一直在看文本方面的東西,雖然好理解,但是總感覺缺了點什麼,意外中發現了一個不錯的開源工具包gensim,它是基於python的文本挖掘工具,主要是topic model的實現,粗看了一下,感覺非常方便,所以就想學習一下這個工具,本文檔主要是對Tutorials中的代碼進行了註釋,以備以後使用。

From Strings to Vectors

#文檔內容,每一行就是一篇文檔
documents = ["Human machine interface for lab abc computer applications",
             "A survey of user opinion of computer system response time",
             "The EPS user interface management system",
             "System and human system engineering testing of EPS",
             "Relation of user perceived response time to error measurement",
             "The generation of random binary unordered trees",
             "The intersection graph of paths in trees",
             "Graph minors IV Widths of trees and well quasi ordering",
             "Graph minors A survey"]
#停用詞列表
stoplist = set('for a of the and to in'.split())
#返回一個二維列表,每一個列表都是去除停用詞之後的文檔詞列表
texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents]
#collections是內建模塊,defaultdict是封裝之後的dict,區別在於defaultdict在key不存在時並不報錯
from collections import defaultdict

frequency = defaultdict(int)    #表示所有的value都是int類型
for text in texts:
    for token in text:
        frequency[token] += 1
#過濾掉次數<=1的單詞
texts = [[word for word in text if frequency[word] > 1] for text in texts]
#pprint是pythonn內建模塊,提供了打印各種數據結構的方法
from pprint import pprint
pprint(texts)
'''
Dictionary是dict的一個實現,是word與word_ids的映射
主要方法   doc2bow  將文檔轉化爲詞袋模型,即list (word_ids,word_frequency)<---二元組,不設置allow_update,就不會更新原有的list
token2id,{word1:word_ids1, word2:word_ids2,……},這裏的ids就是下面矩陣的列
'''
dictionary = corpora.Dictionary(texts)
dictionary.save("deerwester.dict")
print(dictionary)
print(dictionary.token2id)

new_doc = "Human computer interaction"
new_vec = dictionary.doc2bow(new_doc.lower().split())
print(new_vec)

corpus = [dictionary.doc2bow(text) for text in texts]
'''
MmCorpus是一種語料格式,每一個列表表示一篇文檔,(word_id,word_frequency)
%%MatrixMarket matrix coordinate real general
m n frequency        
m:行(即第m篇文檔)   n:詞的ids,  frequency:出現次數
表示第m篇文章dic中ids爲n的詞出現了frequency次
'''
corpora.MmCorpus.serialize('deerwester.mm',corpus)
print(corpus)

Corpus Streaming – One Document at a Time

'''
定義了一個類來讀取語料mycorpus.txt,使用yield保證每次只讀一行進入內存
'''
class MyCorpus(object):
    def __iter__(self):
        for line in open('mycorpus.txt'):
            yield dictionary.doc2bow(line.lower().split())

corpus_memory_friendly = MyCorpus()
print(corpus_memory_friendly)
#每次循環時,執行一次MyCorpus的__iter__函數
for vector in corpus_memory_friendly:
    print(vector)
#同樣可以起到分批讀進內存的效果
dictionary = corpora.Dictionary(line.lower().split() for line in open('mycorpus.txt'))
#得到所有停用詞的ids
stop_ids = [dictionary.token2id[stopword] for stopword in stoplist if stopword in dictionary.token2id]
#dictionary.dfs-->{(tokenId,docFreq),……}  tokenId對應的詞在幾篇文檔中出現過
once_ids = [tokenid for tokenid, docfreq in dictionary.dfs.iteritems() if docfreq == 1]
#過濾掉stop_ids與once_ids集合所對應的所有mapping
dictionary.filter_tokens(stop_ids+once_ids)
#重新分配所有單詞的ids,減小矩陣稀疏
dictionary.compactify()
print(dictionary)

Corpus Formats

#創建一個python原生列表,表徵兩個文檔
corpus = [[(1,1)],[(2,2)],[(2,3),(5,2),(9,2)],[(8,3)]]
#Matrix Market格式,具體見上
corpora.MmCorpus.serialize('corpus.mm', corpus)
'''
SVM^light數據格式
#-1 1:0.43 3:0.12 9284:0.2    #abcdef  
#-1爲分類標識,可取(+1、-1、0),m:n表示第m個特徵的值爲0.43,#abcdef表示額外的信息
'''
corpora.SvmLightCorpus.serialize('corpus.svmlight', corpus)
'''
Blei的LDA主題模型c語言版本格式
N fieldId1:fieldValue1 fieldId2:fieldValue2 ... fieldIdN:fieldValueN
N代表個數,id:value
其存在一個單詞表,每個單詞一行,行號就是單詞的id
'''
corpora.BleiCorpus.serialize('corpus.lda-c', corpus)
'''
[M]      文檔個數
[document1]
[document2]
...
[documentM]  
[documenti] = [wordi1] [wordi2] ... [wordiNi]
真正的詞袋子,不統計個數,每一行相當於單詞集
'''
corpora.LowCorpus.serialize('corpus.low', corpus)
#加載格式文件到stream中
corpus = corpora.MmCorpus("corpus.mm")
print(list(corpus))
for doc in corpus:
    print(doc)

Compatibility with NumPy and SciPy

import numpy as np
numpy_matrix = np.mat([[1,5],[3,4]])
corpus = gensim.matutils.Dense2Corpus(numpy_matrix)
print("----------------numpy mat 2 gensim corpus --------------------")
print(list(corpus))
#num_terms是特徵的維數,即轉化成matrix的行
numpy_matrix = gensim.matutils.corpus2dense(corpus, num_terms=2)
print("----------------gensim corpus 2 numpy mat--------------------")
print(numpy_matrix)

from scipy.sparse import coo_matrix
scipy_matrix = coo_matrix([[1,2,0],[2,2,1],[3,4,3]])
corpus = gensim.matutils.Sparse2Corpus(scipy_matrix)
print("----------------scipy mat 2 gensim corpus--------------------")
print(list(corpus))
scipy_matrix = gensim.matutils.corpus2csc(corpus)
print("----------------gensim corpus 2 scipy mat--------------------")
print(scipy_matrix)

後續

Tutorials後面還有幾篇,繼續進行註釋,註釋結束後會對gensim整個工具包的使用得心應手。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章