Levenshtein距离:如何更好地处理单词交换位置?
我已经使用PHP levenshtein函数比较字符串取得了一些成功。
但是,对于包含交换位置的子字符串的两个字符串,该算法会将这些字符串计为全新的子字符串。
例如:
levenshtein("The quick brown fox", "brown quick The fox"); // 10 differences
被视为具有以下共同点:
levenshtein("The quick brown fox", "The quiet swine flu"); // 9 differences
我更喜欢一种算法,它看到前两个更相似。
我怎么能想出一个比较函数来识别已经切换位置的子字符串,这些子字符串与编辑不同?
我想到的一种可能方法是在比较之前将字符串中的所有单词按字母顺序排列。这完全消除了单词的原始顺序。然而,这样做的一个缺点是,仅更改单词的第一个字母可能会造成比更改单个字母造成的更大的中断。
我试图实现的是比较关于自由文本字符串的两个关于人的事实,并决定这些事实表明相同事实的可能性有多大。事实可能是某人就读的学校,例如雇主或出版商的姓名。两个记录可能具有不同的学校拼写,单词顺序不同,额外的单词等,因此,如果我们要很好地猜测它们指的是同一所学校,则匹配必须有些模糊。到目前为止,它对拼写错误非常有效(我使用的是类似于metaphone的phoenetic算法),但是如果你切换在学校中似乎常见的单词顺序,那么效果非常差:“xxx学院”与“xxx学院”。