Python’da Fuzz Metin Eşleştirme Kütüphanesi Kullanımı

0 385

Python ile Fuzz kütüphanesi ile metin eşleştirme ve benzer metinleri bulma işlemlerini yapabilirsiniz. Doğal dil işleme projelerinizde, internet arama motorlarında, alışveriş sitelerindeki aramalarda benzer metinlerin bulunmasında yardımcı olabilecek ve işlerinizi kolaylaştıracak birçok özelliği bulunan bu kütüphane Levenshtein distance isimli bir yöntemi kullanıyor.

Örnek kodların hepsine Google Colab linki üzerinden erişebilirsiniz.

Levenshtein Distance

Bilgi teorisi, dilbilim ve bilgisayar bilimlerinde Levenshtein mesafesi, iki dizi arasındaki farkı ölçmek için kullanılan bir dizi ölçüsüdür. Gayri resmi olarak, iki kelime arasındaki Levenshtein mesafesi, bir kelimeyi diğerine değiştirmek için gereken minimum tek karakterli düzenleme (ekleme, silme veya değiştirme) sayısıdır. Bu algoritama adını 1965 yılında bu mesafeyi dikkate alan Sovyet matematikçi Vladimir Levenshtein’den almıştır.

Python'da Fuzz Metin Eşleştirme Kütüphanesi Kullanımı 1

Fuzz Metin Eşleştirme Kütüphanesi

Fuzz kütüphanesi metinlerdeki benzerlikleri Levenshtein  mesafesi kullanarak ölçen basit bir kütüphane. Kütüphaneyi kurmak için:

pip install thefuzz

komut satırını kullanmanız yeterli.  Kütüphanenin çalışması için öncelikle python-Levenshtein kütüphanesininde kurulu olması gerekmekte.

pip install python-Levenshtein
from thefuzz import fuzz, process
#Kütüphaneyi projeye dahil ediyoruz.

Bu kütüphaneyi proje dahil etmek içinse üstteki komutları kodumuzun en üstüne yerleştiriryoruz.

metin1 = "Merhaba Dünya"

metin2 = "merhaba dünya"

print(metin1 is metin2)

print(metin1 == metin2)
Normalde üstteki satırları çalıştırırsak python bize iki tane False döndürecektir. metin1 ve metin2 birbirine eşit değildir. Bunu engellemek için toLower metodunu çağırarak kelimeleri küçük harfe dönüştürüp tekrar kontrol edebiliriz. Ancak bu her zaman bizim istediğimiz sonuçları döndürmek için yeterli olmayacaktır.

fuzz.ratio Metodu

Ancak The Fuzz kütüphanesindeki fuzz.ratio metodunu kullanarak iki metin arasındaki mesafeyi ölçüp bize metinlerdeki benzerlik oranını gösterir.
print(fuzz.ratio(metin1,metin2))

#iki metin arasındaki benzerlik oranını belirliyoruz. sonuç 85
Sonuç olarak 85 değeri aldık. Eğer daha uzun iki metni karşılaştırmış olsaydık daha yüksek bir sonuç elde ederdik.
metin1 = "Merhaba Dünya. Buraya daha uzun bir metin giriyoruz."

metin2 = "merhaba dünya. Buraya daha uzun bir metin giriyoruz."

print(fuzz.ratio(metin1,metin2))

#iki metin arasındaki benzerlik oranını belirliyoruz. Metin uzun olunca sonuç 96

Tamamen farklı metinler arasındaki benzerlik oranı daha düşük olacaktır.

metin1 = "Merhaba Dünya. Buraya daha uzun bir metin giriyoruz."

metin2 = "Tamamen Farklı bir yazıyı karşılaştırırsak."

print(fuzz.ratio(metin1,metin2))

#Farklı iki metni karşılaştırdık sonuç 23

fuzz.partial_ratio Metodu

Bir metnin başka bir metni içerip içermediğini ise fuzz.partial_ratio metodu ile ölçebiliriz.

metin1 = "Deneme yazısı"

metin2 = "Deneme yazısı ancak daha fazla yazılı."

print(fuzz.partial_ratio(metin1,metin2))

#Metnin içinde metin parçası olup olmadığını ölçüyor

fuzz.token_sort_ratio Metodu

fuzz.token_sort_ratio ise önce metindeki kelimeleri dizip daha sonra benzerlik ölçümü yapar.

metin1 = "Dinle beni sana söyleyeceklerim var dünya"

metin2 = "Dünya sana söyleyeceklerim var dinle beni"

print(fuzz.ratio(metin1,  metin2)) #73

print(fuzz.partial_ratio(metin1,  metin2)) #73

print(fuzz.token_sort_ratio(metin1,  metin2)) #100

fuzz.token_set_ratio Metodu

metin1 = "Merhaba Dünya"

metin2 = "Merhaba Merhaba Dünya Dünya Dünya"

print(fuzz.ratio(metin1,  metin2)) #57

print(fuzz.partial_ratio(metin1,  metin2)) #69

print(fuzz.token_sort_ratio(metin1,  metin2)) #57

print(fuzz.token_set_ratio(metin1,metin2)) #100

Process Örnekleri

yine fuzz kütüphasinde bulunan process.extract metodu ile bir sizi metin içinde en yakın olanı bulmayı kolaylaştırabiliriz.

etiketler = ["Programlama Dilleri", "Doğal Dil İşleme", "Dil Bilimi","Kodlama",

          "Merhaba Dünya","Robotik Programlama"]

print(process.extract("programlama", etiketler, limit=2))
#[('Programlama Dilleri', 90), ('Robotik Programlama', 90)]
print(process.extract("program", etiketler, limit=2))
#[('Programlama Dilleri', 90), ('Robotik Programlama', 90)]
print(process.extractOne("programlana", etiketler))
#('Programlama Dilleri', 82)

etiketler dizinde aradığımız kelimeye en yakın sonuçları ve sonuç oranlarını döndürüyoruz. process.extrectOne ise sadece en yüksek puanlı dizi elemanını gösterir.

Bu metodu kullanarak metinler arasında arama yapmak için scorer parametresinde  fuzz.token_sort_ratio metodunuda işe karatak daha net sonuçlar elde edebiliriz.

kitaplar = ["The Python Bible Volume 1 - Beginner",

            "The Python Bible Volume 2 - Intermediate",

            "The Python Bible Volume 3 - Data Science",

            "The Python Bible Volume 4 - Machine learning",

            "The Python Bible Volume 5 - Finance",

            "The Python Bible Volume 6 - Neural Networks",

            "The Python Bible Volume 7 - Computer Vision",

            "The Python Bible Algorithms & Data Structures",

            "The Java Bible - Beginner",

            "Some Other Data Science Book",]

print(process.extract("python data science", kitaplar,limit=2))
#[('The Python Bible Volume 1 - Beginner', 86), ('The Python Bible Volume 2 - Intermediate', 86)]
print(process.extract("python data science", kitaplar,limit=2 , scorer = fuzz.token_sort_ratio))
#[('The Python Bible Volume 3 - Data Science', 67), ('Some Other Data Science Book', 64)]
print(process.extract("science data python", kitaplar,limit=2 , scorer = fuzz.token_sort_ratio))
#[('The Python Bible Volume 3 - Data Science', 67), ('Some Other Data Science Book', 64)] 

Üstteki örneği incelersek “python data science” aramasında daha uzak sonuçlar dönerken scorer parametresine token_sort_ratio metodunu eklediğimizde “Data Science” kitaplarını bulabiliyoruz.

Üstteki komutların hepsine Google Colab linki üzerinden erişebilirsiniz.

Kodların Tamamı:

# -*- coding: utf-8 -*-
"""Fuzzy Strings Metin İsleme.ipynb

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/1deeXqHNZgxMqB3TeIUd05EiTbPNWRIky
"""

!pip install thefuzz
#Kütüphanemizi Kuruyoruz.

!pip install python-Levenshtein

"""Thefuzz isimli kütüphane [Levenshtein](https://en.wikipedia.org/wiki/Levenshtein_distance)  distance isimli bir yöntem ullanarak metinler arasınddaki farklılıkları belirliyor."""

from thefuzz import fuzz, process
#Kütüphaneyi projeye dahil ediyoruz.

metin1 = "Merhaba Dünya"
metin2 = "merhaba dünya"

print(metin1 is metin2)
print(metin1 == metin2)

print(fuzz.ratio(metin1,metin2))
#iki metin arasındaki benzerlik oranını belirliyoruz. sonuç 85

metin1 = "Merhaba Dünya. Buraya daha uzun bir metin giriyoruz."
metin2 = "merhaba dünya. Buraya daha uzun bir metin giriyoruz."

print(fuzz.ratio(metin1,metin2))
#iki metin arasındaki benzerlik oranını belirliyoruz. Metin uzun olunca sonuç 96

metin1 = "Merhaba Dünya. Buraya daha uzun bir metin giriyoruz."
metin2 = "Tamamen Farklı bir yazıyı karşılaştırırsak."

print(fuzz.ratio(metin1,metin2))
#iki metin arasındaki benzerlik oranını belirliyoruz. Metin uzun olunca sonuç 23

metin1 = "Deneme yazısı"
metin2 = "Deneme yazısı ancak daha fazla yazılı."

print(fuzz.partial_ratio(metin1,metin2))
#Metnin içinde metin parçası olup olmadığını ölçüyor

metin1 = "Dinle beni sana söyleyeceklerim var dünya"
metin2 = "Dünya sana söyleyeceklerim var dinle beni"

print(fuzz.ratio(metin1,  metin2)) #73
print(fuzz.partial_ratio(metin1,  metin2)) #73
print(fuzz.token_sort_ratio(metin1,  metin2)) #100

metin1 = "Merhaba Dünya"
metin2 = "Merhaba Merhaba Dünya Dünya Dünya"

print(fuzz.ratio(metin1,  metin2)) #57
print(fuzz.partial_ratio(metin1,  metin2)) #69
print(fuzz.token_sort_ratio(metin1,  metin2)) #57
print(fuzz.token_set_ratio(metin1,metin2)) #100

"""Process Örnekleri"""

etiketler = ["Programlama Dilleri", "Doğal Dil İşleme", "Dil Bilimi","Kodlama",
          "Merhaba Dünya","Robotik Programlama"]

print(process.extract("programlama", etiketler, limit=2))

print(process.extract("program", etiketler, limit=2))

print(process.extractOne("programlana", etiketler))

kitaplar = ["The Python Bible Volume 1 - Beginner",
            "The Python Bible Volume 2 - Intermediate",
            "The Python Bible Volume 3 - Data Science",
            "The Python Bible Volume 4 - Machine learning",
            "The Python Bible Volume 5 - Finance",
            "The Python Bible Volume 6 - Neural Networks",
            "The Python Bible Volume 7 - Computer Vision",
            "The Python Bible Algorithms & Data Structures",
            "The Java Bible - Beginner",
            "Some Other Data Science Book",]

print(process.extract("python data science", kitaplar,limit=2))

print(process.extract("python data science", kitaplar,limit=2 , scorer = fuzz.token_sort_ratio))

print(process.extract("science data python", kitaplar,limit=2 , scorer = fuzz.token_sort_ratio))

 

Python ile ilgiyseniz sitemizde bulunan Python Dersleride ilginizi çekebilir. Ayrıca kendinizi geliştirmek farklı uygulamalar yapmak isterseniz Algoritma sorularımıza da göz atabilirsiniz.

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bununla iyi olduğunuzu varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul etmek Mesajları Oku