2

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

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

  • 包含中间名,例如 Jon Snow vs Jon Targaryen Snow
  • 包含第二个姓氏,例如 Jon Snow vs Jon Targaryen-Snow
  • 昵称/名字的缩写,例如 Jonathon Snow vs Jon Snow
  • 姓名颠倒,例如 Jon Snow vs Snow Jon
  • 拼写错误/错别字/变体:例如 Samual/Samuel、Monica/Monika、Rafael/Raphael

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

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

4

2 回答 2

1

我会多次传球。

"Jon .* Snow"- 中间名字

"Jon .*Snow"- 第二个姓氏

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

"Snow Jon"- 逆转(呃)

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

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

于 2017-07-28T04:06:13.913 回答
0

合成器包(https://cran.r-project.org/web/packages/synthesisr/index.html)可能会有所帮助。它使用 R 代码来模仿fuzzywuzzy Python 包和fuzzywuzzyR 中的一些模糊匹配功能。从fuzzywuzzy 中获取了类似的不同指标;较低的分数意味着更大的相似性。这些方法可以通过不同的方式访问,如下所示。

具体来说,在这种情况下,“标记”函数可能很有用,因为字符串由空格标记,然后按字母顺序排列以处理反转等情况。

library(synthesisr)

fuzz_m_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_m_ratio")

fuzz_partial_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_partial_ratio")

fuzz_token_sort_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_token_sort_ratio")

fuzz_token_set_ratio("this is a test", "this is a test!")
fuzzdist("this is a test", "this is a test!", method = "fuzz_token_set_ratio")
于 2022-02-01T17:58:49.923 回答