我试图在java中实现一个应该能够接受文档列表的程序,例如3,然后使用一些单项查询,我应该能够得到该单词出现的次数的结果文档。
结果应该在元组中返回,例如[doc 1,doc 2]。它应该实现为在内存中运行的倒排索引。
例如,如果我有:
寻找" water"得出结果: [doc 1]
寻找鱼应该给: [doc1,doc2,doc3]
我试图将问题分成更小的部分,因此我更容易专注于如何实际实现它。我想的更像是这样:
1)开始以某种方式索引文档
2)支持单期搜索
3)返回按TF-IDF
排序的匹配文档列表如果我们从第1点开始,我该如何开始解决这个问题?
答案 0 :(得分:1)
Map<String, Long>
,其中包含文档中的所有单词和出现次数(搜索SO - 已多次解决此问题)。使用String::split
可以帮助提取单个单词。您可能希望将单词存储为小写以便于搜索(请注意,这在某些语言(例如土耳其语)中效果不佳。)Map::get
查找每个文档中单词的出现次数答案 1 :(得分:0)
我认为Assylias解决方案是最好的。但我建议使用Lucene,它正是你想要达到的目标。
答案 2 :(得分:0)
这个例子怎么样:
String keyword = "fish";
List<String> results = new ArrayList<String>();
for(Document doc:documents){
if(doc.getTextContent().contains(keyword)){
results.add(doc);
}
}
System.out.println(results);
答案 3 :(得分:0)
为什么需要计算TF-IDF权重?
如果您只是返回匹配一个单词的文档,那么您正在执行布尔检索,这不需要您计算任何tf-idf。如果您正在进行概率检索并且您正在计算分数等,则需要tf-idf。