Jakie są algorytmy porównywania, jak podobne są dwa łańcuchy?

Muszę porównać ciągi, aby zdecydować, czy reprezentują to samo. Dotyczy to tytułów spraw wprowadzonych przez ludzi, w których skróty i inne drobne szczegóły mogą się różnić. Na przykład rozważ następujące dwa tytuły:

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

W przeciwieństwie do:

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

Człowiek może szybko ocenić, czy są one najprawdopodobniej takie same. Aktualnym podejściem, jakie podjąłem, jest znormalizowanie ciągów poprzez zmniejszenie wszystkich liter i usunięcie wszystkich znaków interpunkcyjnych i spacji, co daje:

std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";

I:

std::string secondNormalized = "harpervthelawofficesofhueylueyllp";

Porównując w tym przypadku, jedna z nich jest podsekwencją drugiej, ale można sobie wyobrazić inne bardziej złożone wariacje, w których niekoniecznie ma to miejsce, a jednak mają znaczące podsekwencje wspólne. Niekiedy mogą występować błędy w dostępie ludzi, takie jak transponowane litery i błędy ortograficzne.

Być może może pomóc jakiś program do porównywania znaków? Widziałem dobre programy do porównywania linii do porównywania różnic w kodzie do zaewidencjonowania, czy jest coś takiego na podstawie postaci, może w zwiększeniu? Jeśli mógłbyś policzyć liczbę kolejnych znaków wspólnych i wziąć pod uwagę stosunek do postaci niedzielonych, być może byłaby to dobra heurystyka?

W końcu potrzebuję decyzji boolowskiej, czy uważać je za takie same czy nie. To nie musi być idealne, ale w idealnym przypadku rzadko bywa źle.

Jakiego algorytmu mogę użyć, który da mi pewną kwantyfikację, jak podobne są do siebie dwa ciągi, które mogę następnie przekształcić w odpowiedź tak / nie za pomocą heurystyki?

questionAnswers(3)

yourAnswerToTheQuestion