Openrefine:cross.cell 用于相似但不相同的值

Openrefine: cross.cell for similar but not identical values

我有两个数据集:

有没有办法将 cell.cross 与 value.contains() 一起使用?我尝试使用 reconcile-csv 但它无法正常工作(它只匹配确切的)。

我一直想不出一个很好的方法来做到这一点,但考虑到您想要在两个文件之间匹配的子字符串始终是 'messy' 字符串中的第一个,如果您想在 OpenRefine 中执行此操作,我可以通过在每个项目中创建一个 'match' 列来进行交叉匹配来找到一种可行的方法。

在 'clean' 项目中,在 'Country name' 列上使用 'Add column based on this column',并在 GREL 转换中使用:

value.fingerprint()

'fingerprint' 转换与使用键 collision/fingerprint 进行聚类时使用的转换相同,基本上我只是在这里使用它来消除国家/地区名称之间的任何细微差异(例如upper/lower 大小写或特殊字符)

然后在 'messy' 项目中再次使用 'Add column based on this column' 基于脏 'name of country' 列创建一个新列,但在这种情况下使用 GREL 转换,例如:

value.split(/[\s,-\.\(\)]/)[0].fingerprint()

此 "value.split(/[\s,-.()]/)" 的第一部分将字符串拆分为单个单词(使用 space、逗号、句号、左括号或右括号作为分隔符)。然后 '[0]' 获取第一个字符串(即单元格中的第一个单词),然后再次使用指纹算法。

现在您在每个项目中都有列,这些列应该与确切的单元格内容匹配。您可以使用它在两个项目之间进行查找。

这不会是完全理想的——例如,如果您有一些由多个词组成的国家/地区名称,它就不会起作用。但是,您可以向 'messy' 项目添加一些额外的键列,这些键列使用前 2、3、4 个字符串等,而不仅仅是此处给出的第一个。

例如

filter(value.split(/[\s,-\.\(\)]/),v,isNonBlank(v)).get(0,2).join(" ").fingerprint()

filter(value.split(/[\s,-\.\(\)]/),v,isNonBlank(v)).get(0,3).join(" ").fingerprint()

等(我在这里做了更多工作以确保忽略空白条目 - get() 命令是获取不同字数的关键位)。

我猜想大多数国家/地区名称的长度将只有几个字,因此只需要几列。

到目前为止,我还没有想出更好的方法。如果我想出其他任何东西,我会 post 在这里再写一些。您也可以尝试在 OpenRefine 论坛上提问 https://groups.google.com/forum/#!forum/openrefine