如何使用Lucene5.3获取每个文档中特定术语的术语频率?

时间:2015-12-26 12:26:26

标签: java lucene

想象一下有三个文件。 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          }

我得到特定学期的总学期频率。 有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

使用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。)