R中agrep模糊匹配约束的理解

R中agrep模糊匹配约束的理解,r,fuzzy-search,agrep,R,Fuzzy Search,Agrep,这看起来很简单,但出于某种原因,我不理解包含替换的agrep模糊匹配的行为。当指定了all=2时,两个替换会产生预期的匹配,但当substitutions=2时则不会。为什么会这样 #按预期查找匹配项 agrep(“abcdeX”,“abcdef”,值=T, 最大距离=列表(sub=1,ins=0,del=0)) #>[1]“abcdef” #未按预期找到匹配项 agrep(“abcdXX”,“abcdef”,值=T, 最大距离=列表(sub=1,ins=0,del=0)) #>字符(0) #按

这看起来很简单,但出于某种原因,我不理解包含替换的
agrep
模糊匹配的行为。当指定了
all=2
时,两个替换会产生预期的匹配,但当
substitutions=2
时则不会。为什么会这样

#按预期查找匹配项
agrep(“abcdeX”,“abcdef”,值=T,
最大距离=列表(sub=1,ins=0,del=0))
#>[1]“abcdef”
#未按预期找到匹配项
agrep(“abcdXX”,“abcdef”,值=T,
最大距离=列表(sub=1,ins=0,del=0))
#>字符(0)
#按预期查找匹配项
agrep(“abcdXX”,“abcdef”,值=T,
最大距离=列表(全部=2))
#>[1]“abcdef”
#没有意外地找到匹配项
agrep(“abcdXX”,“abcdef”,值=T,
最大距离=列表(sub=2,ins=0,del=0))
#>字符(0)

由(v2.0.0)于2021-06-03创建的所有

all
是一个始终适用的上限,无论其他最大距离控制(成本除外)。它默认为10%

# one characters can change
agrep(pattern = "abcdXX", x = "abcdef", value = TRUE,
     max.distance = list(sub = 2, ins = 0, del = 0, all = 0.1))
# character(0)

# two characters can change
agrep(pattern = "abcdXX", x = "abcdef", value = TRUE,
     max.distance = list(sub = 2, ins = 0, del = 0, all = 0.2))
# [1] "abcdef"

# one character can change
agrep(pattern = "abcdXX", x = "abcdef", value = TRUE,
    max.distance = list(sub = 1, ins = 1, del = 0, all = 0.1))
# character(0)

# two characters can change
agrep(pattern = "abcdXX", x = "abcdef", value = TRUE,
    max.distance = list(sub = 1, ins = 1, del = 0, all = 0.2))
# [1] "abcdef"
设置
all
的分数模式在1时切换为整数模式,这有点问题

# 8 insertions allowed
agrep(pattern = "abcdXXef", x = "abcdef", value = TRUE,
    max.distance = list(sub = 0, ins = 2, del = 0, all = 1 - 1e-9))
# [1] "abcdef"

# 1 insertion allowed
agrep(pattern = "abcdXXef", x = "abcdef", value = TRUE,
    max.distance = list(sub = 0, ins = 2, del = 0, all = 1))
# character(0)
通过将其设置为略小于1来抑制所有时,距离模式上的限制将适用

# two substitutions allowed
agrep(pattern = "abcdXX", 
    x = c("abcdef", "abcXdef", "abcefg"), value = TRUE,
    max.distance = list(sub = 2, ins = 0, del = 0, all = 1 - 1e-9))
# [1] "abcdef"
设定成本的目的是让你能够以不同的速率在不同的方向上移动变异空间。这将取决于您的用例。例如,某些语言方言可能更倾向于添加字母。您可以选择让一次删除花费两次插入。默认情况下,当
costs=NULL
,即
costs=c(ins=1,del=1,sub=1)
时,所有成本的权重相等

编辑:关于您对为什么某些模式匹配而其他模式不匹配的评论,10%是指模式中的字符数,四舍五入

agrep(pattern=“01234567XX89”,x=“0123456789”,value=TRUE, 最大距离=列表(sub=0,ins=2,del=0)) # [1] "0123456789" agrep(pattern=“01234567XX”,x=“0123456789”,value=TRUE, 最大距离=列表(sub=2,ins=0,del=0)) #字符(0)
谢谢你的回复。这是否意味着
max.distance
参数是无用的,只要它们的约束比
all
参数控件更宽松?我读了10遍函数帮助,但我不明白
最大距离
中实际控制的
成本是多少。在这种方法中,我怎么能只允许2次替换而不允许其他操作呢?通过一些实验,我注意到
成本
控制了允许的“错误”数量。是这样吗?例如,如果我将
sub=2
cost=2
设置为。但是,如果其中一个设置为
1
,则它不起作用。直觉上,如果
cost
是默认情况下添加的约束,而不是手动指定,那么对我来说就更有意义了。也许我遗漏了一些更新答案的方法。对于这个例子来说,现在更有意义了。你能帮助我理解我应该如何考虑为未来定义规则吗?似乎
ins
all
都可以控制允许的插入次数。我正在考虑设置
all=1-1e-9
以保持此参数处于分数模式,同时确定使用
sub
ins
等参数可以允许多少不匹配/插入。这是一个可靠的方法吗?很抱歉用评论轰炸您,但是我仍然对
all
如何影响其他参数感到困惑。我发现以下几点令人困惑:这是可行的:
agrep(“01234567XX89”,“0123456789”,value=T,max.distance=list(sub=0,ins=2,del=0))
这不是:
agrep(“01234567XX”,“0123456789”,value=T,max.distance=list(sub=2,ins=0,del=0))
我无法思考为什么。如果
all
是一个公共上限,默认值为
0.1
,则两个示例都无法找到匹配项
agrep(pattern = "01234567XX89", x = "0123456789", value = TRUE, 
    max.distance = list(sub = 0, ins = 2, del = 0))
# [1] "0123456789"
agrep(pattern = "01234567XX", x = "0123456789", value = TRUE, 
    max.distance = list(sub = 2, ins = 0, del = 0))
# character(0)
num_mutations <- nchar(c("01234567XX89", "01234567XX")) * 0.1
num_mutations
# [1] 1.2 1.0
ceiling(num_mutations)
[1] 2 1