#!/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 # 查看打分结果