编译iState文件夹中的indri_api
在已经编译好的indri文件夹中,可以找到Makefile.app
文件。修改其中内容
APP=indri_API
然后将此文件拷到iState文件夹下。执行命令
make -f Makefile.app
就可以将indri_app编译。
配置参数
打开phrank文件夹下的params.py
文件。配置以下变量
indri = '/mnt/i/databackup/indri/indri-2.12/bin/'
index_collection = '/mnt/i/databackup/testdocs/'
index_wikipedia = '/mnt/i/databackup/wiki412/'
graph_k = 5
其中,indri
对应的文件夹中应含有buildindex
, dumpindex
和runquery
三个文件。这三个文件可以在经过编译后的indri文件夹内找到(分别位于三个不同的子文件夹下)。
index_collection
对应存放文件index的目录。
index_wikipedia
对应存放wiki的index的目录。
使用phrank
使用phrank需要新建两个文件。(假设我们新建了query.txt和term.txt两个文件)。其中query.txt存放我们的query,term.txt存放了query中term的全排列。
格式如下
query.txt
1: player goal area
term.txt
1 : player
1 : goal
1 : area
1 : player goal
1 : player area
1 : goal area
1 : player goal area
其中1表示query的id,用来区分不同的query。可以使用任意其他值。query.txt和term.txt中可以包含多个query。
要使用phrank对term进行排序时,执行
python phRank.py query.txt terms.txt -c football -r 1
此次,我也不清楚-c和-r的作用。在没有wiki的index的时候,似乎这两个参数没有任何作用。也就是可以把football 和1 替换成任意其他的东西。执行后,在data/keyphr
文件夹下将生成term的权重。我执行后生成了如下内容
1 : goal 1.0
1 : player goal 0.861430988572
1 : goal area 0.861386567364
1 : player goal area 0.815211703957
1 : player 0.722861977144
1 : player area 0.722817555936
1 : area 0.722773134728
可以根据term的权重来选择要用哪些term来进行查询。
使用indri来进行检索
首先,需要修正下之前我们建立的index。这个非常坑,让我浪费了好多的时间。
先回忆下,上次我们建立index的时候,每个问题放在一个txt文件里。事实上我们并没有成功建立index。
看下上次的结果图
图中红色圈出的显示,只有一个文件建立的索引。
所以,这次我们先重新修正建立index。
我们依然为每一个问题建立一个文件。
文件的格式如下
<DOC>
<DOCNO>1</DOCNO>
<TEXT>
In all codes, common skills include passing, tackling, evasion of tackles, catching and kicking.[8] In most
codes, there are rules restricting the movement of players offside, and players scoring a goal must put the
ball either under or over a crossbar between the goalposts.
</TEXT>
</DOC>
//注意,此处一定要有一个空行。
文件最后一定要有一个空行,否则会提示错误(我在这浪费了好多时间)。把注释删掉。
其中DOCNO中的是文档id,不可以重复
TEXT中间是题目的文本信息。
参数文件parameter.txt
内容与上次差不多,但是要少许修改
<parameters>
<memory>8000m</memory>
<index>/mnt/i/databackup/test/</index>
<corpus>
<path>/mnt/i/databackup/docs2</path>
<class>trectext</class> //注意,此处与上次不同,类型为trectext
</corpus>
</parameters>
重新执行命令
可以看到,6个文件都成功建立索引了。
接下来我们介绍如何使用indri来检索结果
就像建立索引一样,我们依然需要一个文件来指定参数。
<parameters>
<index>/mnt/i/databackup/test</index> //指定index的位置
<count>3</count> //返回结果的数量
<trecFormat>true</trecFormat>//懒得解释了,放上来肯定没错
<query> //以下为一个query
<number>1</number> //query的id
<text>football</text> //query的内容
</query>
</parameters>
处理query我们需要runquery
。在含有runquery
的文件夹下,我们执行命令./runquery params.txt
,可以看到一下结果
每一行的意思如下
<queryID> Q0 <DocID> <rank> <score> <runID>
红色标出来的数字表示retrive到的文档的id,也就是在我们之前用<DOCNO>
和</DOCNO>
所围起来的数字。
在使用indri来检索文件的时候,还有更多的参数可以使用。本次暂时不做介绍。具体的参数可以参考
http://lemurproject.org/doxygen/lemur/html/IndriRunQuery.html.