Интеллектуальное сравнение строк
Я ищу библиотеку/класс, которая позволяет осуществлять интеллектуальное сравнение двух строк. В лучшем случае это даст в результате процент того, как две строки одинаковы. Я сравниваю названия компаний, адреса, которые записываются в разные хранилища, таким образом, имея много ошибок или несоответствий в именах.
Примеры строк для сравнения:
"Good Company Ltd." vs. "GoodCompany"
"Baker Street 2" vs. "Baker Str. 2"
Если я получаю результат в процентах от alikeness, то это может быть вход для интеллектуального слияния таких данных.
Знаете ли вы хорошие библиотеки, которые позволяли бы сравнивать такие умные строки?
Ответы
Ответ 1
Левенштейн не подходит в этом случае. "Good Company Ltd" и "GoodCompany", если они были обрезаны, имеют дистанцию = 3, тогда как "Good Company Ltd" и "Food Company Ltd" имеют дистанцию 1, но совершенно иное значение. Я предлагаю алгоритм Metaphone или Double Metaphone.
Используя онлайн-сопоставление метафонов, выполните следующие действия:
Good Company Ltd = KTKMPNLTT
GoodCompany = KTKMPN
Food Company Ltd = FTKMPNLTT
GoodCompanyLLC = KTKMPNLK
Таким образом, вы знаете, что GoodCompany
, Good Company Ltd
и GoodCompanyLLC
схожи, а Food Company
с ошибкой или полностью не связаны (KTKMPN
содержится как в KTKMPNLTT
, так и KTKMPNLK
, но не в FTKMPNLTT
).
Посмотрите здесь для сравнения других алгоритмов.
Ответ 2
Возможно, вы захотите найти Levenshtein Distance. Он показывает, сколько символов вставляет/удаляет и заменяет символы, чтобы сделать две строки равными.
Вот сообщение о библиотеках на С#, которые реализуют Levenshtein Distance и другие алгоритмы сравнения текста: Библиотека .NET для текстовых алгоритмов?.
Однако я думаю, вам придется использовать некоторую комбинацию методов, потому что использование Levenshtein скажет вам, что "Good Company Ltd." больше похожа на "Bad Company Ltd." чем на "GoodCompany".
Возможно, вам придется выполнить некоторую предварительную обработку, расширив 'str.' на "улицу" и удаление "Ltd." как "бессмысленное" слово в терминах сравнения строк.
ОБНОВЛЕНИЕ 1
Франческо Де Лиси предлагает использовать фонетические алгоритмы. Похоже, они лучше подходят для сравнения имен с ошибками. Тем не менее вам нужно разделить адреса на фонетические/нефонетические части (например, на номера зданий) и сравнить их отдельно.
ОБНОВЛЕНИЕ 2
Что касается сравнения адресов, этот пост предлагает использовать Google Maps API для этой цели, а в другой статье обсуждается синтаксический анализ адресов. Я предполагаю, что Google может создавать надежные результаты, потому что у них есть база данных уличных адресов, где они могут найти правильное название орфографии. Без списка правильных названий улиц/компаний вы можете столкнуться с каким-то странным именем, которое является неправильным, однако многие разные правильные имена будут похожи на него.
Ответ 3
То, что вы ищете, это расстояние Левенштейна (Wikipedia):
... расстояние Левенштейна - это строковая метрика для измерения разницы между двумя последовательностями. Неформально расстояние Левенштейна между двумя словами - это минимальное количество односимвольных изменений (вставка, удаление, подстановка), необходимых для изменения одного слова в другое