【问题标题】:Extract tf-idf vectors with lucene用 lucene 提取 tf-idf 向量
【发布时间】:2012-02-29 15:27:01
【问题描述】:

我已经使用 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));
        }
    }

有什么方法可以找到每个词条的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));
        }
    }

【问题讨论】:

    标签: java lucene classification


    【解决方案1】:

    您可能找不到 tf-idf 向量。但正如您已经完成的那样,您可以手动计算 IDF。最好使用DefaultSimilarity(或您正在使用的任何相似性实现)为您计算它。

    关于 Term ID,我认为目前你不能。 At least not until Lucene 4.0,见this

    【讨论】:

    • 但是所有的术语都被排序并且在索引中有一个唯一的编号(它们的顺序)!我如何才能获得每个学期的那个号码?
    • 如果您的索引是静态的(在初始批次索引之后您没有添加更多文档),您可以使用此排序顺序作为术语 ID。第一项,ID:0,第二项,ID:1,依此类推...如果对 Term ID 的需求在 lucene 外部,您也可以在其外部创建此 ID。迭代条款并将它们与 Lucene 分开存储,并使用相应的(由您)分配的 ID。
    • 是的,但问题是,这种方法的速度真的很慢,并且让我遇到了超过 10^6 个文档的严重问题。你有什么想法吗?
    • 每个文档都需要超过一秒的时间。实际上不实用(超过 100 万份文档)。
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2021-02-10
    • 2018-05-27
    • 2016-07-22
    • 2013-03-01
    • 2020-01-23
    • 2017-03-07
    • 2013-08-16
    相关资源
    最近更新 更多