除了Levenshtein距离之外,我不熟悉字符串相似度算法,因为这就是我正在使用的内容,结果证明它不太理想。
所以我对我想要实现的递归算法有所了解,但我想知道它是否已经存在,所以我可以利用其他人的专业知识。
这是算法的例子:
字符串1:“保罗约翰逊”
字符串2:“John Paulson”
第1步:找到所有最长的匹配
第1场比赛:“保罗”
比赛2:“约翰”
比赛3:“儿子”
比赛4:“”
步骤2:使用以下公式计算每个匹配的分数:((match.len / string.len)* match.len)这允许基于字符串的长度以平衡速率对更长的字符串进行更多加权。
比赛1:(4/12)* 4 = 1.333 ......
比赛2:1.333 ......
比赛3:.75
比赛4:.083
步骤3:在更大的比例上进行步骤1和2(比赛的匹配。)这个我没有完全弄清楚。但我的想法是,如果“儿子”出现在“保罗约翰”之后,它出现在“约翰保罗”之后,那应该算上一些东西。
步骤4:对已计算的所有分数求和。
得分:1.333 + 1.333 + .75 + .083333 = 3.4999 ......(加上第3步产生的分数)
这对任何人来说都很熟悉吗?我希望其他人在实际制定算法时遇到麻烦,所以我不必自己搞清楚。
答案 0 :(得分:3)
您所描述的内容有点类似于以下论文所称的最长公共子串(LCS)。有关其他算法的简要说明和比较: A Comparison of Personal Name Matching
该算法[11]重复发现并删除最长的共同点 两个字符串中的子串比较,最大长度 (通常设置为2或3)。
...
可以通过计算相似性度量 将公共子串的总长度除以最小值, 两个原始字符串的最大或平均长度(类似于 史密斯 - 沃特曼)。...
这个算法是 适用于有单词的复合名称(如给定和姓氏) 交换。