Комментарии 7

Концептуально интересно. Из-за такого выбора функции расстояния у вас теперь немного связаны руки и приходится использовать vantage-point tree. Если использовать эмбеддинги в качестве промежуточного шага, то вся задача превращается в уже вдоль и поперек изъезженное поле. Например, все полученные вектора швыряются в faiss и с умопомрачительной скоростью (миллисекунды для миллионов документов) для данного вектора находятся соседи. Или вообще можно влезть в DSSM, если так хочется йоба-саенса и материала для новой статьи)


Почему выбран подход с именно такой попарной функцией расстояния на исходных объектах?

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

Проблема embedding в том, что при его использовании сложно контролировать расстояние между объектами.

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


В изначальной форумулировке DSSM используется для FTS и минимизирует расстояние между query и релевантными документами. Но вроде бы ваш датасет просто привести в такую форму. Берете в качестве query любой документ, а в качестве релевантных ему используете близкие к нему объекты. Получатся эмбеддинги, которые ваши исходные требования по близости будут учитывать.

почему не начать статью с того зачем это делать если есть эластиксеарч?

В самом начале статьи


Но когда мы попытались организовать поиск и сопоставление очень коротких документов (наименований товаров), то столкнулись с рядом проблем.
У Вас верное направление. Но могу подсказать, как сделать по «весам» более точно:
1. Идентификаторам (номера,ID-шники, названия, и т.д.) ставьте всегда наивысший «вес» до начала поиска.
2. Находите и маркируйте «весами» фрагменты «цепочки» по значимости конкретики (пример): «ручка из красного дерева»:3, «ручка из дерева»:2, «деревянная ручка»:1, «ручка»:0
3. Смотрите на порядок следования объектов «цепочки»: идентичный: 0, реверсный: -1.
4. Смотрите на частоту фрагментов «цепочек»: выше — меньше «вес», ниже — больше «вес».
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.