【问题标题】:How to get the term frequency of specific term in each doc with Lucene5.3?如何使用 Lucene5.3 获取每个文档中特定术语的词频?
【发布时间】:2015-12-26 12:26:25
【问题描述】:

假设有三个文档。 Doc1:大家好,我是李。你好。 Doc2:干得好,孩子。 Doc3:嗨,男孩。我还年轻。

我尝试用 Lucene5.3 获取每个文档中每个词条的词频。

我想要得到的结果: 文件1: 嗨 2 每个人 1 我 1 我是 1 李1

1   IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(iNDEX_DIR2).toPath()));

2   int num_doc = reader.numDocs();
3   for(int docNum=0; docNum<num_doc; docNum++){
4       try{

5           Document doc = reader.document(docNum);
6           System.out.println("Processing file:"+doc.get("filename"));
7           
8           Terms termVector = reader.getTermVector(docNum, "contents");
9           TermsEnum itr = termVector.iterator();
10          BytesRef term = null;
11                          
12          while((term = itr.next()) != null){
13              try{
14                  String termText = term.utf8ToString();
15                  Term termInstance = new Term("contents",term);      
16                  long termFreq = reader.totalTermFreq(termInstance);
17                  long docCount = reader.docFreq(termInstance);
18                  
19                  System.out.println("term: "+termText+", termFreq = "+termFreq+", docCount = "+docCount);
20              }catch(Exception e){
21                  System.out.println(e);
22              }
23          }

我得到特定术语的总术语频率。 谁能帮帮我?

谢谢!

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    使用PostingEnum.freq()

    在您的情况下,您有一个带有 TermVector 的索引,因此请使用以下内容(第 7 行之后):

    8           Terms termVector = reader.getTermVector(docNum, "contents");
    9           TermsEnum itr = termVector.iterator();
    10          BytesRef term = null;
    11          PostingsEnum postings = null;
    12          while((term = itr.next()) != null){
    13              try{
    14                  String termText = term.utf8ToString();
    15                  postings = itr.postings(postings, PostingsEnum.FREQS);
    16                  int freq = postings.freq();
    17
    18
    19                  System.out.println("doc:" + docNum + ", term: " + termText + ", termFreq = " + freq);
    20              } catch(Exception e){
    21                  System.out.println(e);
    22              }
    23          }
    

    (如果您需要所有文档的频率:请注意,您可以在没有 TermVector 的情况下访问 PostingEnum)。

    【讨论】:

    • 使用这段代码,我得到一个错误 - java.lang.IllegalStateException: DocsEnum not started
    • @Vijendra 写 postings.nextDoc(); 第 16 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多