Как вы читаете значения отдельных функций из FeatureField в Lucene? - PullRequest
0 голосов
/ 14 февраля 2019

Я использую Lucene 7.6.0, и я проиндексировал серию документов с FeatureField, названным «функциями», в которых хранятся независимые от запроса доказательства (например, «indegree», «pagerank»).Если я не ошибаюсь, теория заключается в том, что они хранятся в виде вектора терминов, где «indegree» и «pagerank» хранятся в виде терминов, а их значения хранятся в виде соответствующих частот терминов.

I 'Мы проверили некоторые запросы, в которых я комбинировал BM25 и каждую отдельную функцию, а некоторые возвращали другое ранжирование по сравнению с одним BM25, но некоторые другие, похоже, не дали результата.Это может быть просто совпадением, и это хорошо, но я бы хотел проверить, правильно ли проиндексированы значения.Как мне это сделать?

Я пытался использовать Luke для проверки индекса, но с полем «features» не связан вектор терминов.Активными флагами для «функций» являются только «Idf», но я, честно говоря, не могу найти способ получить доступ к частотам для каждого документа.Лучшее, что я смог сделать, чтобы проверить, имеет ли поле какое-либо значение, было что-то вроде:

IndexReader reader = DirectoryReader.open(
    FSDirectory.open(Paths.get("/tmp/lucene-index")));
reader.totalTermFreq(new Term("features", "indegree"));

Это напечатало число 33344, которое не соответствует индексируемому мной значению (один документс точностью до 10), однако я подозреваю, что это может быть каким-то образом кодифицировано.

Я знаю, что этот API все еще является экспериментальным, но мне было интересно, если кто-нибудь знал, будет ли возможно получить значения функций, либо для каждого документаили как-то глобально (возможно, анонимный вектор, без ссылки на соответствующие документы).

1 Ответ

0 голосов
/ 15 февраля 2019

Мне удалось проверить, что ранжирование по каждой функции соответствует порядку данных, которые у меня есть.Я также полагаю, что смог справедливо изменить предоставленную оценку релевантности, чтобы получить исходное значение функции (я говорю «честно», потому что я обнаружил, что кажется, что ошибки слегка округляются; дайте мне знать, если это ошибка).Код, который я использовал, был следующим:

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 (в данном случае «неопределенности»), решенного для S,на основе оценки релевантности.Вы можете найти исходное уравнение в статье, приведенной в JavaDoc Lucene для FeatureField: https://dl.acm.org/citation.cfm?doid=1076034.1076106

Пожалуйста, дайте мне знать, если вы обнаружите какую-либо ошибку с этим решением, или если есть более простой способ проверитьиндекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...