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

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

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

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

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

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

8 ответов

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

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

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

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

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

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

Вы можете использовать алгоритм LCS, чтобы оценить их.

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

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

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

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

Ваша база данных может поддерживать использование регулярных выражений (регулярное выражение) - см. Ниже некоторые руководства по Java - вот ссылка на документацию MySQL (в качестве примера):

http://dev.mysql.com/doc/refman/5.0/en/regexp.html

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

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

Java Regex API объяснил
http://www.sitepoint.com/article/java-regex-api-explained/

Вы также можете посмотреть, поддерживает ли ваша база данных возможности Soundex (например, см. Следующую ссылку на MySQL)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

голосовать за 1 голосовать за

Вы можете использовать алгоритм LCS, чтобы оценить их.

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

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

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

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