Вопрос

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

Приложение специально для имени компании, сопоставив только и ничего другого.

Самая большая проблема - это, вероятно, является частью конечного имени компании и кратковременной с именем Часть Пример: 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, если вы посмотрите на список файлов)

Внимание 2.


Если вы хотите сделать немного более сложного сопоставления, вы можете попытаться сделать какую-либо обычную нормализацию форм слов, обычно встречающихся в именах компаний, таких как 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.

https://lucenenet.apache.org/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top