2012-02-08 109 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]); 
     } 
    } 

是否有任何的Lucene BUIT的函數爲我做到這一點?


沒有人幫助,而我做到了我自己:

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)); 
     } 
    } 

有沒有什麼辦法找每個詞的ID號?


沒有人幫助,我再次做到了我自己:

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 2012-02-08 14:11:47

+0

我確實解決了這個問題! – orezvani 2012-02-08 21:35:02

+0

如果您的索引是靜態的(在初始批次索引後不添加更多文檔),則可以使用此排序順序作爲術語ID。第一項,ID:0,第二項,ID:1,等等......如果對於術語ID的需求在lucene外部,您也可以在其外部創建此ID。迭代條款並將它們與Lucene分開存儲(由您指定)。 – 2012-02-09 14:47:49