Google "Bunu mu demek istediniz" sorusunu neye göre soruyor?

Google'da arama yapmak istediğinizde, hatalı yazımları otomatik olarak algılayıp bunu mu demek istediniz diye sorduğunu hepiniz biliyorsunuz

Google'da arama yapmak istediğinizde, hatalı yazımları otomatik olarak algılayıp bunu mu demek istediniz diye sorduğunu hepiniz biliyorsunuz.

Merak ettiniz mi hiç, Google bunu nasıl yapıyor diye?

Anahtar kelime Soundex.

Wikipedia Soundex i şu şekilde tanımlıyor:

Soundex, İngilizce'deki kelimelerin telaffuz biçimlerine göre hazırlanmış bir fonetik algoritmadır. Bu algoritmanın hazırlanmasındaki temel amaç; telaffuzları 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 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 telaffuzlu 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:

  1. Karakter katarının ilk harfini yakalayın.
  2. Eğer ilk harf "a, e, h, i, o, u, w, y" harflerinden herhangi biri değilse, bu harfleri metinden silin.
  3. 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
  4. 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.
  5. İ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)

Soundex algoritmasınını C#'ta şu şekilde implement edebiliriz:

public static class SoundexExtension
{
public static string Soundex(this string s)
{
  return Soundex(s, 4);
}

public static string Soundex(this string s, int length)
{
  return FullSoundex(s)
  .PadRight(length, '0')
  .Substring(0, length);
}

public static string FullSoundex(this string s)
{
  const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const string codes = "0123012D02245501262301D202";

  Regex hwBeginString = new Regex("^D+");
  Regex simplify = new Regex(@"(\d)\1*D?\1+");
  Regex cleanup = new Regex("[D0]");

  s = s.ToUpper();

  StringBuilder coded = new StringBuilder();

  for (int i = 0; i < s.Length; i++)
  {
    int index = chars.IndexOf(s[i]);
    if (index >= 0)
      coded.Append(codes[index]);
  }

  string result = coded.ToString();
 
  result = simplify.Replace(result, "$1").Substring(1);

  result = hwBeginString.Replace(result, string.Empty);

  result = cleanup.Replace(result, string.Empty);

  return string.Format("{0}{1}", s[0], result);
}
}

Örnek bir kod yazalım ve sonuçları karşılaştıralım:

Console.WriteLine("devrim altınkurt".Soundex());
Console.WriteLine("devrm ltnkt".Soundex());

Sonuç:


D165
D165

2. satırdaki yazım yanlışları sanırım dikkatinizi çekmiştir. Ancak her iki stringin de sonuçta aynı bilgiyi verdiğini görüyoruz.

Peki bunu programımızda C# kodu ile değil de veritabanımızda kullanmak istersek?

Yani tablomuzdaki kayıtlar arasında benzeyen kayıtları getirmek istersek ne yapmamız lazım?

Cevap çok zor değil, hem MSSQL'de hem de MySQL'de halihazırda gelen Soundex() fonksiyonunu kullanabilirsiniz.

Örnek:

select * from ogrenciler where SOUNDEX(adsoyad) = SOUNDEX('Devrim');

Bu fonksiyonu kullanarak uygulamalarınızı zenginleştirebilir, rakiplerinizden 1 adım önde olabilirsiniz.

Herkese kolay gelsin.