Я не мог придумать отличный способ сделать это, но учитывая подстроку, которую вы хотите сопоставить между двумя файлами, всегда является первым делом в «грязной» строке, и если вы хотите сделать это это в 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
Являются ли беспорядочные данные такими же последовательными, как предложено здесь (ключевая строка всегда первая в ячейке) или messier в действительности? –
Всегда в ячейке –
btw reconcile-csv использует коэффициент Dice для нечеткого соответствия https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Dice%27s_coefficient - это будет работать с неточными совпадениями, но намного дольше строки в ваших беспорядочных данных приведут к низкой оценке сходства с использованием этого алгоритма –