16
我使用lucene對一組文檔建立了索引。我還爲每個文檔內容存儲了DocumentTermVector。我寫了一個程序,並獲得了每個文檔的術語頻率向量,但是我怎樣才能獲得每個文檔的tf-idf向量?使用lucene提取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 BUIT的函數爲我做到這一點?
沒有人幫助,而我做到了我自己:
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));
}
}
但是,所有的術語都被排序,並且在索引(它們的順序)中有唯一的編號!我怎樣才能訪問每個學期的數字? – orezvani 2012-02-08 14:11:47
我確實解決了這個問題! – orezvani 2012-02-08 21:35:02
如果您的索引是靜態的(在初始批次索引後不添加更多文檔),則可以使用此排序順序作爲術語ID。第一項,ID:0,第二項,ID:1,等等......如果對於術語ID的需求在lucene外部,您也可以在其外部創建此ID。迭代條款並將它們與Lucene分開存儲(由您指定)。 – 2012-02-09 14:47:49