Soundex

Soundex, İngilizce'deki keliemelerin teleffuz biçimlerine göre hazırlanmış bir fonetik algoritmadır. Bu algoritmanın hazırlanmasındaki temel amaç; teleffuzları benzeşen kelimelerin bu yolla aynı karakter katarına (string) dönüştürülmeleri ve bu yolla benzer kelimelerin -yazımlarında fark olsa bile- tespit edilmesidir. Bunun yanında Soundex algoritması, fonetik algoritmalardan en bilineni ve en sık kullanılanı olup, bazı çevreler tarafından -yanlış bir şekilde- fonetik algoritma terimiyle aynı anlamda kullanılamaktadır.
Soundex, Robert Russell ve Margaret Odell tarafından geliştirilmiş, U. S. Patenti 1,261,167 ve U. S. Patenti 1,435,663 ile patentlenmiştir. Ayrıca American Soundex ismiyle 1930'lu yıllarda 1890/1920 arası analiz için yapılan bir sayımda kullanılmıştır. Soundex kodlaması ise 1960'larda 'Communications of the ACM', 'Journal of the ACM of the Association for Computing Machinery' gibi bazı makalelere konu olması sebebiyle ünlenmiş ve özellikle 'Donald Knuth's magnum opus', 'The Art of Computer Programming' yazılarında nasıl bir şey olduğu anlatılmıştır.
Soundex kodu ilki bir harf, diğer üçü ise rakamlardan oluşan dört karakterli bir koddur; harf olarak kelimenin ilk harfi, sayı olarak da geri kalan harflerin belirli bir kurala göre numaralandırılmasıyla ortaya çıkan sonuç alınır. Benzer teleffuzlu sözcükler ise aynı numaralarla kodlanır; örneğin, benzer telaffuzlu B, F, P ve V harfleri 1 ile kodlanır. Sesli harfler kodlama işlemini etkiler, ancak bu sesli harf kelimenin başında bulunmuyorsa ortaya çıkan sonucu asla doğrudan etkilemez.
Tam algoritma aşağıdaki gibidir:
Karakter katarının ilk harfini yakalayın.
Eğer ilk harf "a, e, h, i, o, u, w, y" harflerinden herhangi biri değilse, bu harfleri metinden silin.
Sırasıyla tüm harflere aşağıdaki numaralandırmayı yapın;
b, f, p, v = 1
c, g, j, k, q, s, x, z = 2
d, t = 3
l = 4
m, n = 5
r = 6
Eğer numaralandırmada aynı numarayı almış iki ya da daha fazla harf yan yanaysa (ilk işlemden önce) ya da bu harflerin arasında h veya w harfi varsa (sadece Amerikan sayımında geçerli); aynı olanları atlayın.
İlk dört karakteri sonuç olarak döndürün; eğer sonuç dört karakterden az çıkıyorsa, dört karakter tamamlanması için sonuna sıfırlar ekleyin. (örn. A22 - A220)
Ulusal Arşiv ve Kayıt Yönetiminin (The National Archives and Records Administration - NARA) US Hükumeti için koyduğu bu resmi kurallar, hazırlanan standart Soundex algoritmaları için de kullanılmalıdır.
Algoritma kullanılırken; örneğin "Rubin"in kodu R150 iken, "Robert" ve "Rupert" isimleri aynı kodu döndürür; R163.
Farklı Soundex Algoritmaları
Ters (reverse) Soundex adlı farklı bir algoritmada ise, sayıların önüne getirilen harf en baştaki yerine en sondakidir.
The NYSIIS algoritması yine NYSIIS tarafından Soundex algoritmasının geliştirilmiş hali olarak tanıtıldı. NYSIIS çoklu-karakter n-gram'ları desteğiyle gelir ve bilinen Soundex algoritmalarının aksine, sesli harflerin kelimede nerede bulunduğunu dikkate alarak kodlama yapar.
Celko Güçlendirilmeli Soundex algoritması ise Joe Celko tarafından onun "SQL For Smarties: Advanced SQL Programming" adlı kitabında tanıtılmıştır.
Lawrence Philips, aynı amaçla, Soundex algoritmasının eksiklerine bir cevap gibi hazırlanmış 'Metaphone' algoritmasını geliştirdi. Philips daha sonra Metaphone algoritmasını biraz daha geliştirerek 'Double-Metaphone' adını verdiği bir algoritma daha geliştirdi. Double-Metaphone algoritması, selefinden daha büyük bir kodlama kuralını sistemine ekleyerek Latin alfabesinde bulunmayan karakterleri de desteklemekle birlikte; bu algoritmayı kullananlar arasında İngilizce'deki farklı teleffuzları kullanabilecekler için birincil (primary) ve ikincil (secondary) kodlama sonuçlarını döndürmektedir.
Daitch-Mokotoff Soundex (D-M Soundex) algoritması, bir soy izleme uzmanı olan Gary Mokotoff tarafından geliştirildi ve daha sonraları Alman/Slav soyadlarıyla yapılan bazı karşılaştırmalarda ortaya çıkan sorunlar nedeniyle yine bir soy izleme uzmanı olan Randy Daitch tarafından güçlendirildi. Her ne kadar bazı yazarların hevesini kırsa da D-M Soundex algoritmasına bazı kaynaklarda "Yahudi Soundex'i - Jewish Soundex" ya da "Doğu Avrupa Soundex'i - Eastern European Soundex" ile referans verilebilmektedir. D-M Soundex algoritması, tek bir kelime için birbirinden bağımsız 32 sonuç verebilir. D-M Soundex sonuçları 100000 ile 999999 arasında her türlü sayı formatında olabilir.
Örnek Algoritmalar/Kullanım Şekilleri
Aşağıda Perl programlama dili için hazırlanmış bir fonksiyonu görebilirsiniz. Fonksiyon, kendisine verilen kelimenin Soundex kodunu döndürecektir. (Bunun yanında CPAN üzerindeki Text::Soundex modulünü de kullanabilirsiniz.)
sub soundex { # return soundex code
my($useword) = $_[0];
my($result) = "0000";
my($idx,$prev,$perhaps,$thechar);

$useword =~ tr/ //d; # rid spaces
$useword = lc($useword); # lower-case for consistency
if (length($useword) < 1) {
return($result);
}

$result = substr($useword,0,1); # first letter
$prev = "0";
$idx = 1;
while ($idx <= length($useword)) {
$perhaps = "0";
$thechar = substr($useword,$idx - 1,1);
if (index("bfpv", $thechar) >= 0) { $perhaps = "1"; }
if (index("cgjkqsxz",$thechar) >= 0) { $perhaps = "2"; }
if (index("dt", $thechar) >= 0) { $perhaps = "3"; }
if (index("l", $thechar) >= 0) { $perhaps = "4"; }
if (index("mn", $thechar) >= 0) { $perhaps = "5"; }
if (index("r", $thechar) >= 0) { $perhaps = "6"; }
if ($perhaps!= $prev && $perhaps!= "0"
&& $idx!= 1) { # avoid dups and ignore first
$result.= $perhaps;
}
$prev = $perhaps;
$idx++;
} #endwhile

$result.= "0000"; # pad with zeros to ensure min length
$result = substr($result,0,4); # only return first four
return($result);
}
... ve Soundex algoritması için PHP ile gelen bir fonksiyon (PHP3'ten beri desteklenmektedir)