"anderstornvig" упомянул расстояние Левенштейна / редактирования, что является отличной идеей, но не совсем уместно, потому что некоторые перестановки более значимы, чем другие перестановки. Кажется, проблема в том, что мы используем много знаний, специфичных для предметной области, когда определяем, какие различия являются «существенными», а какие «незначительными». Например, мы знаем, что дефис в «Принце-полукровке» очень важен, но число в «Firefox 3» очень важно.
По этой причине вы можете подумать о настройке простой метрики, такой как Левенштейн. Добавьте параметры, позволяющие настроить, какие различия важны, а какие не важны.
В частности, Левенштейн подсчитывает количество «правок» (то есть вставок, удалений и подстановок), необходимых для превращения одной строки в другую. По сути, он взвешивает каждый редактор одинаково. Вы можете написать реализацию, которая по-разному взвешивает некоторые изменения. Например, изменение «-» на «» должно иметь очень низкий вес (что указывает на неважность). Изменение «3» на «2», когда число одно, должно иметь очень большой вес (что указывает на высокую важность).
Параметрируя расчет, вы создаете путь для постоянного улучшения вашего алгоритма. Создайте начальную конфигурацию и запустите ее на некоторых тестовых данных. Найдите места, где метрика слабая, например, где объединяются два термина, которые, по вашему мнению, должны быть разделены, и изменяйте параметризацию до тех пор, пока вы не будете удовлетворены.
Таким образом, вы можете обучить свой алгоритм, используя ваши предметные знания.