Openrefine: cross.cell для похожих, но не идентичных значений

У меня есть два набора данных:

  • один набор данных имеет названия стран, но грязные, такие как

    Gaule Cisalpine (провинция Ромейн)

    Gaule Belgique

    Gaule, Histoire

    Gaule

    ЕСС.

  • второй набор данных имеет два столбца с названиями стран (чистый) и с кодом

    Gaule | 1DDF

Есть ли способ использовать cell.cross с value.contains()? Я пытался использовать concile-CSV, но он не работал должным образом (он соответствует только точные).

1 ответ

Решение

Я не смог придумать отличный способ сделать это, но учитывая подстроку, которую вы хотите сопоставить между двумя файлами, всегда первое, что есть в "грязной" строке, и если вы хотите сделать это в OpenRefine, Я могу увидеть способ, который мог бы работать, создав столбец "сопоставления" в каждом проекте для сопоставления.

В "чистом" проекте используйте "Добавить столбец на основе этого столбца" в столбце "Название страны", а в преобразовании GREL используйте:

value.fingerprint()

Преобразование "отпечаток пальца" такое же, как и при кластеризации с использованием столкновения клавиш / отпечатка пальца, и в основном я просто использую его здесь, чтобы избавиться от любых незначительных различий между названиями стран (например, заглавными или строчными буквами или специальными символами).

Затем в "грязном" проекте создайте новый столбец на основе грязного столбца "имя страны", снова используя "Добавить столбец на основе этого столбца", но в этом случае используйте преобразование GREL что-то вроде:

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

Первая часть этого "value.split(/[\s,-.()]/)" Разбивает строку на отдельные слова (используя в качестве разделителя пробел, запятую, полную точку, открытую или закрытую скобку). Затем '[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() является ключевым битом для получения разного количества слов).

Я предполагаю, что названия большинства стран будут состоять всего из нескольких слов, поэтому потребуется всего несколько столбцов.

Я не смог придумать лучший подход до сих пор. Я выложу еще немного здесь, если я придумаю что-нибудь еще. Вы также можете попробовать задать вопрос на форуме OpenRefine https://groups.google.com/forum/.

Другие вопросы по тегам