使用 OpenRefine 从另外两个 table 中创建映射 table

Using OpenRefine to create a mapping table from two other tables

我有以下用例,OpenRefine 似乎是一个很好的解决方案。我的数据库中有一个现有的 "dirty" 产品 table,如下所示:

id  name
51  Product A
52  product-a
53  product B
54  productb
55  produtc
56  productc

我有一个新的 "clean" 产品 table 看起来像这样:

id  name
1   Product A
2   Product B
3   Product C

我想使用 OpenRefine 的集群生成映射文件,帮助我将产品从旧 table 映射到新 table:

id  name        old_id
1   Product A    51
1   Product A    52
2   Product B    53
2   Product B    54
3   Product C    55
3   Product C    56

但我不能完全让 OpenRefine 做我想做的事。关于如何实现这一点有什么建议吗?

聚类功能仅限于单个列以在该列中查找相似的字符串。

OpenRefine 还没有以您的用例呈现的方式跨 2 个或更多表或项目(模糊连接)的字符串相似性函数。为此,您将不得不使用其他工具。我见过人们使用并表示对模糊连接表示满意的一个常用工具是 MS PowerBI(桌面版是免费的,但对关系和导出有限制,但专业版每月只需 10 美元,并且可以随时取消)但是如果你想要完全免费的东西然后一些 R 包执行此操作,其中之一是 https://www.rdocumentation.org/packages/fuzzyjoin/versions/0.1.4

在 OpenRefine 中,我们完全希望将来允许跨 Projects/datasets 的模糊连接,它在我们的问题列表中,但我们只是没有资金来实现它以及我们的其他大量功能知道用户希望看到。

正如已经指出的那样,没有直接的方法可以实现这一点,但是借助支持 tables 和交叉函数的帮助,您可以获得所需的结果:

  1. 你从脏的 table 和干净的 table 中取出列 "name",然后将它们组合起来。此时不要担心 id。
  2. 将它们导入 OpenRefine(例如作为项目 "product names")
  3. 复制列 "name"(目前唯一的列)并将新列命名为 "name_new"。
  4. 集群 "name_new" 列并将所有旧名称替换为正确的新名称。此时可能需要进行一些手动调整。 您的结果现在应该如下所示:

    name        name_new
    Product A   Product A
    product-a   Product A
    product B   Product B
    productb    Product B
    produtc     Product C
    productc    Product C
    Product A   Product A
    Product B   Product B
    Product C   Product C
    
  5. 将脏的 table 导入为 "products",将干净的 table 导入为 "products clean"。
  6. 在项目"products"中使用

    转换列"name"

    value.cross("product names","name").cells["name_new"].value[0]

  7. 将列 "id" 重命名为 "old_id"

  8. 使用

    添加基于 "name" 的新列

    value.cross("products clean","name").cells["id"].value[0]

    并将其保存为"id"。 table "products" 现在具有所需的结构。

希望对您有所帮助。