您的位置:首页 > 编程语言 > Python开发

Gensim Tutorials(一)

2015-10-22 09:44 567 查看

前言

最近一直在看文本方面的东西,虽然好理解,但是总感觉缺了点什么,意外中发现了一个不错的开源工具包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整个工具包的使用得心应手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 开源工具