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.
Я уже читал некоторые подходы, которые вычисляют косинусное сходство, но все они делают это, сравнивая термин вектор для каждого документа. Например, в этом блоге упоминается следующее:
Если вам действительно нужно косинусное сходство между документами, вы должны включить векторы терминов для исходных полей и использовать их для вычисления угла. Проблема в том, что это плохо масштабируется, вам нужно вычислять углы практически со всеми другими документами.
и эти ответы так, кажется, говорят то же самое:
- перебрать все идентификаторы документов, от 0 до maxDoc();
Разве нет способа рассчитать только косинусное сходство для документов, которые соответствуют запросу, и разрешить это возвращение в качестве оценки для документа?
В качестве примечания я прочитал, что сходство TFIDFS близко, я считаю, что часть VSM - это именно то, что мне нужно, однако эта часть, похоже, исчезла в функции практической оценки Lucene. Я не уверен, как я могу "преобразовать" этот класс Сходства, чтобы в результате получилось только чисто косинусное сходство.
Итак, резюме моего вопроса:
Правильно ли мое восприятие того, как обратные индексы экономят время?
Можно ли рассчитать косинусное сходство только для документов, которые на самом деле соответствуют одному из токенов, а не для всех документов?
- Могу ли я использовать / преобразовать
TFIDFSimilarity
класс, чтобы в конечном итоге с чистым косинусом сходство?
1 ответ
Это в значительной степени зависит от того, как вы сформулируете свой запрос. Если вы сформулируете BooleanQuery, вы можете указать, какие условия запроса должны быть в возвращаемом документе. Это делается с помощью BoolenClause.Occur.MUST.
Вы можете написать свое собственное сходство, расширив TFIDFS Similarity, но, как вы могли заметить, практическая оценка Lucene основана на сходстве косинусов. В этой формуле queryNorm (q) и norm (t, d) образуют знаменатель косинусного сходства, а суммирование является точечным произведением вектора запроса и вектора документа.
подсказка: вы можете сформировать пример запроса и использовать объяснение (), чтобы увидеть детали оценки.