Соответствие неточным названиям компаний на Java - PullRequest
7 голосов
/ 27 ноября 2008

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

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

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

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

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

Ответы [ 8 ]

3 голосов
/ 02 марта 2015

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

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

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

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

3 голосов
/ 27 ноября 2008

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

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

2 голосов
/ 27 ноября 2008

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

2 голосов
/ 27 ноября 2008

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

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

1 голос
/ 27 ноября 2008

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

0 голосов
/ 20 апреля 2010

голосование против 1 голос против

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

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

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

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

0 голосов
/ 27 ноября 2008

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

0 голосов
/ 27 ноября 2008

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

...