【问题标题】:R: String Fuzzy Matching using jarowinklerR:使用 jarowinkler 进行字符串模糊匹配
【发布时间】:2015-03-17 14:45:06
【问题描述】:

我在 R 中有两个字符类型的向量。

我希望能够使用 jarowinkler 将参考列表与原始字符列表进行比较并分配 % 相似度分数。因此,例如,如果我有 10 个参考项目和 20 个原始数据项目,我希望能够获得比较的最佳分数以及算法与之匹配的内容(所以 2 个向量,共 10 个)。如果我有大小为 8 和 10 个参考项目的原始数据,我应该只得到 8 个项目的 2 个向量结果,每个项目具有最佳匹配和得分

itemma​​tchma​​tched_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
  }
} 

【问题讨论】:

  • 也许是 RecordLinkage 包,以及由此构建的函数? compareJW cutoff }
  • 如果有多个最佳拟合具有相同的 jarowinkler 分数,您的匹配标准是什么?您选择第一个匹配项,还是随机选择最佳匹配项?

标签: r string levenshtein-distance


【解决方案1】:

使用玩具示例:

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 的管道方法,并将原始单词和引用的每个组合按原始单词分组,添加一列match_score 与 jarowinkler 分数,并仅返回最高匹配分数的摘要(由 which.max(match_score) 索引),以及同样由最大 match_score 索引的参考。

【讨论】:

  • 您好 Jim M。谢谢您的回答,我从来不知道 expand.grid 函数。你能解释一下最后一个命令是如何工作的吗?
  • 感谢@Jim M,我设法让它与您的代码一起工作,一点问题都没有,但遇到了here 概述的问题,这基本上是由于 NSL 在 Group 和 jarowinkler 中使用功能。我仍然会玩它,你的回答非常好,为我开辟了 R 的新领域......非常感谢
  • @Jim M 我也可以为大型数据帧实现这一点吗?
  • @KRU:这取决于你所说的巨大。我相信限制是 2^31 的 data.frame - 1 行可以一次访问,否则数据可能必须细分为块进行分析。
【解决方案2】:

有一个包已经实现了 Jaro-Winkler 距离。

> install.packages("stringdist")
> library(stringdist)
> 1-stringdist('ice','ice-cream',method='jw')
[1] 0.7777778

【讨论】:

  • 嗨@Ken Yeoh,谢谢你的回复。这本质上给了我与 jarowinkler(refitem,item) 相同的东西,但我的问题是如果我有很多东西要参考,我只希望它返回最高匹配和百分比匹配。所以我有 1 项要检查,8 项要检查,我希望能够只返回一个答案,即最高匹配以及参考表中的匹配是什么
  • 啊,对不起,我误解了你的问题。您可以使用 stringdistmatrix 做到这一点,但我认为@Jim M 的答案更容易实现。
猜你喜欢
  • 2015-03-26
  • 2012-02-14
  • 2014-11-02
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多