2013-05-23 3 views
15

Я ищу библиотеку/класс, который позволяет удобно сравнивать две строки. В лучшем случае это даст в результате процент того, как две строки одинаковы. Я сравниваю названия компаний, адреса, которые записываются в разные хранилища, таким образом, имея много ошибок или несоответствий в именах.Смарт-сравнение строк

Примеры строк для сравнения:

"Good Company Ltd." vs. "GoodCompany" 
"Baker Street 2" vs. "Baker Str. 2" 

Если я получаю результат в процентах alikeness, чем это может быть вход для смарт слияния таких данных.

Знаете ли вы хорошие библиотеки, которые позволили бы сравнить такие умные строки?

+4

Попробуйте взглянуть на это: http://stackoverflow.com/questions/2344320/comparing-strings-with-tolerance – Justin

+1

Не могли бы вы рассказать нам, какой процент вы ожидаете получить за каждое из этих двух строк сравнения ? – jszigeti

+0

Будет ли «ВеликоеОграничение» 'иметь какую-либо« алчность »для« GoodCompany »? Вы пытаетесь сравнить смысл? Как одинаково «принимать» и «кроме», которые похожи, но имеют разные значения? Что относительно '' country fair ''и' 'равно и справедливо'' или '' четыре свечи ''и' 'fork handles" '? Есть ли элемент НЛП или это более простой алгоритм? Вы хотите «Значки одинаковые», «Звучит одинаково» или «Выглядит одинаково»? – Jodrell

ответ

16

Левенштейн не подходит в данном случае. «Good Company Ltd» и «GoodCompany», если они были обрезаны, имеют дистанцию ​​= 3, тогда как «Good Company Ltd» и «Food Company Ltd» имеют дистанцию ​​1, но совершенно иное значение. Я предлагаю алгоритм Metaphone or Double Metaphone.

Использование online metaphone comparer результаты:

Good Company Ltd = KTKMPNLTT 
GoodCompany = KTKMPN 
Food Company Ltd = FTKMPNLTT 
GoodCompanyLLC = KTKMPNLK 

Таким образом, вы знаете, что GoodCompany, Good Company Ltd и GoodCompanyLLC похожи, в то время как Food Company написано с ошибками или вообще не связаны между собой (KTKMPN содержится как в KTKMPNLTT и KTKMPNLK, но не в FTKMPNLTT).

Посмотрите here для сравнения других алгоритмов.

+0

Хорошие ссылки! В прошлый раз, когда я слышал о фонетическом сравнении, он работал только для языков с латинскими буквами. – Artemix

14

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

Это сообщение о библиотеках в C#, которые реализуют Levenshtein Distance и другие алгоритмы сравнения текста: .NET library for text algorithms?.

Однако я думаю, вам придется использовать некоторую комбинацию методов, потому что использование Levenshtein скажет вам, что «Good Company Ltd.» больше похожа на «Bad Company Ltd.» чем в «GoodCompany».

Возможно, вам придется выполнить некоторую предварительную обработку, расширив 'str.' на «улицу» и удаление «Ltd.» как «бессмысленное» слово в терминах сравнения строк.

UPDATE 1

Francesco De Lisi suggests использовать фонетические алгоритмов. Похоже, они лучше подходят для сравнения имен с ошибками. Тем не менее вам нужно разделить адреса на фонетические/нефонетические части (например, на номера зданий) и сравнить их отдельно.

ОБНОВЛЕНИЕ 2

Что касается сравнения адресов, этот пост suggests to use Google Maps API для этой цели и другой пост обсуждает address parsing. Я предполагаю, что Google может создавать надежные результаты, потому что у них есть база данных уличных адресов, где они могут найти правильное название орфографии. Без списка правильных имен улиц/компаний вы можете столкнуться с каким-то странным именем, которое неверно, однако многие разные правильные имена будут похожи на него.

+4

Levenshtein на самом деле не подходит. Метафон или двойной метафон способны лучше проверять сходство. –

+0

Благодарим вас за предложение API Карт Google. Они подходят для проверки адресов. – Radoslaw

8

Что вы ищете является Levenshtein distance (Wikipedia):

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

Смежные вопросы