【发布时间】:2015-03-09 21:25:18
【问题描述】:
我有一个非常大的数据库,其名称如下:
names <- c("William Gates", "Bill Gates", "Gates, William H. III",
"Gates, William III", "William H Gates", "William H. Gates",
"Carlos Slim Helu & family", "Carlos Slim Helu",
"Carlos Slim & Family", "Carlos Slim")
我想像这样自动“清理”:
new_names <- c("William Gates", "William Gates", "William Gates",
"William Gates", "William Gates", "William Gates",
"Carlos Slim Helu & family", "Carlos Slim Helu & family",
"Carlos Slim Helu & family", "Carlos Slim Helu & family")
我(任意)使用名称的第一次出现来替换它的其他变体。
在这个例子中,names 是一个长度为 10 的字符向量。我想创建一个“部分匹配值”的10 X 10 矩阵。该矩阵将存储部分匹配范围的 0 到 1 之间的“度量”。例如,将names[1] 与names[1] 进行比较会产生完美匹配,因此值为1;比较names[1] 和names[2] 会得到类似5/12 = 0.41667 的结果,这反映了Gates 对两个字符串都是通用的并且(忽略空字符串)names[1] 有12 个字母;按照同样的逻辑,将names[2] 与names[1] 进行比较会得到类似5/9 = 0.55556 的结果。
我可能会忽略大小写(family 和 Family 将是完美匹配),只关注匹配子字符串(但如果有人对如何匹配有意见,比如 Slim 和 Silm,那也很好。
作为第二步,我将创建一个最大值的三角矩阵(在示例中,值 5/9 = 0.55556)。然后,我将使用此矩阵来观察情况并选择一个阈值,例如 0.95,高于该阈值的字符串被替换,逐渐降低阈值,直到我对数据已被清理感到满意为止。
我希望以前有人做过这种事情,并且有人能够帮助我开始。我已经阅读了 Paul Murrell 的 compare 包,并希望它是一个很好的工具,但是我没有看到太多可以很容易适应的示例,所以如果您知道教程或包以外的示例小插图,请给我指点。
我确实意识到一个好问题需要更多的代码,我很抱歉不能提供太多。虽然我对 R 相当熟悉,但我并不熟悉字符串匹配。如果有人指点我开始的某个地方,我可以尝试用一些示例代码重新表述我的问题。
【问题讨论】: