java - 使用 Lucene 计算 TFIDF 分数

标签 java apache lucene

这是我计算文档集合中文档的 TF-IDF 值的程序。 这工作正常,但在计算“IDF”值(查找包含特定术语的文档数量)时会花费大量时间。

是否有更有效的方法来查找包含特定术语的文档数量?

freq = termsFreq.getTermFrequencies();

terms = termsFreq.getTerms();

int noOfTerms = terms.length;
score = new float[noOfTerms];
DefaultSimilarity simi = new DefaultSimilarity();

        for (i = 0; i < noOfTerms; i++) {

            int noofDocsContainTerm = noOfDocsContainTerm(terms[i]);
            float tf = simi.tf(freq[i]);
            float idf = simi.idf(noofDocsContainTerm, noOfDocs);  
            score[i] = tf * idf ;

        }

////

public int noOfDocsContainTerm(String querystr) throws CorruptIndexException, IOException, ParseException{

QueryParser qp=new QueryParser(Version.LUCENE_35, "docuemnt", new StandardAnalyzer(Version.LUCENE_35));  

Query q=qp.parse(querystr);

int hitsPerPage = docNames.length; //minumum number or search results
IndexSearcher searcher = new IndexSearcher(ramMemDir, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);

searcher.search(q, collector);

ScoreDoc[] hits = collector.topDocs().scoreDocs;

    return hits.length;
}

最佳答案

如果您有一个术语并想要它的文档频率,即包含该术语的文档数量:请调用 IndexReader.termEnum(Term)方法。它为您提供了一个 TermEnum 对象。然后,调用TermEnum.docFreq()方法。它为您提供了该术语在索引中的文档频率。

关于java - 使用 Lucene 计算 TFIDF 分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360120/

相关文章:

java - 如何使用 OR 合并两个 Lucene 查询?

elasticsearch - 如何在 Elasticsearch 索引中检索所有文档(大小大于 10000)

java - eclipse调试器: enter a method without entering nested methods

java - 新 Activity 不保留 Facebook 访问 token

java - 如何在Java中使用FileDialog绘制图像

XAMPP 上的 Php-intl 安装

java - 嵌入式 Jetty,在给定时间后终止请求

python - 使用 apache 和 mod_wsgi 提供静态文件而不更改 apache 的配置?

php - 指定接受 : header 时 Apache 406 Not Acceptable

java - 我的 java 进程的文件描述符变为 "bad",我不知道为什么