Cosine Сходство с Lucene только для документов, которые соответствуют

Lucene - это система обратной индексации, насколько я понимаю, ее сила заключается в том, что она будет сравнивать запрос только с документами, которые хотя бы соответствуют токену.

По сравнению с наивным подходом, когда запрос сравнивается с каждым документом (даже с теми, в которых нет ни одного токена, присутствующего в запросе), это большое преимущество.

Например, если у меня есть проиндексированные документы:

D1: "Hello world said the guy"
D2: "Hello, what a beautiful world"
D3: "random text"

На мой взгляд, при поиске запроса "Hello world" будут просматриваться только проиндексированные документы D1 и D2 и пропускается D3, что экономит время.

Это правильно?

Сейчас я пытаюсь вычислить косинусное сходство между документами. Входным запросом будет документ, а выходным - счет косинуса. Который является числом от 0 до 1.

Я уже читал некоторые подходы, которые вычисляют косинусное сходство, но все они делают это, сравнивая термин вектор для каждого документа. Например, в этом блоге упоминается следующее:

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

и эти ответы так, кажется, говорят то же самое:

  1. перебрать все идентификаторы документов, от 0 до maxDoc();

Разве нет способа рассчитать только косинусное сходство для документов, которые соответствуют запросу, и разрешить это возвращение в качестве оценки для документа?

В качестве примечания я прочитал, что сходство TFIDFS близко, я считаю, что часть VSM - это именно то, что мне нужно, однако эта часть, похоже, исчезла в функции практической оценки Lucene. Я не уверен, как я могу "преобразовать" этот класс Сходства, чтобы в результате получилось только чисто косинусное сходство.

Итак, резюме моего вопроса:

  1. Правильно ли мое восприятие того, как обратные индексы экономят время?

  2. Можно ли рассчитать косинусное сходство только для документов, которые на самом деле соответствуют одному из токенов, а не для всех документов?

  3. Могу ли я использовать / преобразовать TFIDFSimilarity класс, чтобы в конечном итоге с чистым косинусом сходство?

1 ответ

Решение
  1. Это в значительной степени зависит от того, как вы сформулируете свой запрос. Если вы сформулируете BooleanQuery, вы можете указать, какие условия запроса должны быть в возвращаемом документе. Это делается с помощью BoolenClause.Occur.MUST.

  2. Вы можете написать свое собственное сходство, расширив TFIDFS Similarity, но, как вы могли заметить, практическая оценка Lucene основана на сходстве косинусов. В этой формуле queryNorm (q) и norm (t, d) образуют знаменатель косинусного сходства, а суммирование является точечным произведением вектора запроса и вектора документа.

подсказка: вы можете сформировать пример запроса и использовать объяснение (), чтобы увидеть детали оценки.

Другие вопросы по тегам