Openrefine:cross.cell 用于相似但不相同的值
Openrefine: cross.cell for similar but not identical values
我有两个数据集:
一个数据集有国家名称,但像
这样的脏东西
Gaule Cisalpine(省长叶莴苣)
比利时高乐
高卢,历史
高卢
ecc.
第二个数据集有两列,其中包含国家名称(干净)和类似
的代码
高卢 | 1DDF
有没有办法将 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
我有两个数据集:
一个数据集有国家名称,但像
这样的脏东西Gaule Cisalpine(省长叶莴苣)
比利时高乐
高卢,历史
高卢
ecc.
第二个数据集有两列,其中包含国家名称(干净)和类似
的代码高卢 | 1DDF
有没有办法将 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