Приблизительное сопоставление строк
-
26-09-2019 - |
Вопрос
Я знаю, что этот вопрос задали много времени. Я хочу предложить, на котором алгоритм подходит для приближенного сопоставления строк.
Приложение специально для имени компании, сопоставив только и ничего другого.
Самая большая проблема - это, вероятно, является частью конечного имени компании и кратковременной с именем Часть Пример: 1. Companya Pty Ltd VS Companya Pty. ловная VS Companya 2. Engine Engineering VS WES Engineering (чрезвычайно редкое происшествие)
Как вы думаете, Левенштейн редактировать расстояние адекватно?
Я использую C #
С уважением, Макс
Решение
Существуют различные метрики String Distance, которые вы могли бы использовать.
я бы порекомендовал Яро-Винклер. Отказ В отличие от редактирования, где результат сравнения находится в дискретных единицах редактирования, JW дает вам счет 0-1. Это особенно подходит для правильных имен. Также смотрите Это хорошее учебное пособие а также Это так вопрос.
Я не работал с C #, но вот некоторые реализации JW I нашли онлайн:
Внимание 1. (У них также есть версия DOT NET, если вы посмотрите на список файлов)
Если вы хотите сделать немного более сложного сопоставления, вы можете попытаться сделать какую-либо обычную нормализацию форм слов, обычно встречающихся в именах компаний, таких как ltd/limited, inc/incorporated, corp/corporation
принять участие в случае нечувствительности, сокращения и т. Д. Таким образом, если вы вычисляете
distance (normalize("foo corp."), normalize("FOO CORPORATION") )
Вы должны получить результат быть 0, а не 14 (что вы получите, если вы вычисляете revenshtein edit - расстояние).
Другие советы
Да, расстояние Левенштейна подходит для этого. Это будет работать для всех, которые вы не указали хотя бы.
Вы также можете использовать Soundex., но я не думаю, что вам это понадобится.
В этих простых примерах, просто удаление всех неальфа-числовых символов дает вам совпадение, и является самым простым, как вы можете предварительно вычислить данные с каждой стороны, а затем сделать совпадение, что будет намного быстрее, чем Крест умножая и расчет расстояния редактирования.
Я предоставил свой ответ уже в другой вопрос.
https://stackoverflow.com/A/30120166/2282794.
Я работал над большой масштабной системой с аналогичными требованиями, соответствующими, о котором вы говорили. Соответствие имени не очень просто, и порядок первых и фамилию может быть разным. Простые нечеткие алгоритмы сопоставления имени проваливаются в таких сценариях.
Если мы просто хотим поговорить о приближенных алгоритмах сопоставления строк, то есть много. Немногие из них: Яро-Винклер, редактирование расстояния (левенштейн), сходство JACCARD, алгоритмы оснований на звуковой среде / фонетике и т. Д. Простая густочка даст нам все детали. Вы можете реализовать все они в C #
Ирония, они работают, пока вы пытаетесь сопоставить две данные входные строки. Хорошо теоретически и продемонстрировать способ нечетких или приближенных строковых сопоставленных работ.
Тем не менее, крайне заниженный момент, как мы используем то же самое в настройках производства. Не все, о которых я знаю, кто разведчился для приближенного алгоритма сопоставления строк, знал, как они могут решить то же самое в производственной среде.
Возможно, я только что говорил о Люсине, который специфичен для Java, но есть Луси для .NET .NET.