【问题标题】:Term Vector Frequency in Lucene 4.0Lucene 4.0 中的词向量频率
【发布时间】:2012-08-23 18:41:29
【问题描述】:

我正在从 Lucene 3.6 升级到 Lucene 4.0-beta。在 Lucene 3.x 中,IndexReader 包含一个方法 IndexReader.getTermFreqVectors(),我可以使用它来提取给定文档和字段中每个术语的频率。

这个方法现在被IndexReader.getTermVectors() 取代,它返回Terms。如何利用这种(或可能的其他方法)提取文档和字段中的词频?

【问题讨论】:

标签: lucene


【解决方案1】:

也许这会对你有所帮助:

// get terms vectors for one document and one field
Terms terms = reader.getTermVector(docID, "fieldName"); 

if (terms != null && terms.size() > 0) {
    // access the terms for this field
    TermsEnum termsEnum = terms.iterator(null); 
    BytesRef term = null;

    // explore the terms for this field
    while ((term = termsEnum.next()) != null) {
        // enumerate through documents, in this case only one
        DocsEnum docsEnum = termsEnum.docs(null, null); 
        int docIdEnum;
        while ((docIdEnum = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
            // get the term frequency in the document 
            System.out.println(term.utf8ToString()+ " " + docIdEnum + " " + docsEnum.freq()); 
        }
    }
}

【讨论】:

  • 它至少对我有帮助!谢谢你的这些行
【解决方案2】:

具体看这个related question

Terms vector = reader.getTermVector(docId, CONTENT);
TermsEnum termsEnum = null;
termsEnum = vector.iterator(termsEnum);
Map<String, Integer> frequencies = new HashMap<>();
BytesRef text = null;
while ((text = termsEnum.next()) != null) {
    String term = text.utf8ToString();
    int freq = (int) termsEnum.totalTermFreq();
    frequencies.put(term, freq);
    terms.add(term);
}

【讨论】:

  • 最后一步,变量terms是什么?
  • terms 是使用以下定义的 Set 实例: private final Set terms = new HashSet();
【解决方案3】:

有各种关于如何使用灵活索引 api 的文档:

访问文档术语向量的字段/术语与访问帖子列表所使用的 API 完全相同,因为术语向量实际上只是该文档的微型倒排索引。

因此,按原样使用所有这些示例是完全可以的,尽管您可以制作一些快捷方式,因为您知道这个“微型倒排索引”中只有一个文档。例如如果您只是想获得一个词的频率,您可以只寻找它并使用诸如 totalTermFreq 之类的汇总统计信息(请参阅https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core/org/apache/lucene/index/package-summary.html#stats),而不是实际打开一个只会枚举单个文档的 DocsEnum。

【讨论】:

    【解决方案4】:

    我的 Lucene 4.2 索引上有这个功能。这是一个适合我的小型测试程序。

    try {
        directory[0] = new SimpleFSDirectory(new File(test1));
        directory[1] = new SimpleFSDirectory(new File(test2));
        directory[2] = new SimpleFSDirectory(new File(test3));
        directoryReader[0] = DirectoryReader.open(directory[0]);
        directoryReader[1] = DirectoryReader.open(directory[1]);
        directoryReader[2] = DirectoryReader.open(directory[2]);
    
        if (!directoryReader[2].isCurrent()) {
            directoryReader[2] = DirectoryReader.openIfChanged(directoryReader[2]);
        }
        MultiReader mr = new MultiReader(directoryReader);
    
        TermStats[] stats=null;
        try {
            stats = HighFreqTerms.getHighFreqTerms(mr, 100, "My Term");
        } catch (Exception e1) {
            e1.printStackTrace();
            return;
        }
    
        for (TermStats termstat : stats) {
            System.out.println("IBI_body: " + termstat.termtext.utf8ToString() +
                ", docFrequency: " + termstat.docFreq);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2011-04-04
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      相关资源
      最近更新 更多