Найти ближайшие разреженные векторы, какой индекс или БД использовать?
Я хотел бы обнаружить похожие текстовые документы.
Есть функция, которая принимает текст как ввод и производит вектор как вывод.
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