[例会报告]gensim的使用

gensim库官网:http://radimrehurek.com/gensim/tutorial.html

gensim各转换模型源码:https://github.com/RaRe-Technologies/gensim/tree/develop/gensim/models

一.gensim简介

Gensim是一个免费的Python库,它可以用来从文档中自动提取语义主题,并且尽可能地做到轻松(对人)高效(对电脑)。


Gensim致力于处理原始的、非结构化的数字文本(普通文本)。Gensim中用到的算法,如潜在语义分析(Latent Semantic Analysis,LSA)、隐含狄利克雷分配(Latent Dirichlet Allocation,LDA)或随机预测(Random Projections)等,是通过检查单词在训练语料库的同一文档中的统计共现模式来发现文档的语义结构。这些算法都是无监督算法,也就是无需人工输入——你仅需一个普通文本的语料库即可。

Gensim的主要设计理念是:
1.      对于开发者而言,提供简单的接口,降低API学习曲线。Good forprototyping.
2.      考虑到输入语料库的大小,尽量降低内存占用;所有中间步骤和算法操作以流的方式,一次访问一个文档。

二:核心概念

整个gensim包围绕语料库(Corpus)、向量(Vector)、模型(Model)三个概念展开。 1.语料库
指所有数字文档的集合。该集合被用来自动推断文档的结构、主题等,因此也被称为训练语料库。推断出来的潜在结构可以在接下来为新的没有出现在训练语料库中的文档分配主题,无需人工干预(包括标引或创建其他元数据)。

2.向量
在向量空间模型中,每个文档都用一组属性代表。例如,每个单一的属性都可以被认为是一个问答对: 1. 文档中splonge这个单词出现了几次?0 2. 文档中有几个段落?2 3. 文档中有几种字体?5 这些问题通常用它的整数编号来代表(如这里是1,2和3),以便这些文档的代表变成一系列类似(1, 0.0), (2, 2.0), (3, 5.0)的数对。如果我们预先知道所有的问题,我们可以将他们简单地表示为(0.0, 2.0, 5.0),以隐含的方式省略问题的编号。这些答案的序列可以被看做是高维空间的向量(本例中是三维)。实际应用中,只有答案是单个实数(或者可以转化为单个实数)的问题才被允许。 每个文档的问题是相同的,以便对比两个向量(代表两个文档)。我们希望可以得到类似“这两个向量的数字非常相似,因此源文档也一定相似”这样的结论。当然,这个结论是否符合现实取决于我们选择的问题是否恰当。 稀疏向量
通常情况下,大多数问题的答案是0.0。为了节约空间,我们将这些问题省略,只记录(2, 2.0), (3, 5.0) (请注意(1, 0.0)被省略了).。由于问题集合已经提前知道了,在稀疏表示中所有缺失的属性都可以明确地解析为0.0。 Gensim没有规定任何特殊的语料库格式,一个语料库可以是任何能够连续产生这些稀疏向量的迭代器。例如,set([(2, 2.0), (3, 5.0)], ([0, -1.0], [3, -1.0]))就是一个很平常的有两个文档的语料库,每个文档有两个非0属性-答案对。 3.模型
对于我们的目的来说,一个模型就是一种文档表示方法的转化(或者说,从一个向量空间转化到另一个)。原型和目标表示方法都是向量——只是问题与答案不同。转化规则从训练语料库中自动学习,无需人工监督。并且我们希望最终的文档表示方法将更加简洁有用:即相似的文档相似的表示。

三:快速入门

1.导入gensim并处理语料库

2.转换

3.相似度查询

四:语料库的处理(从字符串到向量)

1.记号化 or tokenize

首先,让我们对这些文档进行记号化(tokenize,或称标记化等)处理,屏蔽常用词(利用停用词表)和整个语料库中仅仅出现一次的词

2.总结属性字典
处理文档的方法应该视应用情形、语言而定,一个文档必须由其中提取出来的属性表示,而不仅仅是其字面形式;如何提取这些属性由你来决定(可以是单词、文档长度数量等)。
为了将文档转换为向量,我们将会用一种称为词袋的文档表示方法。这种表示方法,每个文档由一个向量表示,该向量的每个元素都代表这样一个问-答对:
“‘系统’这个单词出现了多少次?1次。”
我们最好用这些问题的(整数)编号来代替这些问题。问题与编号之间的映射,我们称其为字典(Dictionary)。我们利用gensim.corpora.dictionary.Dictionary类为每个出现在语料库中的单词分配了一个独一无二的整数编号。这个操作收集了单词计数及其他相关的统计信息。

3.产生稀疏文档向量
首先真正将记号化的文档转换为向量
函数doc2bow()简单地对每个不同单词的出现次数进行了计数,并将单词转换为其编号,然后以稀疏向量的形式返回结果。因此,稀疏向量[(0, 1), (1, 1)]表示:在“Human computer interaction”中“computer”(id 0) 和“human”(id 1)各出现一次;其他10个dictionary中的单词没有出现过(隐含的)。
4.真正得到语料库
通过上面的操作,我们看到了这次我们得到的语料库。

五:转换

1.如何将文档从一种向量表示方式转换到另一种。这个处理是为了两个目的:
1)将语料库中隐藏的结构发掘出来,发现词语之间的关系,并且利用这些结构、关系使用一种新的、更有语义价值的(这是我们最希望的)方式描述其中的文档。
2)使得表示方式更加简洁。这样不仅能提高效率(新的表示方法一般消耗较少的资源)还能提高效果(忽略了边际数据趋势、降低了噪音)。

2.

创建一个转换
转换(transformations)是标准的Python类,通常通过训练语料库的方式初始化。不同的转换可能需要不同的初始化参数
转换向量
对整个语料库实施转换
转换也可以被序列化,还可以一个(转换)叠另一个,像一串链条一样

3.可用的转换
Gensim实现了几种常见的向量空间模型算法:
词频-逆文档频(Term Frequency * Inverse Document Frequency, Tf-Idf)
潜在语义索引(Latent Semantic Indexing,LSI,or sometimes LSA)
随机映射(Random Projections,RP)
隐含狄利克雷分配(Latent Dirichlet Allocation, LDA)
分层狄利克雷过程(Hierarchical Dirichlet Process,HDP)

六:查询文档相似度

初始化查询结构
为了准备相似度查询,我们需要输入所有我们我们需要比较的文档。

实施查询
为了获得我们的查询文档相对于其他经过索引的文档的相似度,余弦方法返回的相似度在-1~1之间(越大越相似)。

与会人员:

老师:安宁,杨矫云

同学:江思源、刘杰、明鉷、腾越、王雨婷、肖勇博、严金戈、殷越

请假人员:陈绪、段优、丁会通、唐晨、景波

anyShare分享到:
This entry was posted in 例会. Bookmark the permalink.

发表评论