Indri和Terrier搜索引擎的使用
阅读原文时间:2023年07月15日阅读:1

介绍

Indri和Terrier都是开源的搜索引擎,当中Indri作为Lemur项目的一个重要部分,具有强大的查询接口,易建索引,可扩展,高效率等长处。能够在SourceForge Lemur Project Page中下载。Terrier也是IR领域很有影响力的开源搜索引擎,Terrier是Glasgow大学用Java语言编写的,具有高效灵活及易于部署等特点,眼下最新的版本号为Terrier

4.0。可在Terrier官网下载

不管Indri还是Terrier整个过程,须要先建立索引,然后依据自己定义的query phrases(查询短语。当然也能够是句子),在已建立的索引上查询,并返回一个结果。类似例如以下(后面会详细解说每一列的含义):

两个搜索引擎的使用关键在于它们的配置文件,接下来解说怎样配置

文本格式

2011-12-05-20_1323118648-7cfd066125ff1daf479748f81346895d 12/05/2011 (MM/DD/YYYY) arxiv S and Λ production in pp interactions at √s = 0.9 and 7 TeV measured with the….

Indri建索引


16G
path/to/index //建完索引后,这些索引结果文件存放的位置,如/home/tempUser/myindex
krovetz //词干化工具,也即分词,这个是默认的,能够选择其它的

path/to/original/file/directory //原始须要建立索引的文件文件夹 trectext //须要建立什么格式的索引,有xml, txt, trectext, web

DOCNO //文本ID号

//假设须要用到时间信息,需加此field。 date true DateFieldAnnotator

配置文件


path1/to/index
path2/to/index
method:dirichlet,mu:1000 //内置方法,用狄利克雷,參数值1000
1000 //每一个查询值返回1000条记录,能够自己设置

//第一个查询 001 //编号自定义 //假设文本的公布日期在两个时间段之间的,则在其文本中查询“Abbotsford Arts Centre”,依据其内置算法。计算query phrases与文本的相关度值 #scoreif(#datebetween(10/05/2011 01/26/2012) #1(Abbotsford Arts Centre))
//第二个查询 003 #scoreif(#datebetween(10/05/2011 08/08/2012) #1(Andy Billig))

true
1
query_id //自定义queryID

Indri查询语言

1、Combining Beliefs

#combine,#weight, #not, #max, #or, #band(boolean and)

#wsum, #wand(weighted and)

#weight( 1 #1(Abbotsford Arts Centre)  0.5 #1(office) 0.5 #1(band))

2、Filter Operators

scoreif(#datebetween(10/05/2011 01/26/2012)  #1(Abbotsford Arts Centre)) 

3、Numeric Field Operator

#less( F N ) matches numeric field extents of type Fif value < N

#greater( F N ), #between(F N_low N_high ) , #equals(F N )

4、Date Field Operator

#dateafter( D ),

#datebefore( D ),

#datebetween( D_low D_high ),

#dateequals( D )

查询结果文件:

当中:

第一列:表示第003query

第二列:不用理会

第三列:DOCNO

第四列:排名

第五列:详细排序值

第六列:query_id

Terrier是还有一个开源的搜索引擎,能够从官网下载terrier-4.0,下载terrier-4.0.gz后。

解压:tar -xvzf terrier-4.0.gz 

得到例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3pnYW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

(Terrier是用java开发的,能够去上面图片的src文件夹下查看源代码)

以下分别说说这些文件夹都是些什么:

bin: 在建索引,检索的时候要用到,在linux系统下用.sh,在windows下用相应的.bat

doc:一些帮助文档集

etc: 存放建立索引和检索时的配置文件

lib:包括terrier能执行所依赖的jar包,如terrier-4.0-core.jar,junit-4.8.1.jar等

licenses:  包括各种依赖包的licenses

src: 搜索引擎源代码

var: 默认的索引。检索结果的存放位置(你能够通过改动etc文件夹下的terrier.properties配置文件,自定义到别的文件夹)

build.xml:各种依赖关系进行build

在执行terrier之前。首先要确定是否已经安装了jdk。

能够通过:echo $JAVA_HOME,若有值,则表示已经安装。否则须要自己去安装,然后

export JAVA_HOME="Absolute_Path_of_Java_Installation"

建索引:

1)定位到terrier文件夹

cd terrier

2)收集须要建索引的文档

./bin/trec_setup.sh "Absolute_Path_To_Collection_Files"

这里须要指定绝对路径。比方须要建索引的文件集在/home/hadoop/kba/kba2014/trecdata/2011-10文件夹下(该文件夹下都为文件。不是文件夹,Files已经是最后一层文件夹了),

则上面的

Absolute_Path_To_Collection_Files即为 /home/hadoop/kba/kba2014/trecdata/2011-10

执行后在etc文件夹下生成例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3pnYW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

collection.spec里面的内容例如以下:

/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-01.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-03.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-05.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-07.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-08.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-11.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-12.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-13.trectext
/home/hadoop/kba/kba2014/trecdata/2011-10/2011-10-05-14.trectext

terrier.properties配置文件的内容例如以下:

#default controls for query expansion
querying.postprocesses.order=QueryExpansion
querying.postprocesses.controls=qe:QueryExpansion
#default controls for the web-based interface. SimpleDecorate
#is the simplest metadata decorator. For more control, see Decorate.
querying.postfilters.order=SimpleDecorate,SiteFilter,Scope
querying.postfilters.controls=decorate:SimpleDecorate,site:SiteFilter,scope:Scope

#default and allowed controls
querying.default.controls=
querying.allowed.controls=scope,qe,qemodel,start,end,site,scope

#document tags specification
#for processing the contents of
#the documents, ignoring DOCHDR
TrecDocTags.doctag=DOC
TrecDocTags.idtag=DOCNO
TrecDocTags.skip=DOCHDR
#set to true if the tags can be of various case
TrecDocTags.casesensitive=false

#query tags specification
TrecQueryTags.doctag=TOP
TrecQueryTags.idtag=NUM
TrecQueryTags.process=TOP,NUM,TITLE
TrecQueryTags.skip=DESC,NARR

#stop-words file
stopwords.filename=stopword-list.txt

#the processing stages a term goes through
termpipelines=Stopwords,PorterStemmer

terrier.properties里面的#行表示凝视,建立索引时须要注意标签

TrecDocTags表示要建索引的文件的配置

TrecDocTags.idtag:表示须要处理的标签,TrecDocTags.skip=DOCHDR表示要忽略DOCHDR标签。能够有多个,用逗号隔开就可以。

文件格式例如以下:

id text content

TrecQueryTags表示检索的query文件的配置

TrecQueryTags.process表示要处理哪些标签。

文件格式例如以下:

003 //这个相当于你自己给这个query定一个id。所以能够随便写 "Abbotsford Arts Centre" office band "Abbotsford Arts Centre May" company "Abbotsford Arts Centre" //Query Phrases

3)建索引:

./bin/trec_terrier.sh -i

建索引的时候假设DOCNO里面的id长度大于默认的20个字符,那就会报错,例如以下:

这时须要我们再次配置terrier.properties配置文件,增加一行

indexer.meta.forward.keylens=120  //你能够自己定义长度

再次执行建索引命令就不会报错了

你还能够例如以下配置:

collection.spec=/absolute/path/to/your.spec
terrier.index.path=/absolute/path/to/index/path //你想把你的建好的index放在哪个文件夹
trec.results.file=/absolute/path/to/resultfile.res //你想想把你的query结果放在哪个文件
ignore.low.idf.terms=false //假设某个词的逆文档频率idf非常低,还是要考虑,而不是丢弃
matching.retrieved_set_size=40000 //query后结果有多少条,假设test.query文件写了非常多个query,那么这么多个query的返回的结果不大于40000,注意此时不是单个query的结果数

对于全部的properties的含义能够在官网terrier.properties中查看。

4)检索:

./bin/trec_terrier.sh -r -Dtrec.model=PL2 -c 10.99 -Dtrec.topics=/path/to/your.query

-r表示retrieve, 

-Dtrec.model表示用什么model去检索,这里用到了PL2模型。详细可在 terrier weighting model中查看

-c表示參数,后面10.99表示參数值

-Dtrec.topics表示your.query文件的详细路径

假设有多个索引文件。多个不同的query。怎么办?

比方对5个文件集分别建立索引,有5个query分别要在相应的索引文件中面找怎么办,因为是共用terrier.properties配置文件的。

所以你能够通过写一个shell脚本。针对不同的文件集。配置相应的collection.spec, terrier.index.path, trec.results.file.

终于得到的结果和开头indri的结果类似。

两者在写query phrases时都须要注意不要有其它的字符出现,

indri:除了a-z,A-Z,0-9。空格,其余字符如#@¥%都是非法字符。会导致错误

terrier:除了a-z,A-Z,0-9。空格,在多个单词构成的词组时可用双引號(如"term1 term2  term3")。在表示权重时可用^(如”term1 term2“^0.5)。还有某些情况下可用+和-,详细看官网 terrier query language

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章