2013-12-13 2 views
6

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

//@param index path to index directory 
//@param docNbr the document number in the index 
public void readingIndex(String index, int docNbr) { 
    IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index))); 

    Document doc = reader.document(docNbr);   
    System.out.println("Processing file: "+doc.get("id")); 

    Terms termVector = reader.getTermVector(docNbr, "contents"); 
    TermsEnum itr = termVector.iterator(null); 
    BytesRef term = null; 

    while ((term = itr.next()) != null) {    
     String termText = term.utf8ToString();        
     long termFreq = itr.totalTermFreq(); //FIXME: this only return frequency in this doc 
     long docCount = itr.docFreq(); //FIXME: docCount = 1 in all cases 

     System.out.println("term: "+termText+", termFreq = "+termFreq+", docCount = "+docCount); 
    }    

    reader.close();  
} 

हालांकि प्रलेखन कहते हैं totalTermFreq() सभी दस्तावेजों भर में इस अवधि की घटनाओं की कुल संख्या देता है, जब मैंने पाया परीक्षण यह केवल docNbr द्वारा दिए गए दस्तावेज में इस शब्द की आवृत्ति रिटर्न । और docFreq() हमेशा वापस आते हैं 1.

मैं पूरे सूचकांक में किसी शब्द की आवृत्ति कैसे प्राप्त कर सकता हूं?

अद्यतन बेशक, मैं अपनी आवृत्ति में एक शब्द को मैप करने के लिए एक नक्शा बना सकता हूं। फिर प्रत्येक दस्तावेज़ के माध्यम से एक शब्द होने की कुल संख्या की गणना करने के लिए पुनरावृत्त करें। हालांकि, मैंने सोचा कि ल्यूसीन के उस उद्देश्य के लिए एक विधि में बनाया जाना चाहिए। धन्यवाद,

उत्तर

12

IndexReader.TotalTermFreq(Term) यह आपके लिए प्रदान करेगा। TermsEnum पर समान विधियों पर आपकी कॉल वास्तव में गणना में सभी दस्तावेजों के आंकड़े प्रदान कर रही हैं। पाठक का उपयोग करके आपको इंडेक्स में सभी दस्तावेजों के आंकड़े मिलेंगे। कुछ ऐसा:

String termText = term.utf8ToString(); 
Term termInstance = new Term("contents", term);        
long termFreq = reader.totalTermFreq(termInstance); 
long docCount = reader.docFreq(termInstance); 

System.out.println("term: "+termText+", termFreq = "+termFreq+", docCount = "+docCount); 
+0

बढ़िया! यह काम करता हैं। मैंने पहले इस विधि को देखा लेकिन यह सुनिश्चित नहीं था कि बाइट्सआरफ को वापस टर्म में कैसे परिवर्तित किया जाए। बीटीडब्ल्यू, क्या आपके पास कोई अंतर्दृष्टि है क्यों लुसीन itr.next() बाइट्सफ को वापस कर देता है और टर्म नहीं? और termsEnum पर docFreq() क्यों है यदि यह केवल 1 लौटाता है? धन्यवाद। – chepukha

+0

हां, आपके पास एकाधिक दस्तावेजों, या एक संपूर्ण अनुक्रमणिका पर शर्तों पर 'शर्तों' नामांकन हो सकता है, इस मामले में यह एक और अधिक उपयोगी आंकड़ा होगा। जहां तक ​​यह बाइट्स रीफ वापस भेजता है, मैं खुद को सोच रहा था। 3.X में यह 'टर्म' को 'टर्म()' से वापस पास कर दिया, लेकिन इसके बजाय इसे 'बाइट्सआरफ' वापस पास करने के लिए 4.0 में बदल दिया गया। हो सकता है कि इसे इस तरह से फिर से डिजाइन किया गया था कि शर्तें एनीम 'वास्तव में वास्तव में स्टोर नहीं करता है कि शब्द किस क्षेत्र में पाया गया था। बस एक अनुमान हालांकि, वास्तव में सुनिश्चित नहीं है। – femtoRgon

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