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

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

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

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

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

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


person Sophie Gage    schedule 27.11.2008    source источник


Ответы (8)


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

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

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

Хотя этот поток немного устарел, я недавно провел исследование эффективности метрик расстояния между строками для сопоставления имен и наткнулся на эту библиотеку:

https://code.google.com/p/java-similarities/

Если вы не хотите тратить много времени на реализацию алгоритмов строкового расстояния, я рекомендую попробовать это в качестве первого шага, уже реализовано ~ 20 различных алгоритмов (включая алгоритмы Левенштейна, Яро-Винклера, Монжа-Элкана и т. Д. ), а его код достаточно хорошо структурирован, чтобы вам не нужно было глубоко понимать всю логику, но вы можете начать использовать его за считанные минуты.

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

person Zsolt Katona    schedule 02.03.2015

Вы можете использовать алгоритм LCS для их оценки.

Я делаю это в моем фотоальбоме, чтобы упростить отправку фотографий по электронной почте и обеспечить их безопасность. категории правильно.

person Dustin    schedule 27.11.2008

Я бы сделал LCS, игнорируя пробелы, знаки препинания, регистр и варианты слов «co», «llc», «ltd» и т. Д.

person Adam Jaskiewicz    schedule 27.11.2008

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

person Nerdfest    schedule 27.11.2008

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

person Kelvin Meeks    schedule 27.11.2008

проголосовать 1 голос против

Вы можете использовать алгоритм LCS для их оценки.

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

* LCS code
* Example usage (guessing a category based on what people entered)

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

person charpentier damien    schedule 19.04.2010

Вы можете использовать Lucene для индексации своей базы данных, а затем запросить индекс Lucene. Есть несколько поисковых систем, построенных на основе Lucene, в том числе Solr.

person Andrew Swan    schedule 27.11.2008
comment
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением. - person antony.trupe; 31.08.2012
comment
Спасибо за отзыв, мой ответ больше похож на ответ. - person Andrew Swan; 31.08.2012