¿Cuáles son algunos algoritmos para comparar cuán similares son dos cadenas?

Necesito comparar cadenas para decidir si representan la misma cosa. Esto se relaciona con los títulos de casos ingresados ​​por humanos donde las abreviaturas y otros pequeños detalles pueden diferir. Por ejemplo, considere los siguientes dos títulos:

std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP";

Opuesto a:

std::string second = "Harper v. The Law Offices of Huey & Luey, LLP";

Un ser humano puede evaluar rápidamente que estos son probablemente lo mismo. El enfoque actual que he tomado es normalizar las cadenas bajando todas las letras y eliminando todos los signos de puntuación y espacios dando:

std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";

Y:

std::string secondNormalized = "harpervthelawofficesofhueylueyllp";

Comparando en este caso, una es una subsecuencia de la otra, pero puedes imaginar otras variaciones más complejas donde eso no necesariamente ocurre, pero tienen subsecuencias significativas en común. También puede haber errores ocasionales de entrada humana, como las letras transpuestas y los errores de ortografía.

Tal vez algún tipo de programa de diferencias de carácter podría ayudar? He visto buenos programas de diferencia de línea para comparar las diferencias en el código a ser registrado, ¿hay algo así en una base de personaje, tal vez en aumento? Si pudiera contar el número de caracteres consecutivos en común y tomar la proporción de los caracteres no compartidos, ¿tal vez sería una buena heurística?

Al final, necesito una decisión booleana sobre si considerarlos iguales o no. No tiene que ser perfecto, pero lo ideal es que raramente esté equivocado.

¿Qué algoritmo puedo usar que me dé algún tipo de cuantificación en cuanto a qué tan similares son las dos cadenas entre sí, que luego puedo convertir en una respuesta de sí / no por medio de alguna heurística?

Respuestas a la pregunta(3)

Su respuesta a la pregunta