在两个列表之间获取最接近的字符串匹配

3
我是R语言的初学者,手头有两个城市名称列表。其中一个列表由用户生成(可能拼写混乱),另一个列表是正确的拼写。
我尝试使用包,但最终只得到了一个循环匹配最接近的结果的代码。但我只能输入向量,而我真正需要使用数据框架。
这是我的代码(感觉非常尴尬):
 input <- "BAC"   #misspelled 
  correct <- c("ABC", "DEF", "GHI", "JKL") #list with all correct names
  shortest <- -1a

for (word in correct) {

  dist <- stringdist(input, word)
  #checks if it's a match!
  if (dist == 0){
    closest <- palavra
    shortest <- 0

    break

  }

  if(dist <= shortest || shortest < 0){
    closest <- word
    shortest <- dist

  }

}


if(shortest == 0){ 
  print("It's a match!")
} else {
  print(closest)
}

这个想法是使用这段代码来有一个概念,我想从这里开始,使用 stringdist 在我的数据框的每一行中。我甚至不知道这是否是一个好主意,是否会占用太多处理能力,请毫不犹豫地说这很愚蠢。谢谢!


你在stringdist函数调用中使用了word,但在它下面的if语句中使用了palavra。你是不是忘记翻译"palavra"了,还是在你的代码中有其他地方定义了这个对象? - undefined
可能是[agrep:仅返回最佳匹配项]的重复问题(https://dev59.com/e2025IYBdhLWcg3w6aYX) - undefined
@camille 是的,我忘记翻译了... - undefined
1个回答

5

stringdist 包中有一个专门用于此的特殊函数,名为 amatch


input <- "BAC"   #misspelled 
correct <- c("ABC", "DEF", "GHI", "JKL") 

correct[amatch(input, correct, maxDist = Inf)]
# "ABC"

最初的回答:
这也适用于一次输入多个单词,因此无需使用for循环。
input <- c("New Yorkk", "Berlyn", "Pariz") # misspelled 
correct <- c("Berlin", "Paris", "New York", "Los Angeles") # correct names

correct_words <- correct[amatch(input, correct, maxDist = Inf)]
data.frame(input, correct_words)

 #       input correct_words
 #   New Yorkk      New York
 #      Berlyn        Berlin
 #       Pariz         Paris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接