2

我不熟悉字符串相似性算法,除了 Levenshtein 距离,因为这就是我正在使用的算法,但结果并不理想。

所以我有点想实现一个递归算法的想法,但我想知道它是否已经存在,这样我就可以利用其他人的专业知识。

以下是算法示例:

字符串 1:“保罗·约翰逊”

字符串 2:“约翰·保尔森”

第 1 步:找到所有最长的匹配项

第一场比赛:“保罗”

第 2 场比赛:“约翰”

第 3 场比赛:“儿子”

第 4 场比赛:“”

第 2 步:使用以下公式计算每个匹配项的分数:((match.len/string.len)*match.len) 这允许更长的字符串以基于字符串长度的平衡比率进行更多加权。

比赛 1:(4/12)*4 = 1.333...

第 2 场比赛:1.333...

第 3 场比赛:0.75

第 4 场比赛:0.083

第 3 步:在更大的范围内执行第 1 步和第 2 步,(匹配的匹配项。)这我还没有完全弄清楚。但我的想法是,如果“儿子”出现在“保罗·约翰”之后,并且出现在“约翰·保罗”之后,那么这应该很重要。

第四步:将所有计算出来的分数相加。

分数:1.333 + 1.333 + .75 + .083333 = 3.4999...(加上第 3 步产生的任何分数)

这对任何人来说都很熟悉吗?我希望其他人已经麻烦按照这些思路实际制作算法,这样我就不必自己弄清楚了。

4

1 回答 1

3

您所描述的内容有点类似于以下论文所称的最长公共子串 (LCS)。有关其他算法的简要描述和比较: 个人姓名匹配的比较

该算法 [11] 反复查找并删除比较的两个字符串中最长的公共子字符串,直到最小长度(通常设置为 2 或 3)。

...
可以通过将公共子字符串的总长度除以两个原始字符串的最小、最大或平均长度来计算相似性度量(类似于 Smith-Waterman)。

...

此算法适用于交换了单词(如给定和姓氏)的复合名称。

于 2016-05-23T23:30:59.840 回答