【发布时间】:2019-02-26 23:06:34
【问题描述】:
我有一个从 Zotero 导出的 CSV 文件,其中包含我的图书馆条目的元数据。我知道它包含很多重复项,但要摆脱它们并不容易:
-
并非所有标题相似的项目实际上都是重复的,例如
| Year | Author | Title | +------+-------------------------------+--------------+ | 2016 | Jones, Erik | Book Reviews | | 2016 | Hassner, Pierre; Jones, Erik | Book Reviews | | 2010 | Adams, Laura L.; Gagnon, Chip | Book Reviews | -
并非所有实际上相似的项目都具有 100% 相同的元数据字符串,例如
| Author | Title | +---------------+-----------------------------------------------+ | Tichý, Lukáš; | Can Iran Reduce EU Dependence on Russian Gas? | | Tichy, L.; | "can iran reduce eu dependence onrussian gas" |
这是一个极端的例子(差异通常不会那么大),但正如您所见,预清洗并不能完全解决这个问题;所以我们的想法是消除在两列以上包含 相似 值的行 - 例如“作者”和“标题”。
到目前为止我尝试过/浏览过的内容:
- OpenRefine - 对它几乎不熟悉,因此无法想出或找到任何可行的方法。
- Excel fuzzy lookup extension - 并没有真正按照我需要的方式工作。
- Python - 再说一次,我不擅长这门语言;我找不到任何相关的解决方案/指南。
- R:尝试了一些想法:
首先在“作者”列的for循环中使用agrep来获取重复行的索引;然后对“标题”列执行相同的操作;然后比较向量并对值重合的行进行重复数据删除。不用说,我无法超越第 1 步:
titles <- unlist(corpus$"Title")
for (i in 1:length(titles)){
Title_dupe_temp <- agrep(titles[i], titles[i+1:length(titles)],
max.distance = 1, ignore.case = TRUE, fixed = FALSE)
Title_dupes[i] <- paste(i, Title_dupe_temp, sep = " ")
}
结果(几乎)完全是胡言乱语;另外我收到警告消息:
In Title_dupes[i] <- paste(i, Title_dupe_temp, sep = " ") :
number of items to replace is not a multiple of replacement length
我还阅读了fuzzywuzzyR 文档,但没有找到任何有用的功能。
最后,我尝试了RecordLinkage 包。尽管如此,我还是无法超越基础知识。 The documentation 相当沉重,对所有事情都不明确;指南很少,我找到的指南(例如this)使用已准备好身份向量的示例数据集 - 所以我无法弄清楚如何在我的数据上复制它。
所以在这一点上,我不在乎是否在 OpenRefine/R/Py/SQL/whatever 中执行,只是以任何方式执行。
【问题讨论】:
标签: r duplicates record-linkage