Java - 倒排索引

时间:2017-08-03 16:45:24

标签: java sorting indexing

我试图在java中实现一个应该能够接受文档列表的程序,例如3,然后使用一些单项查询,我应该能够得到该单词出现的次数的结果文档。

结果应该在元组中返回,例如[doc 1,doc 2]。它应该实现为在内存中运行的倒排索引。

例如,如果我有:

  • Doc 1:"水中的鱼"
  • Doc 2:"鱼被命名为billy"
  • doc 3:"鱼在游泳"

寻找" water"得出结果: [doc 1]

寻找鱼应该给: [doc1,doc2,doc3]

我试图将问题分成更小的部分,因此我更容易专注于如何实际实现它。我想的更像是这样:

1)开始以某种方式索引文档

2)支持单期搜索

3)返回按TF-IDF

排序的匹配文档列表

如果我们从第1点开始,我该如何开始解决这个问题?

4 个答案:

答案 0 :(得分:1)

  1. 为每个文档创建一个Map<String, Long>,其中包含文档中的所有单词和出现次数(搜索SO - 已多次解决此问题)。使用String::split可以帮助提取单个单词。您可能希望将单词存储为小写以便于搜索(请注意,这在某些语言(例如土耳其语)中效果不佳。)
  2. 然后,您可以使用Map::get查找每个文档中单词的出现次数
  3. 输出结果

答案 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。