【问题标题】:Using multiple Leaves in Lucene Classifiers在 Lucene 分类器中使用多个叶子
【发布时间】:2017-08-24 07:35:54
【问题描述】:

我正在尝试在 lucene 中使用 KNearestNeighbour 分类器。文档分类器在其构造函数中接受一个leafReader,用于训练分类器。 问题是,我用来训练分类器的索引有多个叶子。但是该类的构造函数只接受一个叶子,我找不到将剩余的 LeafReaders 添加到类的过程。我可能会错过一些东西。谁能帮我解决这个问题?

这是我目前使用的代码:

    FSDirectory index = FSDirectory.open(Paths.get(indexLoc));
    IndexReader reader = DirectoryReader.open(index);
    LeafReaderContext leaf = leaves.get(0);
    LeafReader atomicReader = leaf.reader();
    KNearestNeighborDocumentClassifier knn = new KNearestNeighborDocumentClassifier(atomicReader, BM25, null, 10, 0, 0, "Topics", field2analyzer, "Text");

【问题讨论】:

    标签: java lucene document-classification


    【解决方案1】:

    叶子代表索引的每个部分。在性能和资源使用方面,您应该迭代叶子,为每个细分运行分类并累积您的结果。

    for (LeafReaderContext context : indexReader.getContext().leaves()) {
      LeafReader reader = context.reader();
      // run for each leaf
    }
    

    如果不可能,您可以使用SlowCompositeReaderWrapper,顾名思义,它可能会非常慢,因为它会即时聚合所有叶子。

    LeafReader singleLeaf = SlowCompositeReaderWrapper.wrap(indexReader);
    // run classifier on singleLeaf
    

    根据您的 Lucene 版本,它位于 lucene-core 或 lucene-misc(我认为从 Lucene 6.0 开始)。此外,此类已被弃用并计划在 Lucene 7.0 中删除。

    第三个选项可能是运行forceMerge(1),直到你只有一个段,你可以为此使用单叶。但是,强制合并到单个段还有其他问题,可能不适用于您的用例。如果您的数据是一次写入然后仅用于读取,则可以使用 forceMerge。如果您有定期更新,您最终将不得不使用第一个选项并自己汇总分类结果。

    【讨论】:

    • 我使用的是 lucene 6.3。第一个对我来说不是一个选项,因为我必须一次训练分类器,聚合将是不可能的。 “SlowCompositeReaderWrapper”目前似乎是一个可行的选择。谢谢。
    猜你喜欢
    • 2020-06-21
    • 2017-09-14
    • 2021-02-25
    • 2011-10-20
    • 2018-01-05
    • 2012-02-11
    • 1970-01-01
    • 2016-05-08
    • 2020-06-02
    相关资源
    最近更新 更多