Недавно возникла проблема, которую нужно решить, то есть сравнить строку, введённую пользователем, и строку, полученную системой, если ошибка не очень велика, система сочтёт её соответствующей требованиям, и лучше установить порог. При распознавании CAPTCHA нужно сравнивать сходство кодов символов и использовать «алгоритм дистанции редактирования» для записи принципа и реализации на C#.
Согласно энциклопедии Baidu:
Расстояние до редактирования, также известное как расстояние Левенштейна (также известное как расстояние редактирования), — это минимальное количество правок, необходимых для перехода между двумя струнами, и чем больше расстояние, тем больше они различаются. Разрешённые редактирование включают замену одного символа другим, вставку символа и удаление символа.
Например, преобразите слово «котёнок» в «сидячий»:
Ситтен (K→s)
Ситтин (E→i)
сидя (→g)
Российский учёный Владимир Левенштейн предложил эту концепцию в 1965 году. Отсюда и название Левенштейнская дистанция.
Например
Если str1="ivan", str2="ivan", то он вычисляется равным 0. Не конвертировался. similarity=1-0/Math.Max(str1.length,str2.length)=1 Если str1="ivan1", str2="ivan2", то вычисляется равным 1. «1» из str1 преобразует в «2», преобразует символ, так что расстояние равно 1, сходство = 1-1/Math.Max(str1.length, str2.length) = 0.8
Применение:
- Анализ ДНК
- Проверка орфографии
- Распознавание речи
- Обнаружение плагиата
Алгоритм реализован на C#:
Тестовый код:
Из результатов тестов делается вывод, чтопространствоилиПунктуация、Положение струнРазные городаРезультаты, влияющие на сходствоПоэтому при сравнении распознавания строк рекомендуется убрать все пробелы и специальные символы в строке перед вызовом алгоритма。
Ресурсы:Вход по гиперссылке виден.
На GitHub также есть библиотека для сравнения сходства строк на C#
FuzzyString — это библиотека, разработанная для моей ежедневной работы с целью координации наименований между различными сетчатыми моделями. Я удалил код, специфичный для системы питания, и собрал то, что можно эффективно использовать как расширение строк, чтобы определить приблизительное равенство между двумя струнами. Все используемые здесь алгоритмы были извлечены из онлайн-источников, конвертированы в C# и скомпилированы в эту библиотеку. Я нашёл несколько других похожих открытых реализаций, которые недоступны для . NET / C#。 Добавление *.dll в ваш проект даст вам доступ к этому расширению и отдельным расширениям под расширением ApproximatelyEquals().
Адрес:Вход по гиперссылке виден.
Установка NUGET:
Алгоритмы, включённые в этот проект:
- Дистанция Хэмминга
- Расстояние Жаккар
- Расстояние Джаро
- Дистанция Яро-Винклера
- Дистанция Левенштейна
- Самая длинная публика
- Самая длинная общая подстрока подпоследовательности
- Коэффициент перекрытия
- Сходство Рэтклиффа и Обершельпа
- Расстояние Соренсена-Дайса
- Коэффициент Танимото
Применение:
Результат:
(Конец)
|