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

https://towardsdatascience.com/natural-language-processing-for-fuzzy-string-matching-with-python-6632b7824c49

https://www.datasciencecentral.com/profiles/blogs/fuzzy-matching-algorithms-to-help-data-scientists-match-similar

Oğuz Kırçiçek

--

--