Soundex

**Soundex**, İngilizcedeki 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önetimi**nin *([[The National Archives and Records Administration]] - NARA)* US Hükûmeti 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ş hâli 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 İngilizcedeki 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.)*


```perl
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)*

## Ayrıca bakınız

* Metaphone
* Miracode

## Dış bağlantılar
* https://web.archive.org/web/20090220092548/http://archives.gov/publications/general-info-leaflets/55.html
* Daitch-Mokotoff → http://www.avotaynu.com/soundex.html  
* Daitch-Mokotoff → http://www.jewishgen.org/infofiles/soundex.html#DM  
* Soundex, Metaphone ve Double Metaphone → http://jakarta.apache.org/commons  codec project
* Anlaşılır klasik Soundex algoritmaları *(C, JavaScript, Perl ve VB dilleri için)* → http://www.creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm 
* FireBird üzerinde RDBMS → http://www.fbtalk.net/viewtopic.php?id=182 
* Dedupe Projesi → http://dedupe.sourceforge.net
* Ruby üzerinde → https://web.archive.org/web/20080416220727/http://rubyforge.org/projects/text/
* Açık kaynak Java üzerinde → http://mfwallace.googlepages.com/soundex.html 
* Python üzerinde → http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52213