Lucene을 통해 발견되는 다양한 문서의 COMBINED_FIELD 필드에있는 각 용어에 대해 필드 표준으로 정규화 된 TF-IDF 점수를 계산하려고합니다. 아래 코드에서 볼 수 있듯이 문서 필드에서 각 용어의 빈도를 구할 수 있으며 문서 빈도를 얻을 수도 있지만이 필드의 표준을 구할 수있는 방법을 찾을 수 없습니다. 질의 시간. 필자가 지금까지 발견 한 모든 접근법은 오래된 Lucene 버전에만 존재하지만 Lucene 6에는 존재하지 않는 방법에 의존합니다. 이동 방법은 LeafReader의 사용 일지 모르지만 그 인스턴스를 얻는 방법을 찾지 못했습니다.Lucene 6에서 문서의 필드 표준을 얻는 방법은 무엇입니까?
각 문서에 대해 COMBINED_FIELD 필드의 표준을 어떻게 얻을 수 있는지 알고 있습니까?
필드 길이 대신 termVector.size()를 사용할 수 있습니까? size()는 각 용어의 숫자가 건이라고 간주합니까? 아니면 모든 용어가 한 번만 계산됩니까?
미리 감사드립니다.
IndexSearcher iSearcher = null;
ScoreDoc[] docs = null;
try {
iSearcher = this.searchManager.acquire();
IndexReader reader = iSearcher.getIndexReader();
MultiFieldQueryParser parser = new MultiFieldQueryParser(this.getSearchFields(), this.queryAnalyzer);
parser.setDefaultOperator(QueryParser.Operator.OR);
Query query = parser.parse(QueryParser.escape(searchString));
docs = iSearcher.search(query, maxSearchResultNumber).scoreDocs;
for(int i=0; i < docs.length; i++) {
Terms termVector = reader.getTermVector(docs[i].doc, COMBINED_FIELD);
TermsEnum itr = termVector.iterator();
BytesRef term = null;
PostingsEnum postings = null;
while((term = itr.next()) != null){
String termText = term.utf8ToString();
postings = itr.postings(postings, PostingsEnum.FREQS);
postings.nextDoc();
int tf = postings.freq();
int docFreq = reader.docFreq(new Term(COMBINED_FIELD, term));
//HERE I WANT TO GET THE FIELD LENGTH OF THE CURRENT DOCUMENT
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
this.searchManager.release(iSearcher);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Alternively, 루씬에서 직접 필드의 각 용어에 대한 TF-IDF 또는 BM25 값을 얻을 수있는 방법이 있나요?
그래서 표준을 구하거나 길이를 구합니다. – Mysterion
사실 Lucene이 색인 생성 중에 계산하는 표준을 알고 싶습니다. 그러나 가능하지 않으면 프록시로 길이를 사용하고 1/sqrt (길이)로 내 표준을 사용합니다. –