Extrait de tf-idf des vecteurs avec lucene
J'ai indexé un ensemble de documents à l'aide de lucene. J'ai aussi enregistré des DocumentTermVector pour chaque document contenu. J'ai écrit un programme et a obtenu le terme de fréquence de vecteur pour chaque document, mais comment puis-je obtenir tf-idf vecteur de chaque document?
Voici mon code qui génère les fréquences des termes dans chaque document:
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]);
}
}
Est-il un buit-dans la fonction de lucene pour moi de le faire?
Personne ne l'a aidé, et je l'ai fait par moi-même:
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));
}
}
est-il de toute façon de trouver le numéro d'identification de chaque terme?
Personne ne l'a aidé, et je l'ai fait par moi-même, encore:
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));
}
}
Vous devez vous connecter pour publier un commentaire.
Vous aurez probablement pas trouvé un tf-idf vecteur. Mais comme vous l'avez déjà fait, vous pouvez calculer la FID à la main. Il est probablement préférable d'utiliser la DefaultSimilarity (ou quelle que soit la Similitude de mise en œuvre que vous utilisez) pour le calculer pour vous.
Concernant le Terme ID, je pense qu'actuellement vous ne pouvez pas. Au moins pas jusqu'à ce que Lucene 4.0, voir cette.