在Solr和Java中计算文档中单词的TF-IDF。

4
我可以通过计算文档中术语的数量轻松获得TF,而我想知道如何计算文档频率,即包含此术语的文档数量。
截至目前为止,我查询Solr并返回大量结果进行计数,但这非常耗时和内存。我只想计算术语。
    SolrQuery q = new SolrQuery();
    q.setQuery("tweet_text:"+kw);
    q.addField("tweet_text");
    q.setRows(40000000);        
    SolrDocumentList results = null ;

    try {
        QueryResponse rsp = solrServer.query(q);
        results = rsp.getResults();
    } catch (SolrServerException e) {
        e.printStackTrace();
    }

    ArrayList<String> tweets = new ArrayList<String>();
    for (SolrDocument doc : results)
    {
        tweets.add(doc.getFieldValue("tweet_text").toString());
    }
1个回答

7

在SOLR中,您可以使用函数查询直接查询docFreq,如下所示:http://wiki.apache.org/solr/FunctionQuery#docfreq

q={!func}docFreq(tweet_text, kw)

请注意,该页面还记录了用于获取tf、idf和termfreq的函数查询方法,这对您也可能有帮助。
回过头来看,这可能与此问题不太相关,但我将保留它以备后用。 IndexReader.docFreq(Term)可以获取您需要的内容。
例如:
reader.docFreq(new Term("tweet_text", kw));'

顺便说一下,IndexSearcher.docFreq(Term)是同样的东西。


我应该首先包含 "import org.apache.lucene.index.IndexReader;" 和 Apache Lucene jars,以访问 IndexReader 对象吗? - Hady Elsahar
我没有像应该那样密切关注你的搜索方式。我认为你应该只发送一个函数查询来获取它。我已经修改了我的答案以反映这一点。 - femtoRgon
我构建了这个查询 http://localhost:8983/solr/db/select? defType=func&q=docfreq(tweet_text,'@')搜索'@'字符的文档频率 当我打开此网址时,无法在结果中找到docfreq结果:http://pastie.org/5407275 - Hady Elsahar
1
我发现应该在字段列表中显示名为“score”的字段。这个可以工作:http://localhost:8983/solr/db/ select?fl=score&defType=func&q=docfreq(tweet_text,'@') - Hady Elsahar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接