Python Fuzzy Modülü

İlk defa Yaşar Arabacı'nın blogunda okuduğum benzer yazı algoritmaları bana çok ilginç gelmişti. Çunku kuçuk kelimelerde veya cumlelerde kelimeleri parçalayıp oranlamak işe yarardı ancak boyutlar buyuyunce bu imkansızlaşmaya başladı. Paragrafları cumlelere, cumleleri kelimelere ayırdıktan sonra kelime bazlı kontrolde çok saçmaydı. Bu yuzden biraz daha farklı algoritma arayışlarına girdim. Bana bu konuda ilginç gelen ise kelimeleri fonetik olarak karşılaştıran algoritmalardı.

Benim okuduğum yazıda 3 tane algoritmadan bahsediyordu. Sayısının benim açımdan bir onemi yok. En azından yazıların benzerliklerini fonetik olarak karşılaştırmanın daha doğru sonuçlar verdiğinin farkına vardım.

Her gun girdiğimiz google'da bazen yazdığımız kelimelerde google hep "Bunu mu demek istediniz?" diye duzeltiyor. İşte burada kullandığı algoritmanında bunlardan birisi olabileceğine vardım. Eğer değilse bile benzer olabilirler.

İşte bende bu algoritmaları Python'da deneyip kullanmak istedim. Bunun için en uygun kutuphane Fuzzy. Bilgisayarınıza yuklemek için aşağıdaki komutu yazmanız yeterli.

pip install Fuzzy

Daha sonra da direk olarak import edip kullanalım. Önce soundex algoritmasına bakalım.

#!/usr/bin/env python

import fuzzy

isimler = [ 'halit', 'halil', 'haim', 'hain']

soundex = fuzzy.Soundex(4)

for n in isimler:
    print '%-10s' % n, soundex(n)

Bunun çıktısı aşağıdaki gibi oluyor.

halit      H430
halil      H400
haim       H500
hain       H500

Gorduğunuz gibi gayet başarılı sonuçlar çıkarıyor. Sizde soundex geçen kısmı DMetaphone veya nysiis ile değiştirip diğer algoritmaların çıktılarına bakabilirsiniz. Ben buradan sonra Soundex algoritmasını kullanarak birkaç uygulama yaptım. Neden soundex derseniz çok iyi sonuçlar verdiği için değil de daha kolay kullanım sağladığı için seçtim. Diğerlerinde donuş değerleri liste olarak gelebiliyor. Buda gelen verilerde tekrardan işlem yapmak demek.

İşte bende bu algoritmayı belirttiğim bir db içinde kelime arama şeklinde kullandım. Kodlar uzerinde çok fazla uğraşmadığım için fazla gereksiz kod olabilir. Ancak mantığın kavranması ve basit işler için yeterlidir diye duşunuyorum. Benim bu algoritmayı kullanarak yazdığım kod aşağıdaki gibi.

#!/usr/bin/env python

from fuzzy import Soundex

class aramaYap:
    def __init__(self, veritabani, arancak):
        self.veritabani = veritabani
        self.arancaklar = arancak.lower().split(" ")
        self.soundex    = Soundex(4)
        self.sonuclar   = []

    def parset(self, liste):
        ksozluk = {}
        i = 0
        for eleman in liste:
            lis  = []
            dlis = []
            lis.append(eleman)
            dlis.append(eleman.lower().split(" "))
            lis.append(dlis)
            ksozluk[i] = lis
            i+=1
        return ksozluk

    def arama(self):
        veritabani  = self.parset(self.veritabani)
        i = 0
        while i < len(veritabani):
            for kelimem in veritabani[i][1][0]:
                for arancak in self.arancaklar:
                    if self.soundex(kelimem) == self.soundex(arancak):
                        if self.sonuclar.count(veritabani[i][0]) < 1:
                            self.sonuclar.append(veritabani[i][0])
            i+=1
        return self.sonuclar

Şimdi de bunu gerçek bir ornekte kullanalım.

from aramam import aramaYap

veritabani = ["Python Yol Haritasi",
              "Ucretsiz CouchDB",
              "ENC28J60 ve Arduino",
              "Facebooku Proxy Olarak Kullanma",
              "schweinsteiger",
              "python programlama",
              "halit alptekin"]

while 1:
    aranacak = raw_input("Aranacak kelime: ")
    arama = aramaYap(veritabani, aranacak)
    i = 1
    for sonuc in arama.arama():
        print str(i) + ". ihtimal = " + sonuc
        i=int(i)+1

Veritabanındaki değerlerimize aşağıdaki gibi sorgular gonderdim ve gelen sonuçlar aşağıda.( Veritabanı olarak basit bir liste kullandım. Siz bunu gerçek bir veritabanı uzerinde de kullanabilirsiniz. Bunun için buradaki yazıya bakmanız yeterlidir. Ayrıcana benim kullanmadığım diye 2 algoritmanın da kullanımı burada var.)

Python Fuzzy Fonetic Search Algorithm

Feysbuk aramasında bile başarılı bir sonuç veriyor :D Yazdığım kodlarda ne yapmak istediğime gelirsek; veritabanındaki oğeleri sırayla kelimelere ayırıyorum. Daha sonra bu ayırdığım kelimeler ile aranacak olan kelimeyi yukarıdaki algoritmayı kullanarak karşılaştırıyorum. Şimdilik sadece değerleri eşit olanları sonuç olarak donduruyor. Belki ileride yakın değerlere sahip olanları da dondururse guzel bir algoritma olur.

comments powered by Disqus