2014-02-13 4 views
0

Я реализую объединение объектов JSONs, извлеченных из нормализованной базы данных компании, и из неструктурированных данных из Twitter, на основе полей имени и местоположения. Для пояснения это соединение выполняется с помощью MapReduce, поэтому нет другого способа, кроме как вручную выполнить условие соединения. Очевидная реализация заключается в объединении и сравнении этих полей с методом Java String.equals. Рассмотрим эти два JSONs, первый извлеченный из нормированных данных и второй из Twitter:Строковые точные и потенциальные совпадения

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny "} 
{"location":"RiodeJaneiro;Brasil","name":"JoaoPaulo-Forny!"} 

условие объединения ниже, могут найти соответствия между теми же именами и адресом, который содержит те же буквы в том же порядке, в связи с использованием регулярного выражения, чтобы исключить все пробелы и другие символы, чем буквы.

obj1.getJoinKey().toLowerCase().replaceAll("[^A-Za-z]", "") 
.equals(ob2.getJoinKey().toLowerCase().replaceAll("[^A-Za-z]", "")) 

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

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny de Melo"} 
{"location":"Rio de Janeiro","name":"Joao Paulo Forny de Melo"} 

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny de Melo"} 
{"location":"Rio de Janeiro - Brasil","name":"Joao Forny"} 

{"location":"Rio de Janeiro - Brasil","name":"Joao Paulo Forny de Melo"} 
{"location":"Brasil - Rio de Janeiro","name":"Joao Paulo Forny de Melo"} 

Вопрос в том, какие решения могут быть использованы для поиска потенциальных совпадений на основе трех условий, описанных выше?

+1

Возможно, вы захотите посмотреть на что-то вроде lucene. – Taylor

+1

Вы всегда можете рассчитать их расстояние [Levenshtein] (http://en.wikipedia.org/wiki/Levenshtein_distance), которое является мерой «расстояния» между двумя строками. – Sinkingpoint

ответ

1

С трех конкретных примеров, которые вы дали:

  1. Одно место содержит только город; в другом - город и государство/страна. В этом случае вы можете разбить строку на две части, разделенные любым не-алфавитно-цифровым символом без пробелов, и нормализовать интервал (возможно, удалив его). Например, «Brasil, Rio de Janiero» станет «Brasil» и «RiodeJaniero». Затем вы можете проверить, соответствует ли хотя бы одна подстрока из одного из местоположений одной из подстрок из одного из других мест. Чтобы предотвратить совпадение страны, вы могли бы создать список всех стран и исключить эти матчи. Есть только пара сотен стран, хотя я уверен, что для многих из них несколько альтернативных написаний в зависимости от языка. Но если вы этого не сделаете, вы, в конечном итоге, сравните, скажем, «Сан-Паулу - Бразиль» и «Рио-де-Жанейро-Бразиль».

  2. Одно имя может не иметь ни средней, ни фамилии. Я склонен думать, что вам нужно будет иметь хотя бы первое и фамильное имя, чтобы соответствовать вообще. Представьте, сколько Joaos существует в Бразилии или Португалии. Поэтому снова в этом случае сложите строки в подстроки и убедитесь, что по крайней мере две части соответствуют друг другу. Однако вам понадобится другой список исключений с такими вещами, как «von» и «de» и «O» и т. Д.

  3. Государство и страна обращены. Это только частный случай № 1 выше. У вас будет только подстрока, а не одна.

Надеюсь, это поможет. Я не уверен, что это полное решение, но, надеюсь, по крайней мере, это может привести вас к пути к полному решению.

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