前言
作为自然语言爱好者,那就必不可少的需要认识一下大名鼎鼎的Gensim。
Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐藏层的主题向量表达。
它支持包括TF-IDF,LSA,LDA和word2vec在内的多种主题模型算法。
支持流式训练,并提供了诸如相似性计算,信息检索等一些常用任务的API接口。
一,基本概念
1.语料(Corpus):一组原始文本的集合,用于无监督地悬链文本主题的隐层结构。语料中不需要人工标注的附加信息,在Gensim中,Corpus通常是一个可迭代的对象(比如链表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。
2.向量(Vector):由一组文本特征构成的列表,是一段文本在Gensim中的内部表达。
3.模型(model):是一个抽象的术语,定义了两个向量空间的转换(即从文本的一种向量表达变换为另一种向量表达)。
二、语料与预处理(步骤一)
由于Gensim使用python语言开发,为了减少安装中的 繁琐,直接使用anaconda工具进行集中安装,输入pip install gensim.
训练语料的预处理指的是将文档中原始的字符串文本转换成Gensim模型所能理解的稀疏向量的过程。
通常,我们处理的原生语料是一堆文档的集合,每一篇文档优势一些原生字符串的集合,在交给Gensim的模型训练之前,我们需要将这些文档进行分词,去除停用词。得到每一篇的特征列表。例如,在词袋模型中,文档的特征就是其包含的word。
texts = [['human', 'interface', 'computer'], ['survey', 'user', 'computer', 'system', 'response', 'time'], ['eps', 'user', 'interface', 'system'], ['system', 'human', 'system', 'eps'], ['user', 'response', 'time'], ['trees'], ['graph', 'trees'], ['graph', 'minors', 'trees'], ['graph', 'minors', 'survey']]
其中corpus的每一个元素代表一篇文档。
接下来,我们可以调用Gensim提供的API建立语料特征(此处即是word)的索引字典,并将原始的文本特征的原始表达转化成词袋模型对应的稀疏向量的表达。依然以词袋模型为例:
from gensim import corpora dictionary = corpora.Dictionary(texts) corpus = [dictionary.doc2bow(text) for text in texts] print corpus[0] # [(0, 1), (1, 1), (2, 1)]
到这里,训练语料的语处理工作就完成了,我们得到了语料中每一篇文档对应的稀疏向量(这里是bow向量);向量的每一个元素代表了一个word在这篇文章中出现的次数,值的注意的是,虽然词袋模型是很多主题模型的基本假设,这里介绍的doc2bow函数并不是将文本转化成稀疏向量的唯一途径,以后我们介绍更过的向量变换函数。
最后,处于内存优化的考虑,Gensim支持文档的流式处理,我们需要做的,知识将上面的列表封装成一个python迭代器,每一次迭代都返回一个稀疏向量即可。
class MyCorpus(object): def __iter__(self): for line in open('mycorpus.txt'): # assume there's one document per line, tokens separated by whitespace yield dictionary.doc2bow(line.lower().split())
三、主题向量的变换