R: Мне нужно сделать Softmatch в String

Мне нужно выполнить softmatch в одном столбце фрейма данных с заданной входной строкой, например

col <- c("John Collingson","J Collingson","Dummy Name1","Dummy Name2")

inputText <- "J Collingson"
#Vice-Versa
inputText <- "John Collingson"

Я хочу получить как «Джон Коллингсон», так и «Дж. Коллингсон» из предоставленного столбца «col»

Любезно помогите


person user_az    schedule 10.06.2013    source источник


Ответы (2)


agrep - определенно быстрое и простое решение для базового R, если у вас совсем немного данных. Если это просто игрушечный пример большого фрейма данных, вас может заинтересовать более надежный инструмент. За последний месяц информация о расстоянии Левенштейна, отмеченном @PaulHiemstra (также в этих различные вопросы ) привел меня к пакету RecordLinkage. Виньетки заставляют меня хотеть больше примеров "мягких" или нечетких совпадений, особенно по более чем одному полю, но основной ответ на ваш вопрос может быть примерно таким:

library(RecordLinkage)
col <- data.frame(names1 = c("John Collingson","J Collingson","Dummy Name1","Dummy Name2"))
inputText <- data.frame(names2 = c("J Collingson"))
g1 <- compare.linkage(inputText, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6) 
# id          names2 Weight
# 1  1    J Collingson       
# 2  2    J Collingson  1.000
# 3                          
# 4  1    J Collingson       
# 5  1 John Collingson  0.815

inputText2 <- data.frame(names2 = c("Jon Collinson"))
g1 <- compare.linkage(inputText2, col, strcmp = T)
g2 <- epiWeights(g1)
getPairs(g2, min.weight=0.6)
# id          names2    Weight
# 1  1   Jon Collinson          
# 2  1 John Collingson 0.9644444
# 3                             
# 4  1   Jon Collinson          
# 5  2    J Collingson 0.7924825

Начните с compare.linkage () или compare.dedup () - RLBigDataLinkage () или RLBigDataDedup () для больших наборов данных. Надеюсь это поможет.

person Jack Ryan    schedule 10.06.2013

Кажется, что agrep - это та функция, которую вы ищете. Это делает Approximate String Matching (Fuzzy Matching). Он возвращает наиболее близкое соответствие входному шаблону в соответствии с некоторой мерой расстояния, то есть обобщенным расстоянием редактирования Левенштейна. См. ?agrep для получения более подробной информации.

agrep("J Collingson", col, value = TRUE)
[1] "John Collingson" "J Collingson"  
person Paul Hiemstra    schedule 10.06.2013