У меня был некоторый успех при сравнении строк с использованием функции PHP levenshtein .
Однако для двух строк, которые содержат подстроки, которые поменялись местами, алгоритм считает их как целые новые подстроки.
Например:
levenshtein("The quick brown fox", "brown quick The fox"); // 10 differences
рассматриваются как имеющие общего чем:
levenshtein("The quick brown fox", "The quiet swine flu"); // 9 differences
Я бы предпочел алгоритм, который видел, что первые два были более похожи.
Как я могу придумать функцию сравнения, которая может идентифицировать подстроки, у которых положение переключателя отличается от правок?
Один из возможных подходов, о которых я подумал, - это поместить все слова в строке в алфавитном порядке перед сравнением. Это полностью исключает первоначальный порядок слов из сравнения. Однако недостатком этого является то, что изменение только первой буквы слова может привести к гораздо большему нарушению, чем изменение одной буквы.
То, чего я пытаюсь добиться, - это сравнить два факта о людях, которые являются строками свободного текста, и решить, насколько вероятно, что эти факты указывают на тот же факт. Фактами могут быть школа, которую кто-то посещал, например, имя их работодателя или издателя. В двух записях одна и та же школа может быть написана по-разному, слова в другом порядке, дополнительные слова и т. Д., Поэтому совпадение должно быть несколько нечетким, если мы хотим сделать предположение, что они относятся к одной и той же школе. До сих пор это работает очень хорошо для орфографических ошибок (я использую фенетический алгоритм, похожий на метафон поверх всего этого), но очень плохо, если вы переключаете порядок слов, которые обычно встречаются в школе: «ххх колледж» против "колледж ххх".