У меня есть огромный (но конечный) набор строк на естественном языке.
Мне нужен способ преобразовать каждую строку в числовое значение. Для любой данной строки значение должно быть каждый раз одинаковым.
Чем более "разные" две данные строки, тем больше должны быть разных двух соответствующих значений. Чем больше они «похожи», тем меньше должно быть разных значений.
Я пока не знаю, какое точное определение разницы между строками мне нужно. В любом случае никакого анализа естественного языка. Вероятно, это должно быть что-то вроде Левенштейна (но Левенштейн относителен, и мне нужна абсолютная метрика). Начнем с чего-нибудь простого.
Обновить размеры
Я буду счастлив довольствоваться многомерным (лучше всего трехмерным) вектором вместо одного числового значения.
Обновление о правильности ожидаемого результата
Как правильно было отмечено, здесь и здесь расстояние от одной строки до другой представляет собой вектор с MAX(firstStringLength, secondStringLength)
размерами. Как правило, невозможно уменьшить количество измерений без потери информации.
Однако мне не нужно абсолютное решение. Я бы согласился на любое «достаточно хорошее» преобразование из пространства N-мерных строк в мое трехмерное пространство.
Также обратите внимание, что у меня есть конечное количество строк конечной длины. (Количество строк довольно велико, около 80 миллионов (10 ГБ), поэтому мне лучше выбрать какой-нибудь однопроходный алгоритм без состояния.)
При сканировании ссылок у меня сложилось впечатление, что здесь мне может помочь кривая заполнения гильбертова пространства. Похоже на В статье Анализ кластеризационных свойств кривой заполнения гильбертова пространства обсуждается нечто близкое к моей проблеме ...
Обновленная информация о подходе с использованием кривой Гильберта
- Мы сопоставляем каждую строку с точкой в N-мерном пространстве, где N - максимальная длина строки в наборе. Кстати, можно ли использовать код i-го символа из строки в качестве значения i-й координаты здесь?
- Мы проводим кривую Гильберта через это N-мерное пространство.
- Для каждой струны берем точку на кривой, ближайшую к координатам струны. Значение Гильберта этой точки (длина от начала кривой) - это одномерное значение, которое я ищу.
- Если нам нужно 3D-значение, мы строим кривую Гильберта в 3D и выбираем точки, соответствующие значениям Гильберта, вычисленным выше.
Выглядит правильно? Какие здесь будут вычислительные затраты?