Oca 042010
phpdeki Soundex() fonksiyonunu turkce içinde çalışabilir yaptık. siz de sistemlerinizde “bunu mu demek istediniz ?” diyebileceğiniz bir veritabanı hazırlayabilirsiniz bununla. hemen sınıfı veriyorum .
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | <?php /** * @name D3Soundex | Turkish Soundex * @version 1.0.1 * @author Tufan Barış YILDIRIM * @link htpp://www.tufyta.com * @since 20.10.2009 * v1.0 * ====== * - İlk Soundex Denemem. */ class D3Soundex{ const AEIO ='AEIİOÖUÜYıü ', BPDT ='BPDT', GKH ='GKĞğH', SZ ='SZŞş', CJ ='CJÇç', FV ='FV', LR ='LR', MN ='MN'; private $_hassasiyet=50, $_ilkharf, $_kalan, $_deger, $_mixdeger, $_maxdeger, $_metin, $_elemanlar, $_zip, $_sade, $_grep; public function D3Soundex($hassasiyet){ if($hassasiyet<0 || $hassasiyet>100){ $this->Hata('Hassasiyet Değeri 0 ile 100 arasında Bir Değer Alabilir.'); } $this->_hassasiyet=$hassasiyet; $this->ElemanOlustur(); } public function Metin($metin){ $this->_metin=$metin; $this->_ilkharf=$metin[0]; $this->_kalan=substr($metin,1,strlen($metin)); $this->Sadelestir(); $this->AdamEt($this->Tart($metin)); return $this; } private function Sadelestir(){ $this->_sade=preg_replace('/.+/i','\1',$this->_metin); } private function Zip($Metin){ $Metin=preg_replace('/[^'.$this->_grep.']/i','',$Metin); return $this->_zip=preg_replace('/['.self::AEIO.']+/i',$this->_elemanlar[self::AEIO],$Metin); } private function Tart($Metin){ foreach ($this->_elemanlar as $goruntu=>$kilo){ $Metin=preg_replace('/['.$goruntu.']+/i',$kilo,$Metin); } return $Metin; } private function AdamEt($TartilmisMetin){ $Basamak=min(10,max(4,floor(strlen($this->Zip($Metin))*$this->_hassasiyet/100))); $this->_deger=substr($TartilmisMetin,0,$Basamak); return strtoupper($this->_ilkharf).$this->_deger; } public function Deger(){ return $this->_deger; } public function Soundex(){ return strtoupper($this->_ilkharf).$this->Deger(); } private function ElemanOlustur(){ $this->_elemanlar=array( self::AEIO=>'', self::BPDT=>5, self::SZ=>3, self::MN=>4, self::GKH=>8, self::CJ=>6, self::FV=>2, self::LR=>7, self::MN=>1, ); $this->_grep=str_replace(' ','',implode(' ',array_keys($this->_elemanlar))); } private function Hata($hatametni){ echo '<b>Hata</b> : '.$hatametni; } } /** * Examlpe * * @var D3Soundex */ $s=new D3Soundex(100); $s->Metin('Bunu mu demek istediniz ?'); echo "Bunu mu demek istediniz ? =>Soundex Degeri : ".$s->Soundex()." Ağırlık : ".$s->Deger()."<br>"; $s->Metin('Bunu demek mi istediniz ?'); echo "Bunu demek mi istediniz ?=>Soundex Degeri : ".$s->Soundex()." Ağırlık : ".$s->Deger()."<br>"; ?> |








Merhaba, bu yazınızı özenle okudum fakat php bilmediğim için pek de anladığımı söyleyemeyeceğim, sql de yazmaya çalışıcam ben kendimce türkçe soundexi ve yazınızdan ilham alıyorum biraz, acaba yardımcı olabilirmisiniz ? öncelikle sizce neden soundexi türkçeleştirme ihtiyacı duydunuz ? Türkçe karakterleri İngilizce karakterlere translate ederek, soundexin orjinal fonksiyonunu kullanmak neden ihtiyacınızı karşılamadı ? ve yukarda kullandığınız hassasiyet kodlaması ne işimize yarar.. Eğer vaktinizi çalmayacaksa bana yukarda yapmaya çalıştığınızı biraz daha açarak anlatabilirmisiniz ? Teşekkürler.
Merhabalar, açıklama olmadığı için muhtemelen kodları özenle okudunuz teşekkür ederim
Öncelikle neden Türkçe’ye çevirme gereği duyduğumu açıklayayım. Soundex algoritması ses benzerliği üzerine kurulmuş ve kelime bazlı çalışır. Türkçe’de farklı yazılıp aynı okunan kelimeler yoktur. Yani bu algoritma Türkçe için geçersizdir. “did you men”‘den anladığımız da bu değil zaten. Şimdi yazsaydım bu sınıf çok çok farklı olurdu. Belki yanında bir de veritabanı olurdu diyebilirim. Türkçe’de genelde M-N , B-D , Ğ-H gibi karakterler yanlış duyarız, bu da kelime içinde olunca ihtimali minumuma düşüyor. Hassasiyete gelince, Kelime’den çıkarıp bunu cümle bazında da işlemek istemiştim hepsi bu. İlk 4 karakter bizim dilimizdeki “bunu mu demek istediniz” olayına denk değil. Eğer siz buna benzer bir algoritmayı Türkçe’ye uygulamak istiyorsanız şunları önerebilirim. Türkçe’deki yazım hatalarını araştırın, bir projemizde buna yakın bir mekanizmadan elde ettiğimiz sonuca göre en çok klavye hataları yapıyoruz. Enter tuşuna basarken en sona takılan “ü” gibi, yanyana ve ya alt alt basma ihtimali yüksek tuşlar gibi, Algoritmanıza bunları da ekleyerek doğruluk payını arttırabilirsiniz. Teşekkürler.
Öncelikle Cevabınız için teşekkür ederim, öncelikle hassasiyet konusunda, söylemek istediğinizi anlayamadım ben,” bunu mu demek istediniz” olayına nasıl denk olmuyor , biraz açabilirmisiniz bunu ? mesela ben cümle bazında bişeyleri düzeltmek istiyorsam, yine kelime kelime bakıp eşlemektense, bu cümleyi tek bir kelime haline getirip ,işte boşlukları vs atıp mı kontrol etmekten bahsediyoruz, tabi burda 4 karakterli değilde atıyorum 10 karakterli bir kodlamamı oluşur ? bide şöyle bir durum var, bildiğim kadarıyla soundex atıyorum bir kelimeden a252 diye bir kod çıkarıyorsa, ve bir tabloda arıyorsa bu kelimenin soundexini, o tabloda yine soundex kodu a252 olan kelimeyi buluyor dimi ? şimdi eğer biz 4 karakterli değilde 10 karakterli bir kod yaratırsak, eşleştirme ihtimalini düşürmüş olabilriz sanki ?
Şunu demek istedim
Soundex algoritması kelime baslı çalıştığı için cümleye uygulayamıyorsunuz “Tufan bu blog senin” ile “Tufan Barış yıldırım” ın soundex değeri aynı olur, cünkü ilk 4 ünsüz karakter için geçerlidir. Hassasiyeti arttırınca daha fazla harfe baktığımız için bu cümlenin tamamını o algoritmaya sokmuş olabiliyoruz. İlk yorumumda yazmamışsam düzeltmiş olayım. Bu değişiklikleri yaptıktan sonra adı soundex olmuyor
Anladım, Sizi çok rahatsız etmiş gibi oldum fakat, Türkçe karakterler içeren bir kelimedeki türkçe karakterleri İngilizce karakterlere çevirip soundex uygulayınca sanki yapılan türkçe soundexten daha iyi sonuç veriyor kanısına varıyorum, bu kanının tersini ispat edebileceğiniz bir örneğiniz varmı hiç, mesela şunu soundex bulamaz ama türkçe olan bulur tarzında bir söyleminiz. ? Çünkü soundexteki gruplama türkçedeki bir çok olaya uyuyor, hatta mesela adam şarj yazacağına şarz yazsa türkçe olanda bulamaz ama normal soundex bulur bunu.. bu yüzden türkçesini oluşturmamı gerektircek sebepler bulmakta gerçekten zorlanıyorum :/
Est. Anladım sizi, fakat farklı şeylerden bahsedince dediğinize cevap gibi algıladınız. Baştan alayım Türkçe Soundex diye birşey zaten yok. O kodlar yazılırken belki de bir projedeki kullanım amacına göre yazıldı ve iyi sonuclar verdi. Çünkü Türkçe’de okunuş ile yazılışı birbirinden farklı olan hiç kelime yok, çok zorlarsak “bayağı” kelimesini “bayaa” diye okuruz ki bunu da Soundex “ğ” harfi olmadığı için bulur
Ama sizin iyi sonuc veriyor dediğiniz örnekler birkaç karakter değiştirmekten ibaretse tabi ki gerek yok türkçesini yazmaya. SOUNDEX