R:使用 jarowinkler 的字符串模糊匹配
R: String Fuzzy Matching using jarowinkler
我在 R 中有两个字符类型的向量。
我希望能够使用 jarowinkler 将参考列表与原始字符列表进行比较,并指定相似度百分比。因此,例如,如果我有 10 个参考项和 20 个原始数据项,我希望能够获得比较的最佳分数以及算法将其匹配到什么(因此 2 个向量为 10)。如果我有大小为 8 的原始数据和 10 个参考项目,我应该只得到 8 个项目的 2 个矢量结果,每个项目具有最佳匹配和得分
item, match, matched_to
冰,78,冰淇淋
下面是我的代码,没什么可看的。
NumItems.Raw = length(words)
NumItems.Ref = length(Ref.Desc)
for (item in words)
{
for (refitem in Ref.Desc)
{
jarowinkler(refitem,item)
# Find Best match Score
# Find Best Item in reference table
# Add both items to vectors
# decrement NumItems.Raw
# Loop
}
}
有一个包已经实现了 Jaro-Winkler 距离。
> install.packages("stringdist")
> library(stringdist)
> 1-stringdist('ice','ice-cream',method='jw')
[1] 0.7777778
使用玩具示例:
library(RecordLinkage)
library(dplyr)
ref <- c('cat', 'dog', 'turtle', 'cow', 'horse', 'pig', 'sheep', 'koala','bear','fish')
words <- c('dog', 'kiwi', 'emu', 'pig', 'sheep', 'cow','cat','horse')
wordlist <- expand.grid(words = words, ref = ref, stringsAsFactors = FALSE)
wordlist %>% group_by(words) %>% mutate(match_score = jarowinkler(words, ref)) %>%
summarise(match = match_score[which.max(match_score)], matched_to = ref[which.max(match_score)])
给予
words match matched_to
1 cat 1.0000000 cat
2 cow 1.0000000 cow
3 dog 1.0000000 dog
4 emu 0.5277778 bear
5 horse 1.0000000 horse
6 kiwi 0.5350000 koala
7 pig 1.0000000 pig
8 sheep 1.0000000 sheep
编辑: 作为对 OP 评论的回应,最后一个命令使用来自 dplyr
的管道方法,并将原始单词和引用的每个组合分组原始单词,添加一个包含 jarowinkler 分数的列 match_score,并且 returns 只是最高匹配分数的摘要(由 which.max(match_score) 索引),以及作为参考,它也由最大值 match_score.
索引
我在 R 中有两个字符类型的向量。
我希望能够使用 jarowinkler 将参考列表与原始字符列表进行比较,并指定相似度百分比。因此,例如,如果我有 10 个参考项和 20 个原始数据项,我希望能够获得比较的最佳分数以及算法将其匹配到什么(因此 2 个向量为 10)。如果我有大小为 8 的原始数据和 10 个参考项目,我应该只得到 8 个项目的 2 个矢量结果,每个项目具有最佳匹配和得分
item, match, matched_to 冰,78,冰淇淋
下面是我的代码,没什么可看的。
NumItems.Raw = length(words)
NumItems.Ref = length(Ref.Desc)
for (item in words)
{
for (refitem in Ref.Desc)
{
jarowinkler(refitem,item)
# Find Best match Score
# Find Best Item in reference table
# Add both items to vectors
# decrement NumItems.Raw
# Loop
}
}
有一个包已经实现了 Jaro-Winkler 距离。
> install.packages("stringdist")
> library(stringdist)
> 1-stringdist('ice','ice-cream',method='jw')
[1] 0.7777778
使用玩具示例:
library(RecordLinkage)
library(dplyr)
ref <- c('cat', 'dog', 'turtle', 'cow', 'horse', 'pig', 'sheep', 'koala','bear','fish')
words <- c('dog', 'kiwi', 'emu', 'pig', 'sheep', 'cow','cat','horse')
wordlist <- expand.grid(words = words, ref = ref, stringsAsFactors = FALSE)
wordlist %>% group_by(words) %>% mutate(match_score = jarowinkler(words, ref)) %>%
summarise(match = match_score[which.max(match_score)], matched_to = ref[which.max(match_score)])
给予
words match matched_to
1 cat 1.0000000 cat
2 cow 1.0000000 cow
3 dog 1.0000000 dog
4 emu 0.5277778 bear
5 horse 1.0000000 horse
6 kiwi 0.5350000 koala
7 pig 1.0000000 pig
8 sheep 1.0000000 sheep
编辑: 作为对 OP 评论的回应,最后一个命令使用来自 dplyr
的管道方法,并将原始单词和引用的每个组合分组原始单词,添加一个包含 jarowinkler 分数的列 match_score,并且 returns 只是最高匹配分数的摘要(由 which.max(match_score) 索引),以及作为参考,它也由最大值 match_score.