Package utils version 4.2.0
计算字符向量之间的近似字符串距离。这个距离是一个广义的Levenshtein(编辑)距离,给出了将一个字符串转换为另一个字符串所需的最小可能的插入、删除和替换加权数。
adist(x, y = NULL, costs = NULL, counts = FALSE, fixed = TRUE,
partial = !fixed, ignore.case = FALSE, useBytes = FALSE)
参数【x】:一个字符向量。不支持长向量。
参数【y】:一个字符向量,或默认为NULL,即视作参数【x】的值。
参数【costs】:数值向量或命名列表,明确指出计算Levenshtein距离时要进行“insertions”,“deletions”和“substitutions”的加权。默认为NULL表示三种编辑方式加权相同。
参数【counts】:逻辑值指示是否将编辑次数(insertions,deletions和substitutions的次数)作为返回值的 counts 属性。
参数【fixed】:逻辑值。默认为TRUE,参数【x】视为正常的字符。否则,参数【x】将视为标准的正则字符串,并且参数【partial】自动设置为FALSE。
参数【partial】:逻辑值。指示编辑后的参数【x】是否要完全匹配参数【y】。
参数【ignore.case】:逻辑值。如果为TRUE,计算编辑距离时忽略大小写。
参数【useBytes】:逻辑值。如果为TRUE,计算编辑距离将使用字节,而不是字符。
两个字符串s和t之间的(广义的)Levenshtein(或编辑)距离是将s转换为t(以便转换完全匹配t)所需的插入、删除和替换的最小可能加权数。
这个距离是在partial = FALSE时计算的,目前使用的是一种动态规划算法(例如,参见https://en.wikipedia.org/wiki/Levenshtein_distance),其空间和时间复杂度为O(mn),其中m和n分别是s和t的长度。
另外,计算变换序列和计数是O(max(m,n))。
广义Levenshtein距离也可以用于近似(模糊)字符串匹配,在这种情况下,可以找到与模式s距离最小的t的子字符串(可以将其视为正则表达式,在这种情况下使用最左和最长匹配的原则适用),参见,例如https://en.wikipedia.org/wiki/Approximate_string_matching。这个距离是由Ville Laurikari (https://github.com/laurikari/tre)使用' ' tre ' '为partial = TRUE计算的,并且对应于agrep使用的距离。在这种情况下,给定的cost值被强制为整数。
注意,插入和删除的代价可以不同,在这种情况下,s和t之间的距离可以不同于t和s之间的距离。
具有x和y元素的近似串距离的矩阵,其行和列分别对应于x和y。
如果counts为TRUE,则转换计数作为该矩阵的“counts”属性返回,作为一个三维数组,其维度分别对应于x的元素、y的元素和转换类型(插入、删除和替换)。
此外,如果partial = FALSE,转换序列将作为返回值的“trafos”属性返回,作为包含元素“M”、“I”、“D”和“S”的字符串,分别表示匹配、插入、删除和替换。
如果partial = TRUE,则匹配子字符串的偏移量(第一个和最后一个元素的位置)将作为返回值的"offsets"属性返回(包含两个偏移量),−1表示不匹配。
adist("kitten", "sitting")
[,1] [1,] 3
drop(attr(adist("kitten", "sitting", counts = TRUE), "counts"))
ins del sub 1 0 2
attr(adist(c("kitten", "sitting"), counts = TRUE), "trafos")
[,1] [,2] [1,] "MMMMMM" "SMMMSMI" [2,] "SMMMSMD" "MMMMMMM"
adist("lasy", "1 lazy 2")
[,1] [1,] 5
adist("lasy", "1 lazy 2", partial = TRUE)
[,1] [1,] 1