【问题标题】:Alternative approach to using agrep() for fuzzy matching in R在 R 中使用 agrep() 进行模糊匹配的替代方法
【发布时间】:2018-01-03 23:00:41
【问题描述】:

我有一个很大的管理数据文件,大约有 100 万条记录。在这个数据集中,个人可以多次表示。大约一半的记录具有将记录映射到个人的识别代码;对于没有的那一半,我需要模糊匹配名称以标记可能属于同一个人的记录。

通过查看带有识别码的记录,我创建了一个在记录同一个人姓名时出现的差异的列表:

  • 包含中间名,例如琼恩·雪诺 vs 琼恩·坦格利安·斯诺
  • 包含第二个姓氏,例如乔恩·雪诺 vs 乔恩·坦格利安-斯诺
  • 昵称/名字的缩写,例如乔纳森·斯诺 vs 乔恩·斯诺
  • 名称颠倒,例如琼恩雪诺 vs 雪琼恩
  • 拼写错误/错别字/变体:例如Samual/Samuel、莫妮卡/莫妮卡、拉斐尔/拉斐尔

鉴于我所追求的匹配类型,有没有比使用 agrep()/levenshtein 的距离更好的方法,在 R 中很容易实现?

编辑:R 中的 agrep() 不能很好地解决这个问题 - 因为我需要允许大量的插入和替换来解释名称的不同记录方式,很多错误匹配被抛出。

【问题讨论】:

标签: r string-matching agrep


【解决方案1】:

我会多次传球。

"Jon .* Snow" - 中间名

"Jon .*Snow" - 第二个姓

昵称需要一个从长到短的映射字典,没有正则表达式可以处理他。

"Snow Jon" - 反转(duh)

agrep 将处理轻微的拼写错误。

您可能还想将您的姓名标记为名字、中间名和姓氏。

【讨论】:

  • 谢谢,我没有考虑进行多次传递,我认为将名称保留为单个字符串而不是拆分它会更容易。只是为了检查 - 当您说“反转”时,您只是指先检查姓氏,反之亦然?
  • 是的,这就是我所说的反转。如果将名字、中间名和姓氏分成不同的列,这可能会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2021-02-02
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多