Bir veri üzerinde arama yapmak, karşılaştırma yapmak veya tekrar sayısını saptayabilmek için kullanılan bir yöntemdir. Bu yöntem bir çeşit algoritma olarak da bilinebilir.
n-gram ne demektir?
n-gram ifadesinde yer alan n, tekrar derecesini ifade etmektedir. Yani kaçar kaçar böleceğimizi buradaki n ifadesi sağlar. gram ise ağırlığı ifade etmektedir. Yani bir kelimeden ne kadar olduğunu anlamamızı sağlar.
n değerleri temelde 4 başlığa ayrılırlar. Bunlar;
- 1-Gram : unigram
- 2-Gram : bigram
- 3-Gram : trigram
- N-Gram : n-gram
3'ten sonraki tüm parçalamalarda n-gram ifadesi kullanılmaktadır.
Nerelerde Kullanılır?
n-gram, temelde arama algoritmalarında kullanılmaktadır. Aranan kelime ile eldeki veriyi karşılaştırırken net sonuçlar vermek adına tercih edilebilir. Çünkü n-gram bize tekrar eden kelimeleri göstermektedir. Bu sayede bir oran yakalayabiliriz. Bu orana bağlı olarak aranan kelime ile eldeki veri arasında bir benzerlik sayısı çıkartabilir, bu benzerlik sayısına göre de kullanıcıya veriyi gösterebiliriz.
Harf Bazlı N-Gram
Aşağıdaki örnekleri çözümlerken;
metin adında bir değişkene ve merttopuzcom adında bir değere sahip olduğumuzu varsayalım.
$metin: "merttopuzcom"
Unigram
Unigram aslında bir metni harf harf bölmek demektir.
m
e
r
t
t
o
p
u
z
c
o
m
şeklinde bir çıktıya sahip olabiliriz.
Bigram
Bigram, en çok kullanılan yöntemdir. Bu yöntemde metni ikişer olarak parçalamaya yarar.
me
er
rt
tt
to
op
pu
uz
zc
co
om
Görüldüğü üzere harf atlayarak tek tek alınır.
Trigram
Trigram'da bigram gibi çok tercih edilen bir diğer çeşittir. Aynı şekilkde üçlü olarak parçalar.
mer
ert
rtt
tto
top
opu
puz
uzc
zco
com
Kod
PHP ile aşağıdaki gibi en temel kodu oluşturabiliriz.
$metin = "merttopuzcom";
$ngram = 2;
for ($i=0; $i < strlen($metin); $i++) {
$bitis = $i+$ngram-1;
for ($j=$i; $j <= $bitis; $j++) {
if (isset($metin[$bitis])) {
echo $metin[$j];
}
}
echo "<br/>";
}
Yukarıdaki kod parçasında;
- metin değişkeni kontrol edilecek metni içerir.
- ngram değişkenine girilen değere göre parçalama yapılmaktadır.
Fonksiyonu geliştirip ekrana yazdırmak yerine bir array yardımı ile farklı bir metin ile karşılaştırabilirsiniz.
Kelime Bazlı N-Gram
Örneklerde parçalama yaparken harf baz alınmaktadır. Aynı işlemi kelimeyi baz alarakta yapabiliriz. Yani;
Elimizde metin adında bir değişken ve değeri aşağıdaki gibi olsun;
$metin = "Bu makale ile ngram kavramini ogrendik"
Unigram
Bu
makale
ile
ngram
kavramini
ogrendik
Bigram
Bu makale
makale ile
ile ngram
ngram kavramini
kavramini ogrendik
Trigram
Bu makale ile
makale ile ngram
ile ngram kavramini
ngram kavramini ogrendik
Kod
Yine PHP ile aynı mantıkta bir parçalama fonksiyonu oluşturabiliriz;
$metin = "Bu makale ile ngram kavramini ogrendik";
$metinBol = explode(" ", $metin);
$ngram = 2;
for ($i=0; $i < count($metinBol); $i++) {
$bitis = $i+$ngram-1;
for ($j=$i; $j <= $bitis; $j++) {
if (isset($metinBol[$bitis])) {
echo $metinBol[$j];
}
echo " ";
}
echo "<br/>";
}
Yukarıdaki kod parçasında;
- metin değişkeni bize metni verir.
- metinBol değişkeni boşluklardan ayırmamızı sağlar
- ngram değişkeni her parçadaki adeti belirler.
Harf Bazlı N-Gram'da olduğu gibi fonksiyonu geliştirerek dizileri ele alıp karşılaştırmalarda kullanabilirsiniz.
İyi çalışmalar.