Мне нужно сравнить строки, чтобы решить, представляют ли они одно и то же. Это относится к названиям дел, введенных людьми, где аббревиатуры и другие мелкие детали могут отличаться. Например, рассмотрим следующие два заголовка:
std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP";
В отличие от:
std::string second = "Harper v. The Law Offices of Huey & Luey, LLP";
Человек может быстро оценить, что это, скорее всего, одно и то же. Текущий подход, который я принял, - это нормализовать строки, уменьшая все буквы и удаляя все знаки препинания и пробелы, давая:
std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";
и
std::string secondNormalized = "harpervthelawofficesofhueylueyllp";
Сравнивая в этом случае одно - подпоследовательность другого, но вы можете представить себе другие более сложные варианты, где это не обязательно происходит, но они имеют существенные подпоследовательности. Также могут возникать случайные ошибки входа человека, такие как транспонированные буквы и орфографические ошибки.
Может быть, может помочь какая-то программа сравнения символов? Я видел хорошие программы для сравнения строк для сравнения различий в коде, который нужно проверить, есть ли что-то подобное на основе символов, возможно, в boost? Если бы вы могли подсчитать количество последовательных символов и принять отношение к символам, не разделенным, возможно, это было бы хорошей эвристикой?
В конце концов, мне нужно логическое решение относительно того, считать ли их одинаковыми или нет. Он не должен быть совершенным, но в идеале он редко должен быть неправильным.
Какой алгоритм я могу использовать, это даст мне некоторую количественную оценку того, насколько сходны две строки друг другу, которые я могу затем преобразовать в ответ да/нет с помощью некоторой эвристики?