en çok benzeyen kelimeleri bulma

Başlatan zamzam23, 17 Mart 2015, 22:53:02

zamzam23

selamlar

sorunumu basitleştirerek anlatmaya çalışıcam:

örneğin elimizde "koparmak" kelimesi var.

bu haricinde 2 kelimemiz daha var: "kotarmak" ve "kaçırmak"

"kotarmak" kelimesine karşılık, ona en çok benzeyen "koparmak" kelimesini programa buldurmak istiyorum. nasıl bir yöntem izleyebilirim?

aspcibertan

Levenstein algoritmasını araştırmış mıydınız? Php'de hazır fonksiyonu var mesela. Bu basit işlemlerde gayet esnek bir kütüphane. C# için de kullanımı var.

Onun dışında Double Metaphone adında bir algoritma daha varmış, onu ben de şimdi öğrenmiş oldum. Bu ikisini araştırabilirsiniz.

z

#2
Kelimelerin sıra ile karakterlerinin sayısal değerlerini birbirinden çıkart  ve farkların mutlak değerlerini topla.

Her bir toplamı diğer kelimeler için elde ettiğin toplamlarla mukayese et. En küçük toplamı veren kelime asıl kelimeye en çok benzeyendir.

mesaj birleştirme:: 18 Mart 2015, 00:49:16

Önerimi iptal ediyorum. Biraz daha kafa yormak lazım.

ABCDEF

BCDEFG
ABCDEZ

Önerim ABCDEF  BCDEFG daha çok benzer diyecek ve mantığım hatalı.

Farkları sıfır olanların sayısını karsılastırmak gerekecek.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

#3
Aradiginiz fonksiyonun algorithmasina 'SOUNDEX' Denir Knuth'da bile olan ornekleri vardir. Benden once yazan b ir arkadasin onerdigi  Levenstein yada metaphone gibi methodlar kullanilabilir. Temel sorun bu tip yontemler daha cok Ingilizce yada Almanca gibi yabanci diller icin var. Buna ragmen Turkce icinde bazi calismalar yapilmis, ne kadar etkili olduklari tartisilir, denemek lazim.

MS yada Oracle gibi firmalar TRde sattiklari database programlarinda cok kullanildigi icin kendi databaseleri icin bu soundex fonksiyonlarini yapmislar.

Google ile 'soundex algorithm for Turkish' yada 'Turkce soundex fonksiyonu' diye ararsaniz ornekler bulacaksiniz.

mesaj birleştirme:: 18 Mart 2015, 11:45:47

bu blog'da turkce icin c# ile yapilan bir calisma var.

c# kaynak koduda konulmus bunu sizde deneyebilirsiniz.

http://www.yazilimgunlugu.com/csharp-ile-soundex-algoritmasibunu-mu-demek-istediniz-makalesi/757.aspx

Şimdi nedir Soundex algoritması nasıl çalışır ona bakalım;

Soundex algoritması gelişmiş birçok veritabanın içeriğinde hazır bir fonksiyon olarak gelen telaffuz aşamasında birbirine ses benzerliği olan kelimeleri bulmamızı sağlayan basit bir algoritmadır. Robert Russell ve Margaret Odell tarafından geliştirilmiştir. Çalışma mantığı tek bir kelime için 5 temel aşamadan oluşur. Bu aşamaları şöyle sıralayabiliriz;

1-) Kelimenin ilk harfi olduğu gibi kalır.
2-) İlk harf haricindeki harfler arasından A, E , H , I, O , U, W, Y harfleri çıkartılır.
3-) Yine ilk harf haricindeki harfler arasından aşağıdaki listeye uygun olarak harfler numaralara çevrilir.

B,F,V,P   1

C,G,J,K,Q,S,X,Z 	2

D,T   3

L  4

M,N   5

R  6

4-) Yan yana olan aynı harf yada aynı numara kümesine dahil olabilecek harfler tekile indirilir.
5-) Bu şekilde oluşturulan metin 4 haneli olana kadar eksik karakterler 0 ile tamamlanır.


static class ExtensionMethods
{
public static string Soundex(this string exp)
{
string deger = String.Empty;
if (exp.Length > 1)
{
deger = exp.Substring(0, 1);
exp = exp.Substring(1, exp.Length - 1);

exp = exp.Replace("Ğ", "G");
exp = exp.Replace("Ü", "U");
exp = exp.Replace("Ş", "S");
exp = exp.Replace("Ö", "O");
exp = exp.Replace("İ", "I");
exp = exp.Replace("Ç", "C");


exp = exp.Replace("A", "");
exp = exp.Replace("E", "");
exp = exp.Replace("H", "");
exp = exp.Replace("I", "");
exp = exp.Replace("O", "");
exp = exp.Replace("U", "");
exp = exp.Replace("W", "");
exp = exp.Replace("Y", "");

string karakter = "";
string o_karakter = "";

for (int i = 0; i < exp.Length; i++)
{
int code = new int();

karakter = exp[i].ToString();
if ("BFVP".Contains(karakter))
{
code = 1;
}
else if ("CGJKQSXZ".Contains(karakter))
{
code = 2;
}
else if ("DT".Contains(karakter))
{
code = 3;
}
else if ("L".Contains(karakter))
{
code = 4;
}
else if ("MN".Contains(karakter))
{
code = 5;
}
else if ("R".Contains(karakter))
{
code = 6;
}
if (karakter != o_karakter)
{
if (deger.Substring((deger.Length - 1), 1) != code.ToString())
{
deger += code.ToString();
}
}
if (deger.Length == 4)
{
break;
}
if (karakter != "")
{
o_karakter = karakter;
}
}
int uzunluk = deger.Length;
for (int j = 0; j < (4 - uzunluk); j++)
{
deger += "0";
}
}
return deger;
}
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

zamzam23

teşekkürler. biraz uğraşayım bakayım

mufitsozen

#5
Alıntı yapılan: z - 18 Mart 2015, 00:06:00
ABCDEF

BCDEFG
ABCDEZ

Önerim ABCDEF  BCDEFG daha çok benzer diyecek ve mantığım hatalı.

Farkları sıfır olanların sayısını karsılastırmak gerekecek.



Hocam aslinda bu tip fonksiyonlar okunusu birbirine benzer heceler olmasina gore yapilir.

Ve harfler değil, kellimelere bakilir ve tabiiki her dil iciin kurallar farkli olacaktir. Turkce bilimsel bir soundex algirithmasi/metodu calismasi yapilmismi ben bilmiyorum. Ama ornek calismalar (php, c#, MSQL, Aracle SQL, MySQL icin bazi uygulamalar var) genellikle iöüğşç gibi bize ozgun sesleri dikkate almadan yapilir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.