想象一下有三个文件。 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 }
我得到特定学期的总学期频率。 有人可以帮助我吗?
谢谢!
答案 0 :(得分:2)
在您的情况下,您有一个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。)