Python ile Doğal Dil İşlemede Fuzzy String Matching
Merhaba arkadaşlar, bugün sizlerle birlikte iki cümle arasındaki benzerlik ilişkisini çeşitli örnekler yaparak göreceğiz. Benzerlikleri yakalamak için kullandığımız kütüphanenin adı FuzzyWuzzy. Bu kütüphane bir çok programlama dilinde geliştirilmesine rağmen ben bugun size Python dilini kullanarak anlatacağım ama öncesinde biraz string eşlemesi ne işe yarar nerede kullanırız bunlara biraz değineceğim.
Fuzzy(Bulanık) string eşlemesi , kullanıcılar kelimeleri yanlış yazdığında veya arama için yalnızca kısmi kelimeler girdiğinde bile eşleşmeleri bulabilen bir arama türüdür.
Fuzzy string eşlemesi bir çok farklı noktada kullanılabilir.
Örneğin :
- Bir yazım denetleyicisi ve yazım hatası, yazım hatası düzelticisi. Örneğin, bir kullanıcı Google’a “natural langage prcesing” yazdığında , “natural language processing” için sonuçları gösterme ile birlikte bir isabet listesi döndürülür. Diğer bir deyişle, kullanıcı girişi ek veya eksik karakterler diğer yazım hataları olsa bile, arama sorgusu sonuçları döndürür.
- Çift kayıtları kontrol etmek için bir kullanılabilir.
Python’da FuzzyWuzzy
Fuzzywuzzy , diziler ve desenler arasındaki farkları hesaplamak için sadece Levenshtein Distance metriğini kullanan ve SeatGeek tarafından geliştirilen açık kaynaklı bir python kütüphanesidir .
Kurulum
Python kütüphaneyi kullanabilmemiz için arka tarafta kullanılan Levenshtein kütüphanesinide yüklemek zorundayız.
pip install fuzzywuzzy
pip install python-Levenshtein
Daha sonra kullanılacak modülleri içeri aktarıyoruz.
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
Artık fonksiyonlara geçip iki string arasında benzerlik hesaplayabiliriz.
İlk kısımda ratio ve partiol_ratio fonksiyonunu kullanıp birlikte değerlendireceğiz sonuçları.
Ratio
fuzz.ratio("doğal dil işleme", "doğal dil işleme???") Çıktı:95
Natural Language Processing ve Natural Language Processing??? kelimeleri birbiri arasında %95 benzerlik varmış. Örnek vermek gerekirse, arama motorlarında yanlış yazılımlarda size en yakın doğru sonucu getiren seçimlerde benzerliklerden yararlanıldığını söylebiliriz. Yukarıdaki sonuçta görüldüğü gibi her ne kadar yanlış da yazsak biz onu büyük oranda doğrusuna yakın olarak buldu.
Partial_Ratio
fuzz.partial_ratio("Natural Language Processing","Natural Language Processing???")Çıktı : 100
Benzerlik %100 olarak bulundu. Ratio ve partial_ratio fonksiyonları arasındaki farklardan bir tanesi partial_ratio, noktalama işaretlerinden etkilenmez ve doğrudan cümlenin ana yapısına bakar. Bazı noktalarda partial ratio kullanmak daha avantajlı olabilir.
fuzzywuzzy içerisindeki diğer fonksiyonlara baktığımızda da matching işlemleri için kullanışlı metotları görüyoruz.
Token_Sort_Ratio
fuzz.token_sort_ratio("doğal dil işleme", "doğal dil işleme işleme") Çıktı:83
token_sort_ratio fonksiyonu iki cümle arasında kelime bazlı bir benzerlik hesaplama yöntemidir. İki kelimeye bakar, her ne kadar iki cümlede de eşşiz olan kelimeler aynı olsada ikinci cümledeki “processing” kelimesi bir fazla olduğu için benzerlik oranını 100 yerine 83’e düşürmüştür, yani kelime bazlı bir yaklaşım vardır ve bu kelimelerin sayısı önemlidir.
Token_Set_Ratio
fuzz.token_set_ratio("doğal dil işleme", "doğal dil işleme işleme") Çıktı:100
Token_set_ratio fonksiyonu, token_sort_ratio fonksiyonunun aksine kelime sayılarından etkilenmez bir kelime ne kadar tekrar edilirse edilsin onu 1 defa olarak sayar ve iki kelimeyi o halde karşılaştırır. Yukardaki örnekte benzerlik oranımız 100 olarak görülmektedir.
Bir başka yaklaşımımız elimizde bir liste elemanları ve bir cümle var ve siz bu cümlenin o listedeki en yakın cümleyi bulmak istiyorsunuz. Bunun için kullanmanız gereken fonksiyon extract fonksiyonudur.
Extract
from fuzzywuzzy import process
cumle= 'doğal dil'
liste = ['dil işleme doğal', 'doğal dil işlemek', 'dili işlemek']
process.extract(cumle, liste) Çıktı:
[('doğal dil işlemek', 90), ('dil işleme doğal', 86), ('dili işlemek', 48)]
Örnekte de görüldüğü üzere listede 3 farklı cümlecik var ve extract fonksiyonu benzerlik oranına göre yüksekten düşüğe doğru sııralayarak bize çıktıyı sağlıyor.
WRatio
İki cümle arasında ki büyük-küçük harf farklılıklarına takılmaz, noktalama işaretlerini görmezden gelir, böylelikle farklı koşullarda olan iki cümle için benzerlik hesaplaması yapabilirsiniz.
fuzz.WRatio('doğal dil işlemek', 'Doğal Dil İşlemek') Çıktı: 94
Bu yazımda, yaklaşık olarak stringlerin nasıl eşleştirileceğini ve ne kadar benzer olduklarını belirledik. Burada sunulan örnekler basit olabilir, ancak bir bilgisayarın iki cümleyi nasıl ele aldığını göstermek için yeterlidir.
Bulanık eşleme çok farklı alanlarda kullanılabilir:
- DNA dizilerini eşleştirmek için yazım denetimi
- Biyoinformatik gibi alanlarda
uygulamaları vardır. Bu yüzden bulanık eşleme farklı senaryolarda kullanılabilir.
SEVGİYLE KALIN
REFERANS
https://www.datacamp.com/community/tutorials/fuzzy-string-python