好的,让我试着解释一下我做了什么,然后希望我所要求的更清楚。我正在分析文档并尝试根据一些文档中经常出现的单词对它们进行评分,尽管整个索引中并不常见。到目前为止,我已经获得了一些非常有趣的结果,并且能够看到给定文档中每个术语的tf和idf。
为了对整个文档进行评分,我想做一些与tf-idf相关的事情,但我不想使用文档中的每个术语。现在,我已经硬编码了一些过滤器,以摆脱过于常见的单词(其idf对于我来说太低而言不重要的单词),以及过于罕见的单词(具有非常高的idf分数的单词;根据我的经验,它们通常是拼写错误)。
有没有一种很好的方法可以动态过滤掉idf中的异常值? 而不是:
if (idf > x && idf < y)
include the word
我想做类似的事情:
if (idf is in the 60th percentile of idfs for the index)
include it
也许这是最好的方法,但是我想听听您提出的任何其他解决方案,谢谢!
答案 0 :(得分:1)
评分过程的最后一步是由Similarity对象完成的。我相信你只需要发展个性化的相似性。 DefaultSimilarity(显然)是Lucene使用的默认类。它扩展了TFIDFSimilarity。我建议你阅读这两个类的代码,以便了解如何开发自己的类。
一旦开发了类,假设它被称为KmancSimilarity,下面是如何运行它:
Directory dir = <your dir>;
IndexReader index = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(index);
searcher.setSimilarity(new KmancSimilarity());
continue your code...
我一直在使用4.8版,所以我不知道它是否适用于其他人。
我希望它有所帮助。