/se

Toy search engine, developed to run on large dataset like gov2

Primary LanguageC++

#!/usr/bin/env vim
将位置信息与模糊查询等功能暂时去掉, 可在Gov2下完成索引与检索(索引大小12G)
IndexSearcher初始化占用内存5.3G,但是,搜高频词时需要足够大的内存
(包括虚拟内存至少8G空闲空间)

测试时,用BM25 (k=1.2, b=0.4), 对于idf评分为负的query不作考虑,对每个topic
取前10,000篇相关文档输出,打分的结果如下(详细结果在log文件夹下): 

TREC 04:
R-prec    0.3287
map       0.2818
P5        0.5469
P10       0.5469

TREC 05:
R-prec    0.3512
map       0.3178
P5        0.5400
P10       0.5440

TREC 06:
R-prec    0.3125
map       0.2653
P5        0.5360
P10       0.4900

TREC 04~06:
R-prec    0.3308
map       0.2883
P5        0.5409
P10       0.5268

snippet的生成策略是:长度最多为80字符,头尾的词都必须完整,优先输出覆盖最多查询串字符的片段,
(但这样当query含有高频词时,snippet会输出更多高频词而把低频query漏掉)
结果如下(命令行下有染色处理):

query = (peking | university)

BM25:    numhit = 2848432
[19003836] 23.656693 GX075-12-12551435 (718)
  ... Jian Dai , Xing-Chang Song (Peking University) Comments: LaTeX 5 pages,...
[19183958] 23.656693 GX075-12-4179505 (718)
  ... Jian Dai , Xing-Chang Song (Peking University) Comments: LaTeX 5 pages,...
[20943851] 23.383717 GX180-06-12915650 (1985)
  ...Lee , H.G. Wang , R.X. Xu (Peking University, Beijing, China) Comments: 5...
[ 1036750] 22.956249 GX171-89-10767512 (901)
  ... Jian Dai , Xing-Chang Song (Peking University) Comments: LaTeX, 15 pages,...
[  443665] 22.733286 GX088-41-11788847 (138)
  ...F. Zhu (Peking University)   WPAH312 Research on Peking University ...
... (result trucated)


================================
GOV2数据信息:
文档个数:           25205179
stem后词项个数:     10475630
平均文档长度:       758.61

索引信息:
倒排表大小(无距离): 12GB


================================
RCV1数据信息:
文档个数:           806791
词项个数:           438488
stem后词项个数:     371521
平均文档长度:       261.19  (#ttf=210728333)
平均词项长度:       8.42    (#permuterm=3691287)

索引信息:
词典大小:           7.1MB
倒排表大小(带距离): 2.4GB
压缩后大小(带距离): 889MB
permutree大小:      219MB


* 倒排表结构: 三级倒排

词项id  =>  <词项id,文件指针>  =>  <文档id,文件指针>  => 距离信息
            pst.dat.trm            pst.dat.doc           pst.dat.pos

压缩用Variable Byte + D-gap操作。压缩的数列包括: 文档id、文件指针、词项位置。

* permuterm tree : B+树

非叶结点存储部分key值,用于多分查找;
叶结点存储包括非叶结点出现的所有key值。
同一层上的相邻叶结点之间用一个单向链串起来,方便区间搜。
此处,key的结构为 <轮转字符串, 词项id>。
这样,查找wildcard时,通过B+树上的ranged query功能收集到所有命中的
key,将词项id取出来,并把query语法树上的wildcard query结构转变成or query
的结构。如:
      AND                  AND
     /   \       =>       /   \
tropi*al fish            OR   fish
                        /  \
                tropival  tropical

* 词典 : Hashmap

term_id => <term_string, document_frequency, corpus_frequency>
doc_id  => <doc_filename, doc_length>


================================
项目结构

assign-x-yyy
│
├── data -> ../data   # 数据文件, 放在项目的上层目录
├── log  -> ../log    # 评分结果
├── lib               # 静态库文件
├── script            # 处理脚本或测试脚本
├── src               # 源文件
│   ├── index
│   ├── main
│   ├── query
│   ├── search
│   ├── template
│   └── util
├── src               # TREC评测脚本与结果
└── test              # 测试信息

-------

data
│
├── gov2              # GOV2的解压数据,均为天网格式
├── reuter            # RCV1的解压文件,均为xml格式
├── shakespeare       # 前期作业的数据文件
│
├── index             # 程序建立的索引文件
└── reuter-zip        # RCV1的初解压文件,为zip格式,可用script中的脚本处理
    ├── disk1
    └── disk2

================================
测试/开发环境:

系统环境(包括项目编译环境与引用静态库的制作环境): 
  ArchLinux (i686) g++ 4.7.2 glibc 2.17
  Ubuntu  (x86_64) g++ 4.4.3 glibc 2.11.1

用到的外部代码:
  lib/lib*porter.a:   Jamie Callan 的 Porter Stemmer,已打包
  lib/lib*pugixml.a:  Arseny Kapoulkine 的 pugixml库,已打包

makefile自带64位与32位检测,若出问题,
可更改src/Makefile中的$(LIB)进行调整

================================
运行方式:
make clean
make clean-trec
make              # 编译
make init-trec    # 解包

make idx-small    # 根据shakespeare数据集重建索引(会抹掉原有索引)
make idx-medium   # 根据reuter数据集重建索引(会抹掉原有索引)
make idx-large    # 根据gov2数据集重建索引(会抹掉原有索引)

make rnk < test/ranking   # 文档打分测试
make smr < test/ranking   # snippet单独测试(不打分)

make eval-04    # 用trec04的topics.701-750
make eval-05    # 用trec05的topics.751-800
make eval-06    # 用trec06的topics.801-850
make eval-all   # 用trec06的topics.701-850

make view-all   # 查看打分结果