Sto provando a calcolare il valore tf-idf di ciascun termine in un documento. Quindi, faccio scorrere i termini di un documento e voglio trovare la frequenza del termine nel corpo intero e il numero di documenti in cui il termine appare. In seguito è il mio codice:Lucene 4.4. Come ottenere la frequenza dei termini su tutto l'indice?
//@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();
}
Anche se la documentazione dice totalTermFreq() restituisce il numero totale di occorrenze di questo termine in tutti i documenti, quando si prova l'ho trovato restituisce solo la frequenza del termine nel documento consegnato dal docNbr . e docFreq() restituisce sempre 1.
Come posso ottenere la frequenza di un termine nell'intero indice?
Aggiornamento Naturalmente, posso creare una mappa per mappare un termine alla sua frequenza. Quindi scorrere ogni documento per contare il numero totale di volte in cui si verifica un termine. Tuttavia, pensavo che Lucene avrebbe dovuto avere un metodo integrato per quello scopo. Grazie,
Grande! Funziona. Ho visto questo metodo prima ma non ero sicuro su come convertire BytesRef di nuovo a Term. A proposito, avete qualche idea sul perché Lucene ha itr.next() restituisce BytesRef e non Term? e perché avere docFreq() su TermsEnum se restituisce solo 1? Grazie. – chepukha
Sì, si potrebbe avere un 'TermsEnum' che itera su termini su più documenti o su un intero indice, nel qual caso sarebbe una statistica più utile. Per quanto riguarda il motivo per cui restituisce il BytesRef, mi stavo chiedendo anch'io. In 3.X è passato un 'Term' indietro da' term() ', ma è cambiato in 4.0 per passare invece il' BytesRef'. Potrebbe essere che è stato ridisegnato in modo tale che lo stesso TermsEnum non memorizza realmente in quale campo è stato trovato il termine. Solo un'ipotesi però, non proprio sicura. – femtoRgon