Нещодавно виникла проблема, яку потрібно вирішити, тобто порівняти рядок, введений користувачем, і рядок, отриманий системою; якщо похибка не дуже велика, система вважатиме її відповідною вимогам, і найкраще встановити поріг. Під час розпізнавання CAPTCHA потрібно порівняти схожість кодів символів і використати «алгоритм відстані редагування» для запису принципу та реалізації C#.
Згідно з енциклопедією Baidu:
Відстань редагування, також відома як відстань Левенштейна (також відома як відстань редагування), — це мінімальна кількість правок, необхідна для переходу між двома рядками, і чим більша відстань, тим більше вони відрізняються. Операції з дозволеним редагуванням включають заміну одного символу іншим, вставку символу та видалення символу.
Наприклад, перетворіть слово кошеня на сидячий:
Сіттен (K→s)
Сіттін (E→i)
сидіння (→g)
Російський вчений Володимир Левенштейн запропонував цю концепцію у 1965 році. Звідси й назва Левенштейнська відстань.
Наприклад
Якщо str1="ivan", str2="ivan", то це обчислюється як дорівнює 0. Не конвертований. схожість=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:
Алгоритми, включені до цього проєкту:
- Відстань Геммінга
- Відстань Жаккар
- Відстань Джаро
- Відстань Яро-Вінклера
- Відстань Левенштейна
- Найдовша публіка
- Найдовша спільна підрядка підпослідовності
- Коефіцієнт перекриття
- Схожість Реткліффа-Обершельпа
- Відстань Соренсена-Кубика
- Коефіцієнт Танімото
Використання:
Результат:
(Кінець)
|