In [1]:
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

快速例子

下面我们尝试导入gensim并创建包含$9$个文档的语料库,共有$12$个特征


In [2]:
from gensim import corpora, models, similarities


corpus = [[(0, 1.0), (1, 1.0), (2, 1.0)],
          [(2, 1.0), (3, 1.0), (4, 1.0), (5, 1.0), (6, 1.0), (8, 1.0)],
          [(1, 1.0), (3, 1.0), (4, 1.0), (7, 1.0)],
          [(0, 1.0), (4, 2.0), (7, 1.0)],
          [(3, 1.0), (5, 1.0), (6, 1.0)],
          [(9, 1.0)],
          [(9, 1.0), (10, 1.0)],
          [(9, 1.0), (10, 1.0), (11, 1.0)],
          [(8, 1.0), (10, 1.0), (11, 1.0)]]

语料corpora就是一系列文档的集合,其中的词已经使用了字典进行相应的转换,成为一个个数字,我们可以通过字典的对应关系从数字找到对应的词。语料中的每个项对应着每一篇使用稀疏向量表示的文档。后面我们会谈谈何为向量空间模型(Vector Space Model)。如果你熟悉向量空间模型,你可能已经知道了是如何parse文档的方式,分词的好坏直接影响到后续的应用。

在例子中,会将所有的语料都以一个python list的形式存放在内存中。然而,gensim支持对文档进行读取迭代。对很大的语料,当然将其存放在硬盘上更加合适,并顺序地进行读取,一次一个。gensim的实现方式正是使用了这样的方式,独立于语料的规模和内存。

下面我们初始化一个转换(transformation):


In [4]:
tfidf = models.TfidfModel(corpus)

转换的作用是将从一个矩阵存储的文件载入语料迭代器


In [5]:
vec = [(0,1),(4,1)]
print(tfidf[vec])


[(0, 0.8075244024440723), (4, 0.5898341626740045)]

这里我们使用了Tfidf,这个简单的转换把文档表示成为词袋模型,并使用一个对通常词进行打折的方式来提高稀有词的重要性。同样也把最终的向量进行了单位化(使用欧几里得范数Euclidean norm) 转换可以在Topics and Transformations中找到。 使用Tfidf转换整个语料并进行索引,以供查询:


In [6]:
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=12)

查询向量vec和语料中的每个文档的相似性:


In [7]:
sims = index[tfidf[vec]]
print(list(enumerate(sims)))


[(0, 0.4662244), (1, 0.19139354), (2, 0.24600551), (3, 0.82094586), (4, 0.0), (5, 0.0), (6, 0.0), (7, 0.0), (8, 0.0)]

这个结果我们怎么读?与第一个文档相似度为$0.4662244$... 因此,根据Tfidf文档表示和余弦相似度度量,跟我们$vec$查询向量最为相似的就是第三个文档,其相似度为$0.8209$。注意在Tfidf表示中,任意文档跟vec没有相同的特征的都是$0$。参见相似度查询


In [ ]: