Получение наиболее близких совпадений строк между двумя списками - PullRequest
1 голос
/ 03 мая 2019

Я настоящий новичок в R, и у меня есть два списка с названиями городов.Один список имеет сгенерированные пользователем имена (люди пишут беспорядочно), а другой список с орфографией имен.

Я попытался использовать пакет stringdist , и я получил код, который зацикливается (для) и дает наиболее близкое совпадение.Но я мог только вводить векторы, и мне действительно нужно использовать фреймы данных.

Это мой код (о боже, это неудобно):

 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 в каждой строке моего фрейма данных.Я даже не знаю, если это хорошая идея, если это потребует слишком много вычислительной мощности, не бойтесь говорить, что это глупо.Спасибо!

1 Ответ

0 голосов
/ 03 мая 2019

для этого есть специальная функция в пакете 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
...