第2章 自己动手写全文检索
很多软件系统都需要对应的数据结构。信息检索中最常用的数据结构是倒排索引。全文索引如图2-1所示。
图2-1 以词为基础的全文索引
倒排索引就是一个词到文档列表的映射。用HashMap实现的一个简单的倒排索引代码如下。
public class InvertedIndex {
Map<String, List> index =
new HashMap<String, List>(); //词和这个词在文档中出现的位置信息
// 索引文档
public void indexDoc(String docName, ArrayList words) {
int pos = 0;
for (String word : words) {
pos++; // 位置
List idx = index.get(word);
if (idx == null) {
idx = new LinkedList();
index.put(word, idx);
}
idx.add(new Tuple(docName, pos));
System.out.println("indexed " + docName + " : " + pos + " words");
}
}
// 搜索
public void search(List words) {
for (String word : words) {
Set answer = new HashSet();
List idx = index.get(word);
if (idx != null) {
for (Tuple t : idx) { //找到了一些文档
answer.add(t.docName);
}
}
System.out.print(word);
for (String f : answer) {
System.out.print(" " + f); //输出文件名
}
System.out.println("");
}
}
private class Tuple { //<文档名,位置>元组
private String docName; // 文档名
private int position; // 位置
public Tuple(String d, int position) {
this.docName = d;
this.position = position;
}
}
}
如果用户的查询中包含多个词,需要统计这些词在文档中出现的区间大小。区间越小的文档相关度越高。
public class Span {
public int start; // 开始位置
public int end; // 结束位置
……
展开