zoukankan      html  css  js  c++  java
  • Indri和Terrier搜索引擎的使用

    介绍

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

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

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

    文本格式

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

    1、Indri

    Indri建索引

    <parameters>
    <memory>16G<memory>
    <index>path/to/index</index> //建完索引后,这些索引结果文件存放的位置,如/home/tempUser/myindex
    <stemmer>
    <name>krovetz</name> //词干化工具,也即分词,这个是默认的,能够选择其它的
    </stemmer>
    
    <corpus>
    <path>path/to/original/file/directory</path> //原始须要建立索引的文件文件夹
    <class>trectext</class>  //须要建立什么格式的索引,有xml, txt, trectext, web
    </corpus>
    
    <field>
    <name>DOCNO</name>  //文本ID号
    </field>
    
    <field>        //假设须要用到时间信息,需加此field。
    <name>date</name>
    <numeric>true</numeric>
    <parserName>DateFieldAnnotator</parserName>
    </field>
    </parameters>

    Indri查询

    配置文件
    <span style="font-size:14px;"><parameters>
    <index>path1/to/index</index>
    <index>path2/to/index</index>
    <rule>method:dirichlet,mu:1000</rule>  //内置方法,用狄利克雷,參数值1000
    <count>1000</count> //每一个查询值返回1000条记录,能够自己设置
    
    <query> //第一个查询
    <number>001</number>  //编号自定义
    //假设文本的公布日期在两个时间段之间的,则在其文本中查询“Abbotsford Arts Centre”,依据其内置算法。计算query phrases与文本的相关度值
    <text>#scoreif(#datebetween(10/05/2011 01/26/2012) #1(Abbotsford Arts Centre))</text> 
    </query>
    <query> //第二个查询
    <number>003</number>
    <text>#scoreif(#datebetween(10/05/2011 08/08/2012) #1(Andy Billig))</text>
    </query>
    
    <trecFormat>true</trecFormat>
    <queryOffset>1</queryOffset>
    <runID>query_id</runID>  //自定义queryID
    </parameters></span>

    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

    2、Terrier

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

    解压tar -xvzf terrier-4.0.gz 
    得到例如以下:

    (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文件夹下生成例如以下图:
    
    
    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标签。能够有多个,用逗号隔开就可以。
    文件格式例如以下:
    <DOC>
    <DOCNO>id</DOCNO>
    <TEXT>text content</TEXT>
    </DOC>

    TrecQueryTags表示检索的query文件的配置
    TrecQueryTags.process表示要处理哪些标签。
    文件格式例如以下:
    <TOP>
    <NUM>003</NUM>  //这个相当于你自己给这个query定一个id。所以能够随便写
    <TITLE>"Abbotsford Arts Centre" office band "Abbotsford Arts Centre May" company "Abbotsford Arts Centre"  </TITLE>  //Query Phrases
    </TOP>

    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的结果类似。
    
    

    3、Indri和Terrier注意点

    两者在写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


  • 相关阅读:
    Codeforces Round #325D (Div. 2) (DP)
    Codeforces Round #382 (Div. 2) (模拟|数学)
    HDU5950-Recursive sequence(矩阵快速幂)
    9. javacript高级程序设计-客户端检测
    8. javacript高级程序设计-BOM
    7. javacript高级程序设计- 函数表达式
    6. javacript高级程序设计-面向对象设计
    Js注释
    5. javacript高级程序设计-引用类型
    4. javacript高级程序设计-变量、作用域和内存问题
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5260451.html
Copyright © 2011-2022 走看看