Я реализую объединение объектов 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"}
Вопрос в том, какие решения могут быть использованы для поиска потенциальных совпадений на основе трех условий, описанных выше?
Возможно, вы захотите посмотреть на что-то вроде lucene. – Taylor
Вы всегда можете рассчитать их расстояние [Levenshtein] (http://en.wikipedia.org/wiki/Levenshtein_distance), которое является мерой «расстояния» между двумя строками. – Sinkingpoint