В настоящее время я реализую модификацию стандарта Lucene Сходство BM25, основанное на следующем статье. Реализация фактической формулы проста, но я борюсь с вычислением необходимой статистики.
Мне нужны следующие две статистики:
- Средняя частота терминов в документе:
length of document / # unique terms of the document
(т. е. показатель повторяемости документа — для документа без повторений это будет 1, если каждый термин встречается дважды, это будет 2 и т. д. ) - Средняя частота терминов. Это среднее арифметическое приведенного выше показателя по всем документам коллекции. Это можно рассматривать как среднюю повторяемость всего корпуса.
Я обнаружил, что могу рассчитать среднюю частоту терминов для каждого документа во время индексации, переопределив метод computeNorm
моей реализации подобия. Я могу хранить значение вместе с нормальным значением с помощью битовых операций (не очень красиво, но пока это работает). Затем во время запроса я могу извлечь среднюю частоту и длину термина в документе.
Однако это не помогает найти среднюю среднюю частоту терминов. Очевидно, что это значение для всей коллекции, и поэтому его следует вычислять в Similarity.computeWeight насколько я понимаю, но не не вижу, как это можно сделать, учитывая аргументы функции.
Какое место было бы идеальным для расчета этой статистики?
Я новичок в Lucene, поэтому, возможно, есть очевидное решение, которого я еще не видел. Я благодарен за любой вклад.