В неограниченной задаче нет решения, которое может преобразовать любую возможную последовательность слов или любую возможную последовательность символов в одно число, которое описывает местность.
Представьте себе сходство на уровне символов
stops
spots
hello world
world hello
В обоих примерах сообщения различны, но символы в сообщении идентичны, поэтому мера должна содержать значение позиции, а также символьное значение.(char 0 == 'h', char 1 == 'e' ...)
Затем сравните следующие похожие сообщения
hello world
ello world
Хотя две строки похожи, они могутотличаются в начале или в конце, что затрудняет масштабирование по позиции.
В случае
spots
stops
Слова отличаются только положением символов, поэтому некоторая формапозиция важна.
Если следующие строки похожи
yesssssssssssssss
yessssssssssssss
Тогда у вас есть парадоксальная форма.Если вы добавите 2 s
символов ко второй строке, она должна разделить расстояние, которое было до первой строки, но она должна быть отличной.Это можно повторить, получая постепенно более длинные строки, все из которых должны быть расположены ближе к строкам, только короче и длиннее их.Я не понимаю, как этого добиться.
В общем случае это рассматривается как многомерная проблема - разбить строку на вектор
[ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' ]
Но значения вектора могутне должно быть
- , представленное числом с фиксированным размером, или
- , обеспечивающее хорошую разницу в качестве.
Если количество слов или длина строкиограничены, тогда может быть возможным решение кодирования.
ограниченные значения
Используя что-то вроде арифметического сжатия, затем последовательность слов может быть преобразована в число с плавающей запятой, которое представляет последовательность.Однако это будет относиться к элементам ранее в последовательности как к более значимым, чем последний элемент в последовательности.
решение для интеллектуального анализа данных
Если вы признаете, что проблема имеет большой размер, вы можете сохранитьстроки в метрическом дереве википедия: метрическое дерево .Это ограничит ваше пространство поиска, пока не будет решено ваше решение с «одним числом».
У меня есть код для такого на github: кластеризация
Элементы, которые находятся близко друг к другу,должны храниться вместе в части дерева, но на самом деле нет никакой гарантии.Радиус поддеревьев используется для сокращения пространства поиска.
Редактировать расстояние или расстояние Левенштейна
Используется в расширении sqlite для выполнения поиска по подобию, но без решения с одним числом работает.сколько правок изменяет одну строку в другую.В результате получается результат, который показывает сходство.