2012-02-08 15 views
16

Lucene kullanarak bir dizi belge indeksledim. Ayrıca her belge içeriği için DocumentTermVector'ı da sakladım. Her program için bir program yazdım ve frekans vektörünü aldım, fakat her bir belgenin tf-idf vektörünü nasıl alabilirim?Ekstra tf-idf vektörleri lucene ile ayıkla

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

yaz yapmak için Lucene herhangi Buit işlevi var mı: İşte

her belgede vadeli frekansları verir benim kodudur?


kimse yardım etti, ben kendim yaptım: her dönem kimlik numarasını bulmak için herhangi bir yol

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

var mı?


kimse yardım etti, ben yine tek başıma yaptım:

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

cevap

2

Muhtemelen bir tf-idf vektör bulunamadı edeceğiz. Fakat daha önce yaptığınız gibi, IDF'yi elle hesaplayabilirsiniz. Bunu sizin için hesaplamak için DefaultSimilarity (ya da kullandığınız Benzerlik uygulaması) kullanmak muhtemelen daha iyidir.

Terim Kimliği ile ilgili olarak, şu anda yapamayacağınızı düşünüyorum. At least not until Lucene 4.0, bakınız this.

+0

Ancak tüm terimler bir dizinde sıralandı ve benzersiz bir sayıya sahipler (sıraları)! Her dönem için bu numaraya nasıl erişebilirim? – orezvani

+0

Bu bölümü çözdüm! – orezvani

+0

Dizininiz statikse (başlangıç ​​toplu iş dizininden sonra daha fazla belge eklemezseniz), bu sıralı siparişi kimlik kimliği olarak kullanabilirsiniz. İlk terim, ID: 0, ikinci terim, ID: 1, vb ... Terim ID'leri lümene dışsal olarak ihtiyaç duyuyorsa, bu kimlikleri de bunun dışında yaratabilirsiniz. Şartları yineleyin ve bunları (sizin tarafınızdan) ID ile ayrı ayrı Lucene'den saklayın. –