2016-05-20 1 views
2

У меня есть два набора данных:Openrefine: cross.cell для похожих, но не идентичных значений

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

    Gaule Цизальпинской (провинция ромэн)

    Gaule Belgique

    Gaule, Histoire

    Gaule

    ecc.

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

    Gaule | 1DDF

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

+0

Являются ли беспорядочные данные такими же последовательными, как предложено здесь (ключевая строка всегда первая в ячейке) или messier в действительности? –

+0

Всегда в ячейке –

+1

btw reconcile-csv использует коэффициент Dice для нечеткого соответствия https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Dice%27s_coefficient - это будет работать с неточными совпадениями, но намного дольше строки в ваших беспорядочных данных приведут к низкой оценке сходства с использованием этого алгоритма –

ответ

2

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

В «чистом» использовании проекта «Добавить столбец на основе этой колонки» в столбце «Название страны», и в Grel преобразования использования:

value.fingerprint() 

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

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

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

Первая часть этого "value.split (/ [. \ s, -()] /)" разбивает строку на отдельные слова (с использованием пространства, запятая, fullstop, открытой или закрытой скобкой в ​​качестве разделителя). Затем «[0]» берет первую строку (так что первое слово в ячейке), затем снова использует алгоритм отпечатка пальца.

Теперь у вас есть столбцы в каждом из проектов, которые должны соответствовать конкретному содержимому ячейки. Вы можете использовать это для поиска между двумя проектами.

Это не будет полностью идеальным - например, если у вас есть названия стран, которые состоят из нескольких слов, это не сработает. Однако вы могли бы добавить некоторые дополнительные ключевые столбцы в «грязный» проект, который использует первые 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/#!forum/openrefine

+0

Вау, я бы никогда не подошел к чему-то подобному. Это не идеально, но, по крайней мере, это что-то, спасибо вам большое. –

 Смежные вопросы

  • Нет связанных вопросов^_^