gpt4 book ai didi

lucene - 获取检索到的文档的一部分的 Lucene 分数

转载 作者:行者123 更新时间:2023-12-02 01:54:22 29 4
gpt4 key购买 nike

我有很多 wiki 页面,我想训练一个分类器,看看是否可以通过一些特征(包括段落的位置和段落的 lucene 分数)来确定重点搜索的位置。我尝试将每个段落视为一个文档,这使我能够获得每个段落的 lucene 分数。然而,这存在从太少的页数中检索所有段落的风险。那是不是一种使用页面作为文档进行存储,然后获取lucene分数的方法不是针对页面而是针对页面的一部分?非常感谢。

澄清:

我首先执行以下操作: 文档:维基页面 Doc.field: wiki 页面 id Doc.field:维基页面标题 Doc.field:wiki页面文本

我想测试我的直觉,即大多数命中来自分类器的第一段,该分类器使用 lucene 分数和位置作为每个段落的特征。

现在我尝试以下操作: 文档:维基百科 Doc.field:取自 wiki 页面文本的段落 Doc.field:wiki页面id+“-”+段落计数器(标题= 0)

将段落视为文档,我可以获得每个段落的 lucene 分数,但我丢失了第一种方法检索到的大部分页面,因为现在 10 次点击意味着 10 个段落,大部分来自第一种方法检索的前 1 或 2 页。

有没有办法获取第一种方法检索到的页面每个段落的lucene分数?非常感谢。

最佳答案

您可以使用将段落视为单个文档的方法。为了避免从太少的页面中检索所有段落的风险,您可以使用 DiversifiedTopDocsCollector 。请参阅下面的示例

public static void main(String[] args) throws IOException {
IndexWriterConfig indexWriterConfig =
new IndexWriterConfig(new StandardAnalyzer());
Directory directory = new RAMDirectory();
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);

addDoc(indexWriter, "test1", 1L);
addDoc(indexWriter, "test1 test2", 1L);
addDoc(indexWriter, "test1 test2 test3", 2L);
addDoc(indexWriter, "test1 test3", 2L);
addDoc(indexWriter, "test1 test3", 2L);
indexWriter.commit();

search(indexWriter, 1);

System.out.println("\n");
search(indexWriter, 2);
}

private static void search(IndexWriter indexWriter,
final int maxHitsPerKey) throws IOException {
final IndexReader indexReader = DirectoryReader.open(indexWriter, false);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
DiversifiedTopDocsCollector collector =
new DiversifiedTopDocsCollector(10, maxHitsPerKey) {
@Override
protected NumericDocValues getKeys(LeafReaderContext leafReaderContext) {
try {
return leafReaderContext.reader().getNumericDocValues("pageId");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
};

indexSearcher.search(new TermQuery(new Term("paragraph", "test1")),
collector);
TopDocs topDocs = collector.topDocs();
for (ScoreDoc sd : topDocs.scoreDocs) {
Document document = indexReader.document(sd.doc);
System.out.println(sd.doc + " " +
sd.score + " " +
document.getField("pageId").stringValue());
}
}

private static void addDoc(IndexWriter indexWriter,
String value,
Long id) throws IOException {
Document doc = new Document();
doc.add(new TextField("paragraph", value, Field.Store.YES));
doc.add(new LongField("pageId", id, Field.Store.YES));
doc.add(new NumericDocValuesField("pageId", id));
indexWriter.addDocument(doc);
}

程序将输出以下内容

0 0.81767845 1
3 0.51104903 2


0 0.81767845 1
1 0.51104903 1
3 0.51104903 2
4 0.51104903 2

关于lucene - 获取检索到的文档的一部分的 Lucene 分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389434/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com