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/.