Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Levenshtein编辑距离,带多字符单位分隔符_R_Levenshtein Distance - Fatal编程技术网

R Levenshtein编辑距离,带多字符单位分隔符

R Levenshtein编辑距离,带多字符单位分隔符,r,levenshtein-distance,R,Levenshtein Distance,我已经搜索了R函数adist、agrep、match、和stringdist,但没有找到使用分隔符计算编辑距离的方法 现有编辑距离: “that” & ”fat” = 2 i.e., adist("that","fat") 所需函数将使用分隔符表示多字符单位: “th.a.t” & ”f.a.t” = 1 Levenshtein距离很容易实现,所以只需计算它。下面是瓦格纳·费舍尔算法的快速无保证版本(见维基百科) 这就是你想要的:sum(do.call(mapply,c(“

我已经搜索了R函数
adist
agrep
match
、和
stringdist
,但没有找到使用分隔符计算编辑距离的方法

现有编辑距离:

“that” & ”fat” = 2  i.e., adist("that","fat")
所需函数将使用分隔符表示多字符单位:

“th.a.t” & ”f.a.t” = 1

Levenshtein距离很容易实现,所以只需计算它。下面是瓦格纳·费舍尔算法的快速无保证版本(见维基百科)


这就是你想要的:
sum(do.call(mapply,c(“!=”),strsplit(c(“th.a.t”,“f.a.t”),“\\”))
?(拆分两个字符串,逐子字符串比较子字符串和求和差异)它似乎缺少了处理长度变化的内容:sum(do.call(mapply,c(“!=”),strsplit(c(“th.a.t.s”,“f.a.t”),“\\”))…添加的“s”导致此错误,“(函数(FUN,…,MoreArgs=NULL,SIMPLIFY=TRUE,USE.NAMES=TRUE):longer argument不是length的倍数shorter“那太好了!在您的最后一行中给可能搜索它的人一个注释,输出是不正确的。sepLeven(“th.a.t”,“t.e.s.t”)[1]3不完全正确;函数是矢量化的。如果您运行我的测试,它不会将“th.a.t”与“t.e.s.t”和“f.a.t”与“f.e.t”进行比较,但将“th.a.t”与“f.a.t”进行比较,将“t.e.s.t”与“f.e.t”进行比较。即,第一个参数的第一个元素与第二个参数的第一个元素进行比较,第一个参数的第二个元素与第二个参数的第二个元素进行比较,依此类推。如果两者都只包含一个元素,则这是不相关的,但这种方式允许您使用单个命令对整个data.frame进行比较,或进行比较指向单个目标的字符串向量等。我在过去的一个小时里一直试图找出如何使用apply或lapply运行sepLeven,但不确定为什么会得到:strsplit中的错误(t,sep,fixed=TRUE):参数“t”丢失了,没有默认。有任何想法吗?我用同样的方式使用ADIST没有问题。@ USER 1936965对事物:如果<代码> SEPLONGE/<代码>是你正在寻找的答案,请考虑通过点击答案左边的复选标记来接受答案。其次,考虑提问作为一个新问题。(
如何与自定义函数一起使用应用
)由于它有点超出了原始问题的范围,您不需要使用
apply*或
lappy
,该函数通过
mapply
具有内置的apply。如果您有一个向量或字符串列表要与另一个字符串进行比较,或成对地与字符串向量进行比较,只需执行
vecLeven即可(向量列表,字符串向量列表)`
vecLeven <- function(s, t) {
  d <- matrix(0, nrow = length(s) + 1, ncol=length(t) + 1)
  d[, 1] <- (1:nrow(d)) - 1
  d[1,] <- (1:ncol(d))-1
  for (i in 1:length(s))  {
    for (j in 1:length(t)) {
      d[i+1, j+1] <- min(
        d[i, j+1] + 1, # deletion
        d[i+1, j] + 1, # insertion
        d[i, j] + if (s[i] == t[j]) 0 else 1 # substitution
      )
    }
  }

    d[nrow(d), ncol(d)]
}

sepLeven <- function(s, t, sep=".") {
  mapply(vecLeven, 
         strsplit(s, sep, fixed=TRUE), 
         strsplit(t, sep, fixed=TRUE))
}

sepLeven(c("th.a.t", "t.e.s.t"), c("f.a.t", "f.e.t"), sep=".")
# output: [1] 1 2