R语言【utlis】——adist():字符串近似距离(编辑距离)

Package utils version 4.2.0


Description

计算字符向量之间的近似字符串距离。这个距离是一个广义的Levenshtein(编辑)距离,给出了将一个字符串转换为另一个字符串所需的最小可能的插入、删除和替换加权数。


Usage

R 复制代码
adist(x, y = NULL, costs = NULL, counts = FALSE, fixed = TRUE,
      partial = !fixed, ignore.case = FALSE, useBytes = FALSE)

Arguments

参数【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,计算编辑距离将使用字节,而不是字符。


Details

两个字符串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之间的距离。


Value

具有x和y元素的近似串距离的矩阵,其行和列分别对应于x和y。

如果counts为TRUE,则转换计数作为该矩阵的"counts"属性返回,作为一个三维数组,其维度分别对应于x的元素、y的元素和转换类型(插入、删除和替换)。

此外,如果partial = FALSE,转换序列将作为返回值的"trafos"属性返回,作为包含元素"M"、"I"、"D"和"S"的字符串,分别表示匹配、插入、删除和替换。

如果partial = TRUE,则匹配子字符串的偏移量(第一个和最后一个元素的位置)将作为返回值的"offsets"属性返回(包含两个偏移量),−1表示不匹配。


Examples

R 复制代码
adist("kitten", "sitting")
复制代码
     [,1]
[1,]    3
R 复制代码
drop(attr(adist("kitten", "sitting", counts = TRUE), "counts"))
复制代码
ins del sub 
  1   0   2 
R 复制代码
attr(adist(c("kitten", "sitting"), counts = TRUE), "trafos")
复制代码
     [,1]      [,2]     
[1,] "MMMMMM"  "SMMMSMI"
[2,] "SMMMSMD" "MMMMMMM"
R 复制代码
adist("lasy", "1 lazy 2")
复制代码
     [,1]
[1,]    5
R 复制代码
adist("lasy", "1 lazy 2", partial = TRUE)
复制代码
     [,1]
[1,]    1
相关推荐
悟能不能悟1 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
循环过三天1 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
_院长大人_2 小时前
设计模式-工厂模式
java·开发语言·设计模式
MATLAB代码顾问2 小时前
MATLAB实现决策树数值预测
开发语言·决策树·matlab
不染尘.4 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
似水এ᭄往昔4 小时前
【C++】--stack和queue
开发语言·c++
csbysj20204 小时前
R 绘图 - 散点图
开发语言
会跑的兔子5 小时前
Android 16 Kotlin协程 第一部分
android·开发语言·kotlin
Js_cold5 小时前
Verilog函数function
开发语言·fpga开发·verilog
我是苏苏5 小时前
C#基础:如何从现有类库复制一个新的类库,并且加入解决方案
开发语言·c#