2012-02-08 14 views
16

के साथ टीएफ-आईडीएफ वैक्टर निकालें मैंने ल्यूसीन का उपयोग करके दस्तावेजों का एक सेट अनुक्रमित किया है। मैंने प्रत्येक दस्तावेज़ सामग्री के लिए DocumentTermVector भी संग्रहीत किया है। मैंने एक कार्यक्रम लिखा और प्रत्येक दस्तावेज़ के लिए आवृत्ति वेक्टर शब्द मिला, लेकिन मैं प्रत्येक दस्तावेज़ के टीएफ-आईडीएफ वेक्टर कैसे प्राप्त कर सकता हूं?लुसीन

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

वहाँ किसी भी तरह से प्रत्येक शब्द का आईडी नंबर मिल रहा है?


कोई भी मदद की, और मैं फिर से अपने आप से यह किया:

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-आईडीएफ वेक्टर पाया हूँ। लेकिन जैसा कि आप पहले ही कर चुके हैं, आप हाथ से आईडीएफ की गणना कर सकते हैं। आपके लिए गणना करने के लिए DefaultSimilarity (या जो भी समानता कार्यान्वयन आप उपयोग कर रहे हैं) का उपयोग करना शायद बेहतर है।

टर्म आईडी के संबंध में, मुझे लगता है कि वर्तमान में आप नहीं कर सकते हैं। At least not until Lucene 4.0, this देखें।

+0

लेकिन सभी शर्तों को क्रमबद्ध किया गया है और एक सूचकांक (उनके आदेश) में एक अद्वितीय संख्या है! मैं प्रत्येक शब्द के लिए उस नंबर तक कैसे पहुंच सकता हूं? – orezvani

+0

मैंने इस भाग को हल किया था! – orezvani

+0

यदि आपकी अनुक्रमणिका स्थिर है (आप आरंभिक बैच इंडेक्स के बाद अधिक दस्तावेज़ नहीं जोड़ते हैं) तो आप इस सॉर्ट किए गए ऑर्डर को टर्म आईडी के रूप में उपयोग कर सकते हैं। पहला शब्द, आईडी: 0, दूसरा शब्द, आईडी: 1, एक ऐसा ... यदि टर्म आईडी की आवश्यकता लुसीन के बाहर है, तो आप इसके बाहर इस आईडी भी बना सकते हैं। नियमों को दोहराएं और उन्हें ल्यूसीन से अलग से अपने संबंधित असाइन किए गए (आईडी) आईडी के साथ स्टोर करें। –

संबंधित मुद्दे