16
lucene을 사용하여 일련의 문서를 색인화했습니다. 또한 각 문서 내용에 대해 DocumentTermVector를 저장했습니다. 나는 프로그램을 작성하고 각 문서에 대한 용어 빈도 벡터를 얻었지만 어떻게 각 문서의 tf-idf 벡터를 얻을 수 있습니까?lucene을 사용하여 tf-idf 벡터를 추출하십시오.
Directory dir = FSDirectory.open(new File(indexDir));
IndexReader ir = IndexReader.open(dir);
for (int docNum=0; docNum<ir.numDocs(); docNum++) {
System.out.println(ir.document(docNum).getField("filename").stringValue());
TermFreqVector tfv = ir.getTermFreqVector(docNum, "contents");
if (tfv == null) {
// ignore empty fields
continue;
}
String terms[] = tfv.getTerms();
int termCount = terms.length;
int freqs[] = tfv.getTermFrequencies();
for (int t=0; t < termCount; t++) {
System.out.println(terms[t] + " " + freqs[t]);
}
}
나를 그렇게하기 위해 루씬의 모든 BUIT 함수가 있습니까 : 여기
각 문서의 용어 주파수를 출력 내 코드는?아무도 도움이되지, 나는 나 자신에 의해 그것을했다 : 각 용어의 ID 번호를 찾을 수있는 방법이
Directory dir = FSDirectory.open(new File(indexDir));
IndexReader ir = IndexReader.open(dir);
int docNum;
for (docNum = 0; docNum<ir.numDocs(); docNum++) {
TermFreqVector tfv = ir.getTermFreqVector(docNum, "title");
if (tfv == null) {
// ignore empty fields
continue;
}
String tterms[] = tfv.getTerms();
int termCount = tterms.length;
int freqs[] = tfv.getTermFrequencies();
for (int t=0; t < termCount; t++) {
double idf = ir.numDocs()/ir.docFreq(new Term("title", tterms[t]));
System.out.println(tterms[t] + " " + freqs[t]*Math.log(idf));
}
}
가?
아무도 도움이되지, 나는 다시 혼자 해냈어 :
List list = new LinkedList();
terms = null;
try
{
terms = ir.terms(new Term("title", ""));
while ("title".equals(terms.term().field()))
{
list.add(terms.term().text());
if (!terms.next())
break;
}
}
finally
{
terms.close();
}
int docNum;
for (docNum = 0; docNum<ir.numDocs(); docNum++) {
TermFreqVector tfv = ir.getTermFreqVector(docNum, "title");
if (tfv == null) {
// ignore empty fields
continue;
}
String tterms[] = tfv.getTerms();
int termCount = tterms.length;
int freqs[] = tfv.getTermFrequencies();
for (int t=0; t < termCount; t++) {
double idf = ir.numDocs()/ir.docFreq(new Term("title", tterms[t]));
System.out.println(Collections.binarySearch(list, tterms[t]) + " " + tterms[t] + " " + freqs[t]*Math.log(idf));
}
}
그러나 모든 용어는 정렬되어 인덱스 (순서)에 고유 번호가 있습니다! 각 학기에 해당 번호에 어떻게 액세스합니까? – orezvani
나는이 부분을 해결했다! – orezvani
인덱스가 정적 인 경우 (초기 배치 인덱스 이후에 문서를 더 추가하지 않음)이 정렬 된 순서를 용어 ID로 사용할 수 있습니다. 첫 번째 용어, ID : 0, 두 번째 용어, ID : 1, 등등 ... Term ID의 필요성이 lucene 외부에있는 경우이 ID를 외부에 만들 수도 있습니다. 이용 약관을 반복하고 Lucene과 별도로 할당 된 ID (귀하) ID와 별도로 보관하십시오. –