Комментарии 7
Концептуально интересно. Из-за такого выбора функции расстояния у вас теперь немного связаны руки и приходится использовать vantage-point tree. Если использовать эмбеддинги в качестве промежуточного шага, то вся задача превращается в уже вдоль и поперек изъезженное поле. Например, все полученные вектора швыряются в faiss и с умопомрачительной скоростью (миллисекунды для миллионов документов) для данного вектора находятся соседи. Или вообще можно влезть в DSSM, если так хочется йоба-саенса и материала для новой статьи)
Почему выбран подход с именно такой попарной функцией расстояния на исходных объектах?
Проблема embedding в том, что при его использовании сложно контролировать расстояние между объектами. В моей задаче уже есть исходные требования, что какие-то объекты близки, а какие-то далеки. Я не встречал алгоритмов, которые строят embedding по заданной матрице расстояний. Не факт, что такое вообще возможно во всех случаях (ссылка). Безусловно, это интересный вопрос, заслуживающий отдельного исследования.
Проблема embedding в том, что при его использовании сложно контролировать расстояние между объектами.
Это очень похоже на DSSM. Подход строит такие эмбеддинги документов, у которых косинусное расстояние между указанными парами будет минимально.
В изначальной форумулировке DSSM используется для FTS и минимизирует расстояние между query и релевантными документами. Но вроде бы ваш датасет просто привести в такую форму. Берете в качестве query любой документ, а в качестве релевантных ему используете близкие к нему объекты. Получатся эмбеддинги, которые ваши исходные требования по близости будут учитывать.
Спасибо за наводку на Faiss.
1. Идентификаторам (номера,ID-шники, названия, и т.д.) ставьте всегда наивысший «вес» до начала поиска.
2. Находите и маркируйте «весами» фрагменты «цепочки» по значимости конкретики (пример): «ручка из красного дерева»:3, «ручка из дерева»:2, «деревянная ручка»:1, «ручка»:0
3. Смотрите на порядок следования объектов «цепочки»: идентичный: 0, реверсный: -1.
4. Смотрите на частоту фрагментов «цепочек»: выше — меньше «вес», ниже — больше «вес».
Как построить полнотекстовый поиск с помощью нейронных сетей