【发布时间】:2016-09-20 23:33:03
【问题描述】:
我不熟悉字符串相似性算法,除了 Levenshtein 距离,因为这是我正在使用的算法,但结果并不理想。
所以我有点想实现一个递归算法的想法,但我想知道它是否已经存在,以便我可以利用其他人的专业知识。
以下是算法示例:
字符串 1:“保罗·约翰逊”
字符串 2:“约翰·保尔森”
第 1 步:找到所有最长的匹配项
第 1 场比赛:“保罗”
比赛 2:“约翰”
第 3 场比赛:“儿子”
第 4 场比赛:“”
第 2 步:使用以下公式计算每个匹配项的分数:((match.len/string.len)*match.len) 这允许更长的字符串以基于字符串长度的平衡比率进行更多加权。
第 1 场比赛:(4/12)*4 = 1.333...
第 2 场比赛:1.333...
第 3 场比赛:0.75
第 4 场比赛:.083
第 3 步:在更大的范围内执行第 1 步和第 2 步,(匹配的匹配项。)我还没有完全弄清楚。但我的想法是,如果“儿子”出现在“保罗·约翰”之后,并且出现在“约翰·保罗”之后,那么这应该很重要。
第 4 步:将所有已计算的分数相加。
分数:1.333 + 1.333 + .75 + .083333 = 3.4999...(加上第 3 步产生的任何分数)
这对任何人来说都很熟悉吗?我希望其他人已经麻烦按照这些思路实际制作算法,这样我就不必自己弄清楚了。
【问题讨论】:
-
你能描述一下为什么 Levenshtein 距离不理想吗?
-
你是只匹配人名,还是匹配更通用的字符串?
-
@Chris,在某些情况下,局部相似性可能比全局差异性更可取。两个序列中的这种比对称为局部序列比对,在这种比对中,您更感兴趣的是找到具有最大相似性的两个字符串的子字符串。
-
@Chris 我正在比较可变长度的句子。例如:这两个句子中哪一个与第一个“更接近”: 1. 我爱。 2. 我爱每一个人。 3、你好。 #3 的得分比 #2 更接近 #1,因为它的长度相似,所以编辑距离很短。即使长度相同,编辑距离也会忽略“彼此相邻”的字母数量,尽管它在某种程度上量化了它们是否按正确的顺序排列。无论如何,即使 #2 和 #1 具有匹配的字符串 #3 具有较低的编辑距离。
标签: string algorithm string-comparison similarity sentence-similarity