转自:http://blog.youkuaiyun.com/memray/article/details/8973457
课程作业需要做一个评测实验,借机会了解一下Lemur,其实使用教程在Lemur官网(http://www.lemurproject.org/)和SourceForge(http://sourceforge.net/projects/lemur/wiki/)上都有较为详细的讲解,不过后者的文档是从原来的Lemur资料库转移过去的,很多内容不全,建议多查看Indri目录里的doc。中文教程不多,毛进师兄那里一些不错的资源(http://blog.sciencenet.cn/home.php?mod=space&uid=563898)。
我也把自己的实验过程简单记录一下。
其实目前世界上有不少经典的检索工具,之前我们做实验都是使用Apache Lucene,但是学术界还是比较认可Lemur。Lemur项目是由UMass和CMU的牛们共同合作的,《Search Engines:Information Retrieval in Practice》是Lemur的重要成果,作者就是Croft,另外两个作者都是他的学生,都去Google搜索部门混了。国内译本是刘挺翻译的,一直放桌上还没看过。。不查不知道,其实还有很多实现的搜索引擎,比如Lucene,Terrier,Wumpus等等(http://www.emse.fr/~mbeig/IR/tools.html)。有必要针对一两个分析他们的具体实现。
1. 实验目的
使用k折交叉检验(k=5)训练出下列模型的最优参数:
o LM 2-Stage
Mu的取值范围:
mu=(100,500, 800, 1000, 2000, 3000, 4000, 5000, 8000, 10000);
Lambda的取值范围:
lambda=(0.01,0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99);
o BM25
K1及b的取值范围:
K1=(1.0, 1.1, 1.2, 1.3, 1.4, 1.5,1.6, 1.7, 1.8, 1.9,2.0);
b = (0, 0.1 ,0.2, 0.3, 0.4, 0.5,0.6,0.7 0.8, 0.9, 1.0);
2. 安装
Indri的安装很简单,下载传送门:https://sourceforge.net/projects/lemur/files/lemur/
里面有不少内容可以下载,Indri就是我们实验需要的程序,最新版本为5.4。lemur-toolkit是将包括Indri在内的诸多工具的整合,我们后文需要用到的评测工具ireval就是在这里面。只下载lemur-toolkit也可以完成我们的实验,不过它早在2010年就不再更新了。
如果你选择使用Indri 5.4,评测工具ireval.jar可以从这里下载:http://gimlet.is.inf.uni-due.de:8081/nexus/content/groups/public/evalutil/
安装不说,exe点击搞定。安装的时候可以选择安装Java GUI,能够提供简单的建立索引和检索功能。Lemur的GUI功能相比Indri的更强大一些,起码能加参数~不过GUI对于我们参数调优也显得很无力,必须靠程序实现。
3. 建立索引
找到Indri安装路径,在cmd下运行这个命令即可使用Indri对指定的语料数据建立索引。
Parameter_file 常用参数介绍如下,更详细的参数设置在doc/IndriParameters.html有更详细的介绍,包括annotations、metadata等:
我是用的是iSearch数据集,是一个5.04G大小的xml数据集,跑了将近8个小时终于生成了一个大小为6.01G的索引。居然比原数据还大 =。=
4. 检索
在建立索引之后,我们就可以进行检索部分了。使用不同的模型运用不同的参数就能得到不同效果的检索结果。我们的实验也就是不断尝试不同的参数,从而得到在这个数据集上最优的结果。
与建立索引类似,检索也需要在cmd下运行指令。一个样例指令形式如下:
其中query_parameter_file为检索的参数文件,count表示对应每个检索返回多少个检索结果,index为你生成索引的路径,trecFormat表示生成结果是否按照trec格式,设定为trec格式输出就可以直接使用ireval工具进行评测了。
下面为一个query_parameter_file示例:
需要注意的是,Indri默认是使用Language Model作为检索模型的,同时可以使用不同的平滑方法来改进检索效果。注意(1)处,这里使用的是Dirichlet平滑,也是Indri的默认平滑方法,平滑方法和参数用<rule>标明。此外还可以选择的平滑方法有jelinek-mercer及twostage方法,配置格式如下:
但是如果我要使用别的检索模型做对比实验怎么办?Indri内置实现了TFIDF和BM25这两个检索模型,使用时在配置文件里就不要写上面的<rule>咯,这两个模型使用<baseline>标明:
同时由于tfidf和bm25不支持Indri的 Indri Query Language,也就是上面<query>中的#combine(Driveby shootings)语法。因此需要将query改成平文本。
此外Indri还支持相关反馈设置,有需要自行查看。
由于我的实验中需要不断的调整参数进行效果对比,因此就把参数直接写在了cmd命令行中,同时把检索结果输出到query_result_file中以方便下一步评测:
5. 评测
由于我们在Query设置中标明了使用TREC数据格式,因此评测就可以使用一些成型的TREC评测工具。这里主要有两个方法:
(1)trec_eval
(2)ireval
我实验中使用的是后者。 命令:
testrun_result是前面query步骤生成的检索结果,qrel_file则是提前标注好的“标准答案”。
一个ireval生成的评价结果如下:
结果中使用了颇多评价标准,具体可以参加下面两个blog:
http://blog.sina.com.cn/s/blog_72995dcc01013oo9.html
http://blog.youkuaiyun.com/marising/article/details/6543943
6. 训练最优参数程序
如果从同一个训练样本中选择独立的样本作为验证集合,当模型因训练集过小或参数不合适而产生过拟合时,验证集的测试予以反映。交叉验证是一种预测模型拟合性能的方法。
K折交叉检验(K-fold cross-validation)是常用交叉验证形式之一。初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据(测试集),其他K-1个样本用来训练(训练集)。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10次交叉验证是最常用的。伪代码:
最后对每组训练出的最佳参数取平均就可以作为训练出的最后参数了。
我的实验是使用Java写的,所以还需要用到java调用命令行来执行Indri。
7. 总结
Lemur提供了一套十分成熟的信息检索实验环境, 其实现的模型也是目前效果最优的。在Lemur的基础上也可以开发出一个强大的搜索引擎。对科研来说了解语言模型、各种平滑,学习索引的构建方法是重中之重。
Lemur的后续使用心得也会继续更新。欢迎留言交流。