Сопоставление неточных названий компаний в Java

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

Например, моя база данных может содержать компанию с названием "A. B. Widgets & Co Ltd." в то время как мои входящие данные могут ссылаться на «AB Widgets Limited», «A.B. Widgets and Co» или «AB Widgets».

Некоторые слова в названии компании (виджеты A B) более важны для сопоставления, чем другие (Co, Ltd, Inc и т. д.). Важно избегать ложных совпадений.

Количество компаний достаточно мало, чтобы я мог сохранить в памяти карту их названий, т.е. У меня есть возможность использовать Java, а не SQL, чтобы найти правильное имя.

Как бы вы сделали это на Java?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
7 751
8

Ответы 8

Ваша база данных может поддерживать использование регулярных выражений (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.

Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением.

antony.trupe 31.08.2012 06:15

Спасибо за отзыв, мой ответ больше похож на ответ.

Andrew Swan 31.08.2012 08:49

Взгляните на Lucene. Это библиотека Java для полнотекстового поиска с открытым исходным кодом и возможностью «почти совпадения».

Вы можете максимально стандартизировать форматы в своей БД / карте и вводе (т.е. преобразовать в верхний / нижний регистр), а затем использовать Левенштейн (править) метрика расстояния из динамического программирования для оценки ввода по всем вашим известным именам.

Затем вы можете попросить пользователя подтвердить совпадение, и, если ему это не нравится, дать ему возможность ввести это значение в ваш список известных имен (если подумать - это может быть слишком большой властью, чтобы дать пользователю ... .)

Я только недавно узнал об этом алгоритме, около 6 месяцев назад, но с тех пор он служил мне невероятно хорошо! Кроме того, это заставляет меня выглядеть умным, когда я говорю: «О, просто используйте расстояние Левенштейна». :-)

Aidos 27.11.2008 14:46

Я бы сделал 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 различных алгоритмов (включая алгоритмы Левенштейна, Яро-Винклера, Монжа-Элкана и т. д. ), а его код достаточно хорошо структурирован, чтобы вам не нужно было глубоко понимать всю логику, но вы можете начать использовать его за считанные минуты.

(Кстати, я не являюсь автором библиотеки, так что спасибо ее создателям.)

Другие вопросы по теме