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