上一篇文章 :【信息检索】Java简易搜索引擎原理及实现(一)建立倒排索引,我们已经建立好了倒排索引的结构,这篇文章中,我们将新增停用词表,同时对用户输入的查询词做基本的处理。
实现步骤
1)新增停用词表(stop word):常指介词、代词、冠词,剔除倒排索引结构的字典中的停用
词。
2)基本布尔操作基本算法:2 组/6 个基本操作算法,即:
- 2-way Merge: AND(p1,p2), OR(p1,p2), ANDNOT(p1,p2)
- m-way Merge: AND(<p1,p2,…,pn>), OR(<p1,p2,…,pn>), ANDOR(<p1,p2,…,pn>)
实验结果效果:
1)输入格式:word1 OP word2 OP word3 …, OP: AND/OR/ANDNOT
2)输出格式:items/posting list/…
3)输出结果:满足查询条件的 DocID 的结果集。
运行效果截图
代码实现
先放上完整的调用函数,后面给出具体实现
public class Experiment2 {
private Scanner scanner;
public static void main(String[] args) {
Experiment2 experiment2 = new Experiment2();
//新增停词表的字典
LinkedList<Item> dictionary = experiment2.exp2();
//获取用户输入
System.out.println("请输入搜索词:(退出请输入-1)");
experiment2.scanner = new Scanner(System.in);
String input = experiment2.scanner.nextLine().trim();
//输入词查询
experiment2.query(input, dictionary);
}
public LinkedList<Item> exp2() {
//获取到实验1得到的倒排索引字典
Experiment1 exp1 = new Experiment1();
LinkedList<Item> dictionary = exp1.exp1();
//新增停用词表(stop word):介词(/p)、代词(/r)、助词(/u)、标点符号(/w),剔除倒排索引结构的字典中的停用词。
delStopWord(dictionary);
return dictionary;
}
}
新增停用词表(stop word):常指介词、代词、冠词,剔除倒排索引结构的字典中的停用词。
利用NLPIR分词器判断每个term项的词性。可根据自己的需求修改需要剔除的词汇。
//新增停用词表(stop word):介词(/p)、代词(/r)、助词(/u)、标点符号(/w),剔除倒排索引结构的字典中的停用词。
public static void delStopWord(LinkedList<Item> dictionary) {
Iterator<Item> iterator = dictionary.iterator();
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher matcher;
while (iterator.hasNext()) {
Item item = iterator.next();
if (item.term.contains("*") || item.term.contains("http")) {
//不允许单词内包含*或单词为网址
iterator.remove();
continue;
}
String prop = NlpirMethod.NLPIR_GetWordPOS(item.term); //词性
int pos = prop.indexOf("/") + 1;
matcher = p