Lucene 4.4. Wie man Begriff Frequenz über alle index?
Ich versuche zur Berechnung der tf-idf-Wert der einzelnen Begriffe in einem Dokument. So, ich Durchlaufen, der Begriffe in einem Dokument und finden wollen, die Frequenz des Wortes im gesamten Korpus und die Anzahl der Dokumente, in denen der Begriff erscheint. Folgendes ist mein code:
//@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();
}
Obwohl die Dokumentation besagt totalTermFreq() gibt die Gesamtanzahl der vorkommen dieses Begriffes in allen Dokumenten, bei Tests habe ich festgestellt, es gibt nur die Häufigkeit des Begriffs im Dokument gegeben durch docNbr. und docFreq() immer 1 zurück.
Wie kann ich die Frequenz eines terms über die gesamte index?
Update
Natürlich kann ich eine Karte zu Karte ein Begriff, der auf seine Frequenz. Dann Durchlaufen Sie jedes Dokument, das zum zählen der Gesamtzahl der Zeit-ein Begriff, auftreten. Ich dachte jedoch, dass Lucene sollte mit einer integrierten Methode für diesen Zweck.
Danke,
Du musst angemeldet sein, um einen Kommentar abzugeben.
IndexReader.TotalTermFreq(Term)
stellen diese für Sie. Ihre Anrufe auf die ähnliche Methoden auf dieTermsEnum
sind in der Tat die Bereitstellung der Statistiken für alle Dokumente, die in der enumeration. Mit der reader sollte erhalten Sie die Statistiken für alle Dokumente im index selbst. So etwas wie:TermsEnum
Durchlaufen Bezug auf mehrere Dokumente, oder einen gesamten index, in dem Fall wäre es eine weitere nützliche Statistik. Soweit, warum es geht zurück die BytesRef, fragte ich mich selbst. In 3.X es bestandenTerm
zurück vonterm()
, aber es verändert in der Version 4.0 zum pass zurückBytesRef
statt. Könnte sein, dass es wurde so modifiziert, dass die TermsEnum` sich nicht wirklich speichern, in welchem Bereich der Begriff gefunden wurde. Nur eine Vermutung aber nicht wirklich sicher.