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?