Son zamanlarda, ele alınması gereken bir sorun var; yani kullanıcının girdiği diziyle sistemin elde ettiği diziyi karşılaştırmak için; hata çok büyük değilse, sistem gereksinimleri karşıladığını düşünecek ve bir eşik belirlemek en iyisidir. CAPTCHA tanıma yaparken, karakter kodlarının benzerliğini karşılaştırmalı ve ilke ile C# uygulamasını kaydetmek için "mesafeyi düzenleme algoritması" kullanmalısınız.
Baidu Ansiklopedisi'ne göre:
Düzenleme mesafesi, Levenshtein mesafesi (düzenleme mesafesi olarak da bilinir) olarak da bilinir, iki dizi arasında birinden diğerine geçiş yapmak için gereken minimum düzenleme sayısıdır ve mesafe ne kadar büyükse, o kadar farklıdırlar. İzinli düzenleme işlemleri, bir karakteri başka bir karakterle değiştirmeyi, bir karakter eklemeyi ve karakteri kaldırmayı içerir.
Örneğin, kediyi kelimesini oturmak kelimesine çevirin:
sitten (k→s)
Sittin (e→i)
oturmak (→g)
Rus bilim insanı Vladimir Levenshtein bu kavramı 1965 yılında ortaya atmıştır. Bu yüzden Levenshtein Mesafesi adı verilmiştir.
Örneğin
Eğer str1="ivan", str2="ivan" ise, 0'a eşit olarak hesaplanır. Dönüştürülmemiş. benzerlik=1-0/Matematik.Max(str1.uzunluk,str2.uzunluk)=1 Eğer str1="ivan1", str2="ivan2" ise, 1'e eşit olarak hesaplanır. str1'in "1"i "2"ye dönüştürülür, bir karakter dönüştürür, böylece mesafe 1, benzerlik = 1-1/Math.Max(str1.length, str2.length) = 0.8 olur
Uygulama:
- DNA analizi
- Yazım kontrolü
- Konuşma tanıma
- İntihal tespiti
Algoritma C# dilinde uygulanmıştır:
Test kodu:
Test sonuçlarından şu sonuca varılır ki,uzayveyaNoktalama、Tel pozisyonuFarklı şehirlerBenzerliği etkileyen sonuçlarBu nedenle, dizi tanıma karşılaştırılırken, algoritmayı çağırmadan önce diziden tüm boşluklar ve özel sembollerin çıkarılması önerilir。
Kaynaklar:Bağlantı girişi görünür.
GitHub'da ayrıca C# dize benzerlik karşılaştırmaları için bir kütüphane var
FuzzyString, günlük çalışmalarım için farklı ızgara modelleri arasında adlandırma kurallarını koordine etmek amacıyla geliştirilen bir kütüphane. Güç sistemine özgü kodu çıkardım ve iki dize arasındaki yaklaşık eşitliği belirlemek için etkili bir dizi uzantısı olarak kullanılabilecek bir şeyi bir araya getirdim. Burada kullanılan tüm algoritmalar çevrimiçi kaynaklardan çıkarılmış, C#'a dönüştürülmüş ve bu kütüphanede derlenmiştir. Başka benzer açık kaynak uygulamaları buldum, ancak bunlar için mevcut değil. NET / C#。 Projenize *.dll eklemek, bu uzantıya ve ApproximatelyEquals() uzantısı altındaki bireysel uzantılara erişim sağlar.
Adres:Bağlantı girişi görünür.
Nuget Kurulumu:
Bu projeye dahil edilen algoritmalar:
- Hamming mesafesi
- Jaccard mesafesi
- Jaro mesafesi
- Jaro-Winkler mesafesi
- Levenshtein mesafesi
- En uzun halka açık
- Alt dizinin en uzun ortak alt dizisi
- Örtüşme katsayısı
- Ratcliff-Obershelp benzerliği
- Sorensen-Zar mesafesi
- Tanimoto katsayısı
Kullanım:
Sonuç:
(Son)
|