Lucene kullanarak bir dizi belge indeksledim. Ayrıca her belge içeriği için DocumentTermVector'ı da sakladım. Her program için bir program yazdım ve frekans vektörünü aldım, fakat her bir belgenin tf-idf vektörünü nasıl alabilirim?Ekstra tf-idf vektörleri lucene ile ayıkla
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]);
}
}
yaz yapmak için Lucene herhangi Buit işlevi var mı: İşte
her belgede vadeli frekansları verir benim kodudur?kimse yardım etti, ben kendim yaptım: her dönem kimlik numarasını bulmak için herhangi bir yol
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));
}
}
var mı?
kimse yardım etti, ben yine tek başıma yaptım:
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));
}
}
Ancak tüm terimler bir dizinde sıralandı ve benzersiz bir sayıya sahipler (sıraları)! Her dönem için bu numaraya nasıl erişebilirim? – orezvani
Bu bölümü çözdüm! – orezvani
Dizininiz statikse (başlangıç toplu iş dizininden sonra daha fazla belge eklemezseniz), bu sıralı siparişi kimlik kimliği olarak kullanabilirsiniz. İlk terim, ID: 0, ikinci terim, ID: 1, vb ... Terim ID'leri lümene dışsal olarak ihtiyaç duyuyorsa, bu kimlikleri de bunun dışında yaratabilirsiniz. Şartları yineleyin ve bunları (sizin tarafınızdan) ID ile ayrı ayrı Lucene'den saklayın. –