java - 使用 lucene 提取 tf-idf vector

标签 java lucene classification

我已经使用 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/

相关文章:

java - Parcelable 与 Serialized - 对于没有任何字段的类

java - 多个异步下载

java - Lucene 奇怪的行为

machine-learning - Weka 中的训练和测试集不兼容

matlab - 具有交叉验证的 SVM 分类

java - Vaadin MVP 按钮点击不起作用

java - 通过类加载器方法创建基于对象类获取的矩阵

php - 如何使用ElasticSearch索引搜索单词的一部分

lucene - Lucene 3.5中分组和构面之间有什么区别

python - 如何将时间序列数据转换为图像?