Почему порядок документов Lucene изменяется (оценка), когда я добавляю новые документы, которые не найдены - PullRequest
0 голосов
/ 18 июня 2020

Я сделал простой запрос к данным модульного теста, и результаты вернулись в ожидаемом порядке. Запрос:

+(ancestors:wood name:wood) +(ancestors:screw name:screw)

Данные и оценка:

  • Первый документ (оценка 0,9944593)
    • имя: Шурупы
    • предки : Винты и крепежные детали
  • Второй документ (оценка 0,7294933)
    • имя: Деревянные пробки
    • предки: Винты и крепежные детали
    • предки : Заглушки для шурупов
  • Третий документ (оценка 0,49740157)
    • имя: Шурупы по дереву
    • предки: Другие продукты

Если я сделаю тот же запрос по производственным данным (~ 3000 документов), я все равно получу «только» те же три результата. Но оценка документа меняет порядок.

  • Первый документ (оценка 3,9986732)
    • имя: Шурупы
    • предки: Другие продукты
  • Второй документ ( оценка 3.9986732)
    • имя: Шурупы
    • предки: шурупы и крепежные детали
  • Третий документ (оценка 3.7507305)
    • имя: Деревянные пробки
    • предки: винты и крепежные детали
    • предки: винтовые пробки

Второй порядок кажется неправильным. Интуитивно я ожидал, что порядок проверки сохранится, поскольку документы 2 и 3 соответствуют трем словам, а документ 1 - только двум.

Тот факт, что первые два документа имеют одинаковую оценку, также странен. Я также протестировал 5 других методов подобия, и все они дали одинаковые оценки для первых двух документов.

Я использую Lucene 8.5.2 с BM25Similarity и параметрами по умолчанию.

Почему Lucene документирует изменение "относительной оценки" модульного теста при обнаружении тех же документов? Как я могу решить эту проблему со счетом?

1 Ответ

0 голосов
/ 18 июня 2020

Это из-за алгоритма подсчета очков BM25. Эта функция подсчета очков рассчитывается следующим образом: enter image description here

Важной частью этой dormula является часть IDF. IDF - это сокращение от «обратной частоты документов». IDF рассчитывается для вашей коллекции документов. Таким образом, при изменении коллекции это значение, которое рассчитывается для каждого термина, может измениться. Это означает, что его можно увеличивать или уменьшать. Плата за обучение заключается в том, что если термин встречается в большем количестве документов, он приносит меньшую ценность для содержащего его документа. Например, термин «есть» не имеет значения. Потому что он есть почти во всех документах. Таким образом, мы не можем использовать его как определитель для идентификации соответствующего документа. Другой пример. Термин «java» имеет большую ценность, чем термин «есть». Потому что это есть во многих документах меньше, и мы знаем, что это не во всех документах. Таким образом, его можно использовать как определитель с более высоким баллом. Итак, теперь вы знаете, что если термин встречается в большем количестве документов, он снижает ценность этого документа. Самая простая форма IDF рассчитывается следующим образом:

IDF(term)= Log(N/n)

N - это номер всего документа, а n - это номер всего документа, содержащего хотя бы один термин, который является «термином» (воспринимайте термин как « java "). вы можете видеть, что чем больше термин встречается в документе (n растет), тем меньше баллов он получает.

...