У меня есть база компаний. Мое приложение получает данные, которые ссылаются на компанию по имени, но имя может не точно соответствовать значению в базе данных. Мне нужно сопоставить входящие данные с компанией, к которой они относятся.
Например, моя база данных может содержать компанию с названием "A. B. Widgets & Co Ltd." в то время как мои входящие данные могут ссылаться на «AB Widgets Limited», «A.B. Widgets and Co» или «AB Widgets».
Некоторые слова в названии компании (виджеты A B) более важны для сопоставления, чем другие (Co, Ltd, Inc и т. д.). Важно избегать ложных совпадений.
Количество компаний достаточно мало, чтобы я мог сохранить в памяти карту их названий, т.е. У меня есть возможность использовать Java, а не SQL, чтобы найти правильное имя.
Как бы вы сделали это на Java?




Ваша база данных может поддерживать использование регулярных выражений (regex) - см. Ниже некоторые руководства по Java - вот ссылка на документацию MySQL (в качестве примера):
http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp
Вы, вероятно, захотите сохранить в базе данных довольно сложное регулярное экспресс-заявление для каждой компании, которое охватывает варианты написания, которые вы можете ожидать, или подэлементы названия компании, которые вы хотели бы взвесить как значимые.
Вы также можете использовать библиотеку регулярных выражений в Java
JDK 1.4.2
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
JDK 1.5.0
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html
Использование регулярных выражений в Java
http://www.regular-expressions.info/java.html
Объяснение API Java Regex http://www.sitepoint.com/article/java-regex-api-explained/
Вы также можете проверить, поддерживает ли ваша база данных возможности Soundex (например, см. Следующую ссылку на MySQL)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
Вы можете использовать алгоритм LCS для их оценки.
Я делаю это в моем Фотоальбом, чтобы упростить отправку фотографий по электронной почте и правильно отнести их к категориям безопасности.
Вы можете использовать Lucene для индексации своей базы данных, а затем запросить индекс Lucene. Есть несколько поисковых систем, построенных на основе Lucene, в том числе Solr.
Спасибо за отзыв, мой ответ больше похож на ответ.
Взгляните на Lucene. Это библиотека Java для полнотекстового поиска с открытым исходным кодом и возможностью «почти совпадения».
Вы можете максимально стандартизировать форматы в своей БД / карте и вводе (т.е. преобразовать в верхний / нижний регистр), а затем использовать Левенштейн (править) метрика расстояния из динамического программирования для оценки ввода по всем вашим известным именам.
Затем вы можете попросить пользователя подтвердить совпадение, и, если ему это не нравится, дать ему возможность ввести это значение в ваш список известных имен (если подумать - это может быть слишком большой властью, чтобы дать пользователю ... .)
Я только недавно узнал об этом алгоритме, около 6 месяцев назад, но с тех пор он служил мне невероятно хорошо! Кроме того, это заставляет меня выглядеть умным, когда я говорю: «О, просто используйте расстояние Левенштейна». :-)
Я бы сделал LCS, игнорируя пробелы, знаки препинания, регистр и варианты «co», «llc», «ltd» и т. д.
vote up 1 vote down
Вы можете использовать алгоритм LCS для их оценки.
Я делаю это в своем фотоальбоме, чтобы упростить отправку фотографий по электронной почте и правильно отнести их к категориям безопасности.
* LCS code
* Example usage (guessing a category based on what people entered)
чтобы быть более точным, лучше, чем наименьшая общая подпоследовательность, наименьшая общая подстрока должна быть более точной, поскольку важен порядок символов.
Хотя эта ветка немного устарела, я недавно провел исследование эффективности метрик расстояния между строками для сопоставления имен и наткнулся на эту библиотеку:
https://code.google.com/p/java-similarities/
Если вы не хотите тратить много времени на реализацию алгоритмов строкового расстояния, я рекомендую попробовать в качестве первого шага, уже реализовано ~ 20 различных алгоритмов (включая алгоритмы Левенштейна, Яро-Винклера, Монжа-Элкана и т. д. ), а его код достаточно хорошо структурирован, чтобы вам не нужно было глубоко понимать всю логику, но вы можете начать использовать его за считанные минуты.
(Кстати, я не являюсь автором библиотеки, так что спасибо ее создателям.)
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением.