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