这已经是字符串相似度算法了吗?
Posted
技术标签:
【中文标题】这已经是字符串相似度算法了吗?【英文标题】:Is this already a string similarity algorithm? 【发布时间】: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 具有较低的编辑距离。 【参考方案1】:您所描述的内容有点类似于以下论文所称的最长公共子串 (LCS)。简要描述和与其他算法的比较: A Comparison of Personal Name Matching
该算法 [11] 反复寻找并删除最长的公共 比较的两个字符串中的子字符串,最长为最小长度 (通常设置为 2 或 3)。
... 相似性度量可以通过以下方式计算 将公共子字符串的总长度除以最小值, 两个原始字符串的最大或平均长度(类似于 史密斯-沃特曼)。
...
这个算法是 适用于有单词的复合名称(如给定和姓氏) 换了。
【讨论】:
您应该阅读我链接到的论文,并按照示例进行操作。不幸的是,他将其称为 LCS,因为它将其与最长公共子串问题和最长公共子序列混淆了,这两者都与他在论文中描述的不同。他所描述的与您在上面评论中给出的所有示例都不匹配。 谢谢,是的,我注意到它与我一直在研究的子序列混淆了。同时,我将看一下我编写的代码接近(并且比上面描述的更简单)的代码。我在这里对我完全出于我的目的而编写的代码做了一个更好的解释:meta.codegolf.stackexchange.com/questions/2140/…以上是关于这已经是字符串相似度算法了吗?的主要内容,如果未能解决你的问题,请参考以下文章