您如何从 Lucene 中的 FeatureField 中读取各个特征的值?
How do you read the values of individual features from a FeatureField in Lucene?
我正在使用 Lucene 7.6.0 并且我已经用一个名为 "features" 的 FeatureField
索引了一系列文档,它存储了独立于查询的证据(例如,"indegree" , "pagerank").如果我没记错的话,理论是这些存储为术语向量,其中 "indegree" 和 "pagerank" 存储为术语,它们的值存储为相应的术语频率。
我测试了一些查询,其中我结合了 BM25 和每个单独的功能,并且一些 return 与单独的 BM25 相比有不同的排名,但其他一些似乎没有效果。这可能只是一个巧合,这很好,但我想检查这些值是否被正确索引。我该怎么做?
我试过使用 Luke 检查索引,但没有与 "features" 字段关联的术语向量。 "features" 的活动标志只有 "Idf",但老实说,我找不到访问每个文档频率的方法。为了检查该字段是否有任何价值,我能做的最好的事情是:
IndexReader reader = DirectoryReader.open(
FSDirectory.open(Paths.get("/tmp/lucene-index")));
reader.totalTermFreq(new Term("features", "indegree"));
这打印了数字 33344,它与我索引的值(入度为 10 的单个文档)不匹配,但我怀疑这可能以某种方式被编纂。
我知道这 API 仍处于实验阶段,但我想知道是否有人知道是否可以检索每个文档的特征值或以某种方式全局检索(可能是匿名向量,没有link到对应文件)。
我能够验证每个特征的排名是否与我拥有的数据的顺序相匹配。我也相信我能够完全反转提供的相关性分数以获得原始特征值(我说 "fairly",因为我发现似乎有轻微的舍入误差;如果是错误请告诉我)。我使用的代码如下:
IndexReader reader = DirectoryReader.open(
FSDirectory.open(Paths.get("/tmp/lucene-index")));
IndexSearcher searcher = new IndexSearcher(reader);
searcher.setSimilarity(new BM25Similarity(1.2f, 0.75f));
float w = 1.8f;
float k = 1f;
float a = 0.6f;
Query query = FeatureField.newSigmoidQuery("features", "indegree", w, k, a);
TopDocs hits = searcher.search(query, 5);
for (int i = 0; i < hits.scoreDocs.length; i++) {
Document doc = searcher.doc(hits.scoreDocs[i].doc);
float featureValue = (float) Math.pow(
(hits.scoreDocs[i].score / w * Math.pow(k, a))
/ (1 - hits.scoreDocs[i].score / w),
1 / a
);
System.out.println(featureValue + "\t" + doc.get("doc_id"));
}
reader.close();
featureValue
的等式只是静态特征 S
(本例中的 "indegree")的 S 形缩放,根据相关性求解 S
分数。您可以在 Lucene 的 JavaDoc 中为 FeatureField
引用的论文中找到原始方程式:https://dl.acm.org/citation.cfm?doid=1076034.1076106
如果您发现此解决方案有任何错误,或者是否有更简单的方法来检查索引,请告诉我。
我正在使用 Lucene 7.6.0 并且我已经用一个名为 "features" 的 FeatureField
索引了一系列文档,它存储了独立于查询的证据(例如,"indegree" , "pagerank").如果我没记错的话,理论是这些存储为术语向量,其中 "indegree" 和 "pagerank" 存储为术语,它们的值存储为相应的术语频率。
我测试了一些查询,其中我结合了 BM25 和每个单独的功能,并且一些 return 与单独的 BM25 相比有不同的排名,但其他一些似乎没有效果。这可能只是一个巧合,这很好,但我想检查这些值是否被正确索引。我该怎么做?
我试过使用 Luke 检查索引,但没有与 "features" 字段关联的术语向量。 "features" 的活动标志只有 "Idf",但老实说,我找不到访问每个文档频率的方法。为了检查该字段是否有任何价值,我能做的最好的事情是:
IndexReader reader = DirectoryReader.open(
FSDirectory.open(Paths.get("/tmp/lucene-index")));
reader.totalTermFreq(new Term("features", "indegree"));
这打印了数字 33344,它与我索引的值(入度为 10 的单个文档)不匹配,但我怀疑这可能以某种方式被编纂。
我知道这 API 仍处于实验阶段,但我想知道是否有人知道是否可以检索每个文档的特征值或以某种方式全局检索(可能是匿名向量,没有link到对应文件)。
我能够验证每个特征的排名是否与我拥有的数据的顺序相匹配。我也相信我能够完全反转提供的相关性分数以获得原始特征值(我说 "fairly",因为我发现似乎有轻微的舍入误差;如果是错误请告诉我)。我使用的代码如下:
IndexReader reader = DirectoryReader.open(
FSDirectory.open(Paths.get("/tmp/lucene-index")));
IndexSearcher searcher = new IndexSearcher(reader);
searcher.setSimilarity(new BM25Similarity(1.2f, 0.75f));
float w = 1.8f;
float k = 1f;
float a = 0.6f;
Query query = FeatureField.newSigmoidQuery("features", "indegree", w, k, a);
TopDocs hits = searcher.search(query, 5);
for (int i = 0; i < hits.scoreDocs.length; i++) {
Document doc = searcher.doc(hits.scoreDocs[i].doc);
float featureValue = (float) Math.pow(
(hits.scoreDocs[i].score / w * Math.pow(k, a))
/ (1 - hits.scoreDocs[i].score / w),
1 / a
);
System.out.println(featureValue + "\t" + doc.get("doc_id"));
}
reader.close();
featureValue
的等式只是静态特征 S
(本例中的 "indegree")的 S 形缩放,根据相关性求解 S
分数。您可以在 Lucene 的 JavaDoc 中为 FeatureField
引用的论文中找到原始方程式:https://dl.acm.org/citation.cfm?doid=1076034.1076106
如果您发现此解决方案有任何错误,或者是否有更简单的方法来检查索引,请告诉我。