Найти ближайшие разреженные векторы, какой индекс или БД использовать?

Я хотел бы обнаружить похожие текстовые документы.

Есть функция, которая принимает текст как ввод и производит вектор как вывод.

text => vector

Произведенный вектор редок. Его размер огромен (точно сказать не могу, но, вероятно, будет около 10_000), но почти все его элементы равны нулю. Только около 10-20 его элементов не равны нулю.

vector = [0, 0, 0..., v1, 0...., v2, 0.... ]

Поэтому имеет смысл представлять этот разреженный вектор в виде карты, а не массива.

vector = { i1: v1, i2: v2 }

Какой вид индекса я могу использовать, чтобы эффективно найти N векторов, ближайших к заданному { i1: v1, i2: v2 } вектор? Метрика расстояния может быть евклидовой, косинусной или другой.

Есть миллионы документов. Какую базу данных можно использовать для такого поиска? PostgreSQL? Redis?

1 ответ

Решение

После медитации на машинное обучение вот ответ:

Не существует готовых к использованию БД или индексов, которые могут обрабатывать большие размерные пространства Есть такие инструменты, как https://github.com/spotify/annoy но они могут работать только с размерами < 1000

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

Лучшим способом было бы уменьшить размерность с помощью PCA до < 1000, и тогда можно будет использовать такие инструменты, как https://github.com/spotify/annoy

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