我已经使用 lucene 索引了一组文档。我还为每个文档内容存储了 DocumentTermVector。我编写了一个程序并获取每个文档的词频向量,但是如何获取每个文档的 tf-idf 向量?
这是我的代码,用于输出每个文档中的术语频率:
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));
}
}
有什么办法可以找到每个term的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 向量。但正如您已经完成的那样,您可以手动计算 IDF。最好使用默认相似度 http://javasourcecode.org/html/open-source/lucene/lucene-3.3.0/org/apache/lucene/search/DefaultSimilarity.html#idf%28int,%20int%29(或您正在使用的任何相似度实现)来为您计算它。
关于Term ID,我认为目前还不能。至少在 Lucene 4.0 之前不会 http://lucene.472066.n3.nabble.com/Numerical-ids-for-terms-td2810724.html, see this http://lucene.apache.org/core/4_1_0/core/org/apache/lucene/index/TermsEnum.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)