比较相似性算法
Posted
技术标签:
【中文标题】比较相似性算法【英文标题】:Compare similarity algorithms 【发布时间】:2012-04-08 04:32:47 【问题描述】:我想使用字符串相似函数在我的数据库中查找损坏的数据。
我遇到了几个:
加罗, 雅罗-温克勒, 列文施泰因, 欧几里得和 Q-gram,我想知道它们之间有什么区别以及它们在什么情况下效果最好?
【问题讨论】:
我从未听说过“Q-gram”。有什么参考吗? 这是一个wiki-walk is honestly most appropriate 快速连贯地回答您的问题的案例。另请考虑:使用Shannon entropy 或mutual information 作为启发式。比较是通过问题空间和效率,可以从描述和正文中得到。 这是一个不平凡的数学领域,为此编写了书籍并进行了广泛的研究,值得讨论,这很难融入一个单一的 SO 答案。你能说得更具体些吗? 【参考方案1】:在勘误表和noting some of the ground-floor literature on the comparability of algorithms that apply to similar problem spaces, 中扩展我的 wiki-walk 评论,让我们先探索这些算法的适用性,然后再确定它们在数值上是否具有可比性。
来自***,Jaro-Winkler:
在计算机科学和统计学中,Jaro-Winkler 距离 (Winkler, 1990) 是衡量两个字符串之间相似性的指标。它是 Jaro 距离度量的一种变体 (Jaro, 1989, 1995) 和 主要[引文需要]用于记录链接领域(重复 检测)。两根弦的 Jaro-Winkler 距离越大, 字符串越相似。 Jaro-Winkler 距离度量是 设计并最适合短字符串,例如人名。这 分数被归一化,使得 0 等于没有相似性,1 是 完全匹配。
Levenshtein distance:
在信息论和计算机科学中,Levenshtein 距离 是一个字符串度量,用于测量两个之间的差异量 序列。术语编辑距离通常用于具体指代 到 Levenshtein 的距离。
两个字符串之间的 Levenshtein 距离定义为最小 将一个字符串转换为另一个字符串所需的编辑次数,其中 允许的编辑操作是插入、删除或 替换单个字符。它以弗拉基米尔命名 Levenshtein,他在 1965 年考虑过这个距离。
Euclidean distance:
在数学中,欧几里得距离或欧几里得度量是 两点之间的“普通”距离 标尺,由毕达哥拉斯公式给出。通过使用这个公式 随着距离,欧几里得空间(甚至任何内积空间)变为 一个度量空间。相关的范数称为欧几里得范数。 较早的文献将该度量称为毕达哥拉斯度量。
还有Q- or n-gram encoding:
在计算语言学和概率领域,n-gram 是来自给定文本序列的 n 个项目的连续序列,或 演讲。有问题的项目可以是音素、音节、字母、 根据应用的单词或碱基对。 n-gram 是 从文本或语音语料库中收集。
两个核心 n-gram 模型的优点(以及使用 它们)是相对简单的和扩大规模的能力——通过简单 增加 n 模型可用于存储更多上下文 易于理解的时空权衡,使小型实验能够 非常有效地扩大规模。
问题在于这些算法解决了在所有可能的算法空间内具有不同适用性的不同问题,以解决longest common subsequence 问题,在您的数据中或在嫁接可用的metric 时。事实上,并非所有这些都是指标,因为其中一些不满足triangle inequality。
不要特意定义一个可疑的方案来检测数据损坏,正确地做到这一点:对您的数据使用checksums 和parity bits。 不要试图解决当一个更简单的解决方案可以解决时,一个更难的问题。
【讨论】:
如果您尝试验证数据库是否已损坏,请使用校验和和奇偶校验位。如果您想弄清楚哪些数据已损坏,则需要确定您要修复的损坏类型(记录链接、污染数据、丢失数据等)。【参考方案2】:字符串相似性在很多方面都有帮助。例如
你的意思是谷歌的结果是使用字符串相似度计算的。 字符串相似度用于纠正 OCR 错误。 字符串相似度用于纠正键盘输入错误。 字符串相似性用于在生物信息学中寻找两个 DNA 的最匹配序列。但由于一种尺寸并不适合所有人。每个字符串相似度算法都是为特定用途而设计的,尽管它们中的大多数是相似的。例如Levenshtein_distance 是关于您更改多少字符以使两个字符串相等。
kitten → sitten
这里的距离是 1 个字符变化。您可以对删除、添加和替换赋予不同的权重。例如,OCR 错误和键盘错误对某些更改的影响较小。 OCR(一些字符与其他字符非常相似),键盘一些字符彼此非常接近。生物信息学字符串相似性允许大量插入。
“Jaro–Winkler 距离度量的第二个示例经过设计,最适合短字符串,例如人名”
因此,您应该牢记您的问题。
我想使用字符串相似函数在我的数据库中查找损坏的数据。
您的数据是如何损坏的?是用户错误吗,类似于键盘输入错误?还是类似于 OCR 错误?还是完全不同的东西?
【讨论】:
Google 的 你是说 不是使用字符串相似度计算的。它是通过跟踪用户错误输入并稍后重新尝试来计算的。 Source以上是关于比较相似性算法的主要内容,如果未能解决你的问题,请参考以下文章