我已经使用 lucene 索引了一组文档。我还为每个文档内容存储了 DocumentTermVector。我写了一个程序,得到了每个文档的词频 vector ,但是我怎样才能得到每个文档的 tf-idf vector 呢?
这是我在每个文档中输出词频的代码:
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 中是否有任何内置函数可供我执行此操作?
没有人帮忙,我自己做了:
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));
}
}
有什么办法可以找到每个词的ID号吗?
没人帮忙,我又自己做了:
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));
}
}
最佳答案
您可能找不到 tf-idf vector 。但是正如您已经完成的那样,您可以手动计算 IDF。使用 DefaultSimilarity 可能更好(或您正在使用的任何相似度实现)为您计算它。
关于 Term ID,我认为目前还不能。 At least not until Lucene 4.0 , 请参阅 this .
关于java - 使用 lucene 提取 tf-idf vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9189179/