仅供个人学习之用,如有错误,敬请指正。原文地址
为了测试gensim的性能,我们在维基百科英文版上运行了一些实验。
这个页面描述了获取与处理维基百科的过程,以便任何人都能再现这个结果。本教程要求已经正确安装了gensim。
译者注:维基百科的内容在不断更新,因此本文的结果仅供参考,可能与实际情况有出入。
准备语料库
- 首先,从 http://download.wikimedia.org/enwiki/下载维基百科文档的存档(你可能需要一个像这样的文件enwiki-latest-pages-articles.xml.bz2)。这个文件大约8GB包含了所有的英文维基百科的文章(译者注:实际上应该更大)。
- 将文章转换为普通文本(处理wiki标记)并且将结果以稀疏TF-IDF向量的形式存储。在Python中,非常轻松就能完成这个任务,我们甚至不需要将整个压缩文件解压到硬盘上。Gensim中有一个脚本可以完成这个任务,仅需:
已经废弃 | Depressed
- 1
当前可用 | Recommend(2017年7月19日)
- 1
- 2
- 3
- 4
注:预处理步骤对8.2G压缩的维基存档实施了2个操作(提取字典、创建于存储稀疏向量),在我的笔记版上消耗了大约9小时,因此你可能想要来1、2杯咖啡。
你需要大概35GB空闲硬盘空间来存储输出的稀疏向量。我建议直接压缩这些文件,例如bzip2(压缩至约13GB)。Gensim可以直接使用压缩文件,可以帮助你节约硬盘空间。
潜在语义分析
首先让我们加载在上述步骤创建的语料库迭代器与字典:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
我们看到我们的语料库用稀疏TF-IDF矩阵表示时,包含了3.9M的文档、100K属性(不同的记号——这里就是单词)、0.76G非零输入(译者注:代表总词数)。英文维基百科语料库包括大约22.4亿记号。
现在,我们已经准备好计算英文维基百科的LSA结果了:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
创建这个LSI模型在我的笔记本上消耗了4小时9分钟[1]。大约16,000个文档每分钟,包括所有的I/O。
注:如果你需要更快得到结果,参见《分布式计算》教程。Gensim中的BLAS库显然利用了多核,以便相同的数据可以在一台多核机器上免费地更快处理,而且不用任何分布式安装。
我们看到总处理时间主要是用于预处理阶段总原始维基百科XML中提取TF-IDF语料库,消耗了9小时。
gensim中使用的算法对于每个输入只需浏览一遍,因此适合用于文档以不重复流的形式输入及存储/迭代多次语料库消费太大的情形。
隐含狄利克雷分配
正如上面的潜在语义分析,首先载入迭代器与字典。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
我们将会运行在线LDA(Hoffman等[3]),这个算法可以不断利用新到的文档更新LDA模型。在线LDA可以与批量LDA进行对比,后者是一次处理整个语料库,若要更新只能再次处理整个语料库。不同点是,给定一个相对稳定的文档流(没有太多主题偏移),在线更新只需遍历较小的文档块(子语料库)本身是相当不错的,因此模型收敛更快( The difference is that given a reasonably stationary document stream (not much topic drift), the online updates over the smaller chunks (subcorpora) are pretty good in themselves, so that the model estimation converges faster)。结果是,我们可能只需要处理一遍全部语料库:如果语料库有3M文章,我们在读入10K文章后更新一次,这意味着在一次遍历中我们需要更新300次,很可能得到一个比较准确的主题估计:
- 1
- 2
- 3
- 4
- 5
不像LSA,来自LDA的主题更容易解释:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
创建该LDA模型在我的笔记本上消耗了6小时20分钟。如果你需要更快些,考虑在计算机集群上使用分布式LDA。
请注意LDA和LSA运行中的两个不同点:我要求LSA提取400主题,LDA只要100主题(因此速度的差异实际上可能更大)。第二,gensim中的LSA实现是真正的在线:如果输入流的性质(nature)及时改变,LSA将会重定向以反映这些变化,只用一个相对较小的更新。相反地,LDA不是真正在线(虽然文章[3]的标题如此),因为后来更新对模型的影响逐渐变小。如果输入的文档流有主题偏移,LDA将会感到困惑,并且调整自己以适应新状况的速度会越来越慢。
一句话,多次使用LDA的更新功能时请小心。当事先知道整个语料库并且没有表现出主题偏移时,批量LDA的用法是可以的,并没有影响。
要运行批量LDA(非在线),训练LdaModel:
- 1
- 2
像往常一样,一个训练好的模型可以用来将新的文档、没见过的文档(普通词袋计数向量)转化为LDA主题分布:
- 1
[1] (1, 2) 我的笔记本 = MacBook Pro, Intel Core i7 2.3GHz, 16GB DDR3 RAM, OS X with libVec.
[2] 这里我们最关心的是性能问题,但是检索出来LSA概念也十分有趣。我不是维基百科专家,没有深入剖析过它,但是Brian Mingus针对这个结果进行了这样的分析:
你的数据集中呈现出大量噪音。头三个主题可能是关于维基百科的管理和清理的元主题。这些结果的出现时因为你没有排除这些模板,为了控制质量这些模板被包含在大多数文章中:http://en.wikipedia.org/wiki/Wikipedia:Template_messages/Cleanup
第四、五个主题清楚地表明导入的大量关于城市、国家等的人口、经济等方面的统计数据库的影响。
第六个主题表示体育的影响,第七个是音乐。因此,前10概念显然被维基百科的机器人和扩充模板主导,这提示我们LSA是一个非常强力的数据分析工具,但是不是万金油(silver bullet)。通常,也是渣进滓出(garbage in, garbage out)。顺带一提,欢迎完善维基百科标记解析代码。^_^
[3] (1, 2) Hoffman, Blei, Bach. 2010. Online learning for Latent Dirichlet Allocation [pdf] [code]