我正在尝试检测打开的文本字段(阅读:混乱!)与名称向量之间的匹配。我创建了一个愚蠢的水果示例,突出了我的主要挑战。
df1 <- data.frame(id = c(1, 2, 3, 4, 5, 6),
entry = c("Apple",
"I love apples",
"appls",
"Bannanas",
"banana",
"An apple a day keeps..."))
df1$entry <- as.character(df1$entry)
df2 <- data.frame(fruit=c("apple",
"banana",
"pineapple"),
code=c(11, 12, 13))
df2$fruit <- as.character(df2$fruit)
df1 %>%
mutate(match = str_detect(str_to_lower(entry),
str_to_lower(df2$fruit)))
如果你愿意的话,我的方法会抓住低垂的果实(“Apple”和“banana”的精确匹配)。
# id entry match
#1 1 Apple TRUE
#2 2 I love apples FALSE
#3 3 appls FALSE
#4 4 Bannanas FALSE
#5 5 banana TRUE
#6 6 An apple a day keeps... FALSE
无与伦比的案例有不同的挑战:
- 案例 2 和 6 中的目标水果被嵌入到较大的字符串中。
- 3 和 4 中的目标水果需要模糊匹配。
该fuzzywuzzyR
软件包很棒并且做得很好(有关安装 python 模块的详细信息,请参阅页面)。
library(fuzzywuzzyR)
choices <- df2$fruit
word <- df1$entry[3] # "appls"
init_proc = FuzzUtils$new()
PROC = init_proc$Full_process
PROC1 = tolower
init_scor = FuzzMatcher$new()
SCOR = init_scor$WRATIO
init <- FuzzExtract$new()
init$Extract(string = word,
sequence_strings = choices,
processor = PROC,
scorer = SCOR)
此设置为“apple”(最高)返回 80 分。
除了 ,还有其他方法可以考虑fuzzywuzzyR
吗?你将如何解决这个问题?
添加fuzzywuzzyR
输出:
[[1]]
[[1]][[1]]
[1] "apple"
[[1]][[2]]
[1] 80
[[2]]
[[2]][[1]]
[1] "pineapple"
[[2]][[2]]
[1] 72
[[3]]
[[3]][[1]]
[1] "banana"
[[3]][[2]]
[1] 18