是否存在将“块转置”考虑在内的编辑距离算法?

时间:2009-05-18 14:44:34

标签: algorithm language-agnostic levenshtein-distance edit-distance

我把“chunk transposition”放在引号中,因为我不知道技术术语应该是什么或者是什么。只要知道该过程是否有技术术语就会非常有用。

Wikipedia article on edit distance给出了一些关于这个概念的好背景。

考虑到“chunk transposition”,我的意思是

Turing, Alan.

应匹配

Alan Turing

比匹配更紧密

Turing Machine

即。距离计算应该检测文本的子串何时只是在文本中移动。普通的Levenshtein距离公式不是这种情况。

字符串最多只有几百个字符 - 它们是作者姓名或作者姓名列表,可以是各种格式。我不是在进行DNA测序(尽管我怀疑那些会对这个主题有所了解的人)。

6 个答案:

答案 0 :(得分:2)

对于您的应用程序,您应该考虑从生物信息学中调整一些算法。

例如,您可以通过确保所有分隔符都是空格或您喜欢的任何其他内容来统一字符串,以便将“Alan Turing”与“图灵Alan”进行比较。然后拆分其中一个字符串并执行一个精确的字符串匹配算法(如Horspool - 算法),其中的部分与另一个字符串相对应,计算匹配的子字符串的数量。

如果您希望找到仅相似但不相等的匹配,那么local alignment的某些内容可能更合适,因为它提供了描述相似性的分数,但引用的Smith-Waterman-算法可能对您的应用程序来说有点过分,甚至没有最好的局部对齐算法。

根据您的编程环境,可能已有可用的实施方案。我个人最近与SeqAn合作过,这是一个用于C ++的生物信息学库,绝对可以提供所需的功能。

嗯,这是一个相当抽象的答案,但我希望它指出你正确的方向,但遗憾的是它没有为你提供一个简单的公式来解决你的问题。

答案 1 :(得分:2)

查看Jaccard距离度量(JDM)。这是一个古老而又善良的东西,非常擅长令牌级别的差异,如姓氏优先,名字最后。对于两个字符串比较,JDM计算只是两个字符串共有的唯一字符数除以它们之间的唯一字符总数(换句话说,就是联合上的交集)。例如,给定两个参数“JEFFKTYZZER”和“TYZZERJEFF”,分子为7,分母为8,产生的值为0.875。我选择的字符作为标记并不是唯一可用的字符,BTW - n-gram也常用。

答案 2 :(得分:1)

我认为您正在寻找Jaro-Winkler distance,这正是名称匹配。

答案 3 :(得分:1)

您可能会发现压缩距离对此有用。请参阅an answer I gave for a very similar question

或者你可以使用基于k元组的计数系统:

  1. 选择较小的k值,例如K = 4。
  2. 将字符串的所有长度k子串提取到列表中。
  3. 对列表进行排序。 (O(knlog(n)time。)
  4. 对您要比较的其他字符串执行相同操作。您现在有两个排序列表。
  5. 计算两个字符串共享的k元组数。如果字符串的长度为n和m,则可以使用列表合并在O(n + m)时间内完成,因为列表按排序顺序。
  6. 共同的k元组数是您的相似度得分。
  7. 使用小字母(例如DNA),你通常会维护一个向量,存储每个可能的k元组的计数而不是排序列表,尽管当字母表是任何字符时,这是不实际的 - 对于k = 4,你需要一个256 ^ 4阵列。

答案 4 :(得分:1)

编辑距离的最简单,最有效的现代替代方法之一称为标准化压缩距离(NCD)。基本思想很容易解释。选择以您的语言实现的流行压缩器,例如 zlib 。然后,给定字符串 A 和字符串 B ,让 C(A)成为 A 的压缩大小和< em> C(B)是 B 的压缩大小。设 AB 表示“ A B ”连接,以便 C(AB)表示“压缩后的大小“ A B 连接。”接下来,计算分数

C(AB) - min( C(A) C(B)))/ max( C(A) C(B)

此值称为NCD( A B )并测量类似于编辑距离的相似度,但支持更多形式的相似性,具体取决于您压缩的数据当然,zlib支持你所描述的“块”样式相似性。如果两个字符串相似,则串联的压缩大小将接近每个字符串的大小,因此分子将接近0,结果将接近0如果两个字符串非常不相似,则压缩大小将大致是所添加的压缩大小的总和,因此结果将接近1.此公式比编辑距离或几乎任何其他显式字符串相似性度量更容易实现人ready可以访问像zlib这样的数据压缩程序。这是因为大多数“硬”工作(例如启发式和优化)已经在数据压缩部分中完成,并且该公式简单地使用与语言无关的通用信息理论提取它发现的类似模式的数量。此外,对于您描述的几百字节大小范围,此技术将比大多数显式相似性度量(例如编辑距离)快得多。有关这方面和示例实现的更多信息,只需搜索规范化压缩距离(NCD)或查看以下文章和github项目:

http://arxiv.org/abs/cs/0312044“按压缩聚类”

https://github.com/rudi-cilibrasi/libcomplearn C语言实现

在过去的十年中,有许多其他的实施和论文可以用于其他语言和修改。

答案 5 :(得分:0)

我不确定你真正想要的是编辑距离 - 它只对字符串 - 或语义距离 - 选择最合适或相似的含义。您可能希望查看information retrieval中的主题,了解如何区分哪个是给定特定术语或短语的最合适的匹配术语/短语。从某种意义上说,你所做的是比较非常短的文件而不是字符串。