1.介绍

这是一个延续的概述字符串相似度量的文章。本教程专注于提到的基于序列的方法:

  • 最长的常见基本
  • 最长的常见子序列
  • 格式塔图案匹配

最长的常见基板和最长的常见子序列仅在最长的常用子字符串算法中差异。“序列”仅限于连续字符。最长的常见子序列发现了连续的子串组。

在这两种方法中,两个字符串的相似性基于共同长度。

格式塔图案匹配使用递归的最长共同的子字符串来建立相似度量。

在以下部分中,我们将更详细地进行详细信息。

2.最长的常见基础

我们可以使用的一个工具用于字符串相似性正在找到最长的常见子字符串(LCS)。最长的常见基板越长,两个字符串越相似。我们定义了这一点最长的常见基本作为:

给定两个字符串,'x'和'y',找到最长常见的子字符串的长度

通过在第一和后续休息字符串中递归地查找LCS(LCS中的那些字符),找到最长的公共子字符串可以用作字符串相似性方法的基础。这是格式塔模式匹配的基础。

要找到两个字符串的LC,概念上最简单的方法是首先找到一个(最小)字符串的所有子字符串,X,长度m。这可以完成o(m ^ 2)时间。对于每个字符串,确定它是第二字符串的子字符串,y,长度N。这可以完成上)时间。总时间复杂性是o(n m ^ 2)

在我们的文章中可以看到这种方法的实现,也可以显示复杂性在不重复字符的情况下找到最长的子字符串。一种提高算法复杂性的一种方法是使用动态编程。此方法构建字符重叠的矩阵。

2.1。动态编程

使用动态编程的复杂性远远优于简单的方法。即,o(n \ times m), 在哪里mN是要比较的弦的长度。这种方法的核心是建立一个(n + 1)经过(m + 1)矩阵,其中行和列是每个字符串中的字符。在这种方法中,我们找到了最长的常见后缀,这意味着两个字符串中的最长的子字符串,具有相同的结尾。

为字符串执行此操作X大小m和一个字符串y大小N,我们首先建立一个矩阵,LCS.,大小M + 1经过n + 1在哪里LCS(I,J)具有以下属性:

QuickLatex.com呈现

例如,如果我们有两个字符串,x =(ababc)Y =(Babca),我们将构建的矩阵是:

QuickLatex.com呈现

由于最大的数字4.,我们知道最长的常见的子字符串长为四个字符。要找到子字符串本身,从最大的数字开始,4.在这种情况下,然后倒计时1

QuickLatex.com呈现

我们可以看到这种算法的复杂性由循环通过字符主导,所以o(n \ times m)

3.最长的常见子序列

最长常见序列和最长公共子字符串之间的差异是,与子串不同的“序列”不需要在原始序列内占据连续位置。可以在不匹配的字符中存在间隙。例如,在两句话中:

狐狸跳过高篱笆

快速的棕色狐狸跳过篱笆。

最长的基板只是:

狐狸跳过了

但最长的延时是:

狐狸跳过篱笆

要查找最长的公共序列的动态编程方法类似于这两种中的最长公共子字符,构建了一个字符重叠矩阵。矩阵以相同的方式构建。差异在于我们如何遍历此矩阵来查找常见的子序列。我们以前倒数,但找到最大的随后,遍历下一个最低计数不必在矩阵中相邻

4.格式塔图案匹配

粗壮的模式匹配,也称为Ratcliff / Obershelp模式识别,是最初在文章中发布的模式相似性方法模式匹配:最大的纤维塔在Dobb博士的期刊中。gestalt这个词,意思应该将自然系统及其性质的想法视为惠尔,而不是零件的松散集合,用于强调整个字符串一起分析。甲茅塔的方法意味着一种更接近人类分析的方法。

关键公式,给定两个字符串,S_1.S_2., 是:

相似之处= \ FRAC {2 k_m} {| S_1 |+ | S_2 |}

在哪里K_M.是字符串中匹配字符的数量| S_1 || S_2 |是两个字符串的长度。相似度指标是一个值0.,字符串之间没有匹配1,相同的匹配。首先通过找到最长的公共子字符串(LCS),然后递归地,在两个字符串的非匹配区域中找到匹配字符(再次使用LCS)来确定匹配字符。

我们使用“宾夕法尼亚州”和“铅笔vaneya”来说明了原始算法中使用的示例的这种算法。这两个字符串的LC是'lvan':'Pennsy达伦IA','Penci达伦艾莎。因此,初始K_M.2 * 4 = 8

现在,我们继续,在匹配部分的右侧和左侧的两个剩余休息对,['Pennsy','Penci']和['Ia','Eya]。我们找到了“钢笔nsy','钢笔CI',与“笔”相匹配,我们增加了K_M.8 + 2 * 3 = 14

剩下的对[nsy,ci]没有共同的角色,所以我们完成了这一侧。继续['我一种',ey一种'],我们看到有一个角色,'a',共同,我们增加了K_M.14 + 2 * 1 = 16。我们看到剩下的字符串,['我','Ey']没有角色,所以我们已经完成了。所以总分是0.66

相似之处= \ FRAC {2 k_m} {| S_1 |+ |ß_2|} = \ FRAC {2 *(4 + 3 + 1)} {12 + 12} = \ FRAC {16} {24} = \ FRAC {2} {3} = 0.66

可以找到该算法的实现C和汇编程序在Ratcliff的文章中,但也有实现Python基于原始算法甚至实现scala。

我们可以看到GeStalt算法的复杂性的根本取决于最长的常用子字符串算法。实际上,这使得在更糟糕的情况下进行了复杂性,o(n ^ 2)最美好的上)

5.总结

在本文中,我们检查了基于序列的方法分析两个字符串相似性的一般领域。我们看到,最长的常见的子字段方法本身是一种相似性方法,而且是格式塔模式匹配算法中的关键算法。我们还看到,使用动态编程方法可以大大提高算法的复杂性。

评论在本文上关闭!