2012-02-08 3 views
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)); 
     } 
    } 

답변

2

당신은 아마 TF-IDF 벡터를 찾을 수없는 것이다. 그러나 이미 완료 했으므로 IDF를 손으로 계산할 수 있습니다. DefaultSimilarity (또는 사용중인 유사성 구현)을 사용하여 계산하는 것이 더 좋습니다.

용어 ID와 관련해서는 현재 할 수 없다고 생각합니다. At least not until Lucene 4.0, this을 참조하십시오.

+0

그러나 모든 용어는 정렬되어 인덱스 (순서)에 고유 번호가 있습니다! 각 학기에 해당 번호에 어떻게 액세스합니까? – orezvani

+0

나는이 부분을 해결했다! – orezvani

+0

인덱스가 정적 인 경우 (초기 배치 인덱스 이후에 문서를 더 추가하지 않음)이 정렬 된 순서를 용어 ID로 사용할 수 있습니다. 첫 번째 용어, ID : 0, 두 번째 용어, ID : 1, 등등 ... Term ID의 필요성이 lucene 외부에있는 경우이 ID를 외부에 만들 수도 있습니다. 이용 약관을 반복하고 Lucene과 별도로 할당 된 ID (귀하) ID와 별도로 보관하십시오. –

관련 문제