2

我对 OpenRefine 有疑问。我正在添加一个基于 url 的新列,并从那里调用 API 以从受控词汇表 (AAT) 中获取一些术语。我解析结果并获得一个多值单元格,例如:

http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300191265||dust bags::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300041368||sandpaper aquatints::http://vocab.getty.edu/aat/300041368||sandpaper aquatints

我有当前结构的地方:

URI||Corresponding_TERM::URI||Corresponding_TERM

等等

我现在需要选择其中一条记录。我的解决方案是使用
value.split("::")[0]
以选择我想要的元素。
不幸的是,这种解决方案有非常明显的缺点,因为数组中元素的顺序不是恒定的,所以如果第一个元素 [0] 对一条记录来说是正确的,那么它可能不是下一条记录。

为了更好地解释自己,我现在有这种结构

-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus                |  
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 2 | Drypoints      | uri||term3::uri||term4::           |
| 3 | Woodcut        | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------  

我需要将 term1 与 Aquatints 关联,将 term 4 与 Drypoints 关联,将 term 7 与 Woodcut 关联。

我怎样才能做到这一点?一个解决方案可能是使用 facet 和大量的手动工作,但也许有更好的解决方案?去每条记录怎么样,如果 ID = 1 他们应该使用 term1,如果 ID=2 应该使用 term 4 等等。这可能吗?我真的不知道如何使用另一列的值作为变量来确定操作的结果。cell.cross 会有所帮助,但如果我需要将数据拆分为两个文件,并且在我看来这不是一个合适的解决方案..

4

2 回答 2

2

所以我不确定我是否正确理解了你的问题,但可以“根据另一列中的变量选择值”。

如果你有:

-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus                |  
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 1 | Aquatints      | uri||term1::uri||term2::           | 
| 2 | Drypoints      | uri||term3::uri||term4::           |
| 3 | Woodcut        | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------

然后,如果您将“Term_From_Thesaurus”列拆分为一个数组,那么您可以使用“ID”列中的数字来选择数组中的相关条目。但是,请注意,要使其正常工作,您需要将 ID 列中的数字转换为数字类型(如果还没有的话)。在此示例中,我假设 ID 列中的数字以字符串而不是数字开头。

所以公式:

value.split("::")[cells.ID.value.toNumber()-1]

将在第一行和第二行中找到第一个值,在第三行中找到第二个值,在第 4 行中找到第 4 项。这在此处进行了说明:

说明上面给出的公式的屏幕截图

公式分解如下:

  • value.split("::") = 将 URI/Term 对的列表拆分为一个数组
  • cells.ID.value.toNumber() = 将ID列中的值转换为数字类型
  • -1 = 因为数组成员从零开始计数

希望这很清楚

于 2017-05-22T09:16:44.063 回答
1

如果您必须根据您对该领域的了解自己选择正确的术语,我看不到如何使操作自动化。这是一种解决方案,可将“分类”列中的每个术语与 API 返回的术语中与其最相似的术语进行匹配。

使用的 Grel 公式是:

value.fingerprint() == cells.terms.value.replace(/\(.+\)/,'').fingerprint()

在此处输入图像描述

于 2017-05-21T22:26:48.370 回答