Lemur简明教程

转自:http://blog.csdn.net/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对指定的语料数据建立索引。

[java]  view plain  copy
  1.         Indri5.4/bin/IndriBuildIndex parameter_file(parameter_file为索引的参数文件)  

Parameter_file 常用参数介绍如下,更详细的参数设置在doc/IndriParameters.html有更详细的介绍,包括annotations、metadata等:

[html]  view plain  copy
  1. <parameters>  
  2.     <memory>200m</memory> (运行时内存大小)  
  3.     <index>/path/to/outputIndex</index>(存放生成的索引的路径,注意,重新生成索引时要把原索引删除)  
  4.     <stemmer>  
  5.         <name>krovetz</name>(词干提取,分为krovetz和porter)  
  6.     </stemmer>  
  7.     <corpus>  
  8.         <path>/path/to/collection1/</path>(需要建立索引的语料的存放路径)  
  9.         <class>trectext</class> (语料的格式,一般为xml、trec数据格式等等)  
  10.     </corpus>  
  11.     <corpus>  
  12.         <path>/path/to/collection2/</path>(另一个语料的路径,说明可以同时对不同路径下的语料建立索引)  
  13.         <class>trecweb</class>  
  14.     </corpus>  
  15.     <field><name>title</name></field>(建立索引一般有需要索引域,这是title索引域,域索引用于域查询)  
  16.     <field>  
  17.         <name>date</name>  
  18.         <numeric>true</numeric>  
  19.         <parserName>DateFieldAnnotator</parserName>  
  20.     </field>  
  21. </parameters>  

    我是用的是iSearch数据集,是一个5.04G大小的xml数据集,跑了将近8个小时终于生成了一个大小为6.01G的索引。居然比原数据还大 =。=


4.  检索

    在建立索引之后,我们就可以进行检索部分了。使用不同的模型运用不同的参数就能得到不同效果的检索结果。我们的实验也就是不断尝试不同的参数,从而得到在这个数据集上最优的结果。

    与建立索引类似,检索也需要在cmd下运行指令。一个样例指令形式如下:

[java]  view plain  copy
  1.         indri-5.0/bin/IndriRunQueryquery_parameter_file -count=1000 -index=/path/to/index -trecFormat=true >result_file  

    其中query_parameter_file为检索的参数文件,count表示对应每个检索返回多少个检索结果,index为你生成索引的路径,trecFormat表示生成结果是否按照trec格式,设定为trec格式输出就可以直接使用ireval工具进行评测了。 

    下面为一个query_parameter_file示例:

[html]  view plain  copy
  1. <parameters>  
  2.     <rule>method:dirichlet,mu:1000</rule>(1)  
  3.     <index>I:/data/Reuters/Reuters_krovetz_index_ubuntu</index>(索引存放的位置)  
  4.     <count>1000</count>(返回结果的数量,即每个query返回1000个结果)  
  5.     <query>  
  6.         <number>R150</number>  
  7.         <text>#combine(Driveby shootings)</text>(一个查询对象,#combine(query1,query2)为最常用 的非域查询)  
  8.     </query>  
  9.     <trecFormat>true</trecFormat>(是否使用TREC输出格式)  
  10.     <queryOffset>1</queryOffset>(表示Indri从第几个query开始执行)  
  11.     <runID>indri_query</runID>(一个标示ID,TREC格式输出用)  
  12. </parameters>  

    需要注意的是,Indri默认是使用Language Model作为检索模型的,同时可以使用不同的平滑方法来改进检索效果。注意(1)处,这里使用的是Dirichlet平滑,也是Indri的默认平滑方法,平滑方法和参数用<rule>标明。此外还可以选择的平滑方法有jelinek-mercer及twostage方法,配置格式如下:

[html]  view plain  copy
  1. <rule>method:jm,lambda:0.4</rule>  
  2. <rule>method:twostage,mu:1500,lambda:0.4</rule>  

    但是如果我要使用别的检索模型做对比实验怎么办?Indri内置实现了TFIDF和BM25这两个检索模型,使用时在配置文件里就不要写上面的<rule>咯,这两个模型使用<baseline>标明:

[html]  view plain  copy
  1. <baseline>tfidf,k1:1.0,b:0.3</baseline>  
  2. <baseline>okapi,k1:1.0,b:0.3,k3:7</baseline>  

    同时由于tfidf和bm25不支持Indri的 Indri Query Language,也就是上面<query>中的#combine(Driveby shootings)语法。因此需要将query改成平文本。

[html]  view plain  copy
  1. <query>  
  2.     <number>R101</number>  
  3.     <text>Economic  espionage</text>  
  4. </query>  

    此外Indri还支持相关反馈设置,有需要自行查看。

    由于我的实验中需要不断的调整参数进行效果对比,因此就把参数直接写在了cmd命令行中,同时把检索结果输出到query_result_file中以方便下一步评测:

[cpp]  view plain  copy
  1. IndriRunQuery ../run_query1_train.ini-rule=method:twostage,mu:100,lambda:0.4 -count=100 >C:\Users\Administrator\Desktop\ireval\query_result.ini  
  2. IndriRunQuery ../run_query1_train.ini-baseline=okapi,k1:1.2,b:0.75 -count=100 >C:\Users\Administrator\Desktop\ireval\query_result.ini  

5.  评测

    由于我们在Query设置中标明了使用TREC数据格式,因此评测就可以使用一些成型的TREC评测工具。这里主要有两个方法:

        (1)trec_eval

        (2)ireval

    我实验中使用的是后者。 命令:

[java]  view plain  copy
  1.     java -jar lemur/ireval/src/ireval.jartestrun_result qrel_file  

    testrun_result是前面query步骤生成的检索结果,qrel_file则是提前标注好的“标准答案”。

    一个ireval生成的评价结果如下:


    结果中使用了颇多评价标准,具体可以参加下面两个blog:

        http://blog.sina.com.cn/s/blog_72995dcc01013oo9.html

        http://blog.csdn.net/marising/article/details/6543943

 

6.  训练最优参数程序

    如果从同一个训练样本中选择独立的样本作为验证集合,当模型因训练集过小或参数不合适而产生过拟合时,验证集的测试予以反映。交叉验证是一种预测模型拟合性能的方法。

    K折交叉检验(K-fold cross-validation)是常用交叉验证形式之一。初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据(测试集),其他K-1个样本用来训练(训练集)。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10次交叉验证是最常用的。伪代码:

[java]  view plain  copy
  1.     createIndriIndex();  
  2.     divideQueriesIntoKParts();//随机将所有query平均划分为K份;  
  3.     For(datasetID:datasetIDs){//选取一个为测试数据集,剩余的为训练测试集  
  4.         Floatmax_p@10 = 0.0;  
  5.         Parameter bestParameter;  
  6.         For(mu :muValues)  
  7.             For(lambda: lambdaValues){//迭代参数  
  8.                 Filequery_result = runQuery(trainDataset[datasetID], mu, lambda);//使用训练数据集检索  
  9.                 Floatp@10 = evaluteResult(query_result);  
  10.                 If(p@10>max_p@10){  
  11.                     max_p@10= p@10;  
  12.                     bestParameter= new Parameter(mu,lambda);  
  13.                 }  
  14.         }  
  15.         evaluateWithTestDataset(testDataset[datasetID],bestParameter);//使用测试数据集对最佳参数进行验证  
  16.     }  

    最后对每组训练出的最佳参数取平均就可以作为训练出的最后参数了。

    我的实验是使用Java写的,所以还需要用到java调用命令行来执行Indri。

 

7.  总结

    Lemur提供了一套十分成熟的信息检索实验环境, 其实现的模型也是目前效果最优的。在Lemur的基础上也可以开发出一个强大的搜索引擎。对科研来说了解语言模型、各种平滑,学习索引的构建方法是重中之重。

    Lemur的后续使用心得也会继续更新。欢迎留言交流。

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值