blog image

Ngram Nedir?

Özellikle hesaplamalı dilbilim (computational linguistics) ve doğal dil işleme (natural language processing – NLP) alanlarında adı sıkça anılan ngram algoritması hakkında merak ettiğiniz soruların cevaplarını sizin için derledik. Ngram hakkında detaylı bilgi edinmek ve uygulama alanlarını öğrenmek için hemen makalemize göz atın.

Hesaplamalı dilbilim  ve doğal dil işleme alanlarında yaygın kullanılması ile bilinen n-gram algoritması, özellikle Google Ngram Viewer’ın kullanıma açılmasıyla popülerliğini katladı. Ngram nedir, ne için kullanılır? Tüm bu soruların cevaplarını ve Ngram hakkında pek çok önemli bilgiyi sizin için derledik.

Ngram Algoritması Nedir?

Ngram (ya da n-gram), n adet elemandan oluşan ardışık dizilere verilen genel addır. Doğal dil işleme ve hesaplamalı dilbilim bağlamında ngramları oluşturan elemanlar, ihtiyaca ve uygulama alanına göre bir konuşma metni ya da yazılı metin içindeki kelimeler, heceler, ses birimleri ya da harfler olarak seçilebilir. Genellikle corpus olarak da bilinen derlemler içinden seçilmektedir.

Ngram algoritması ise ardışık bir dizi içindeki tekrar oranını bulmak amacıyla kullanılmaktadır. n ile ifade edilen değişken, tekrarın kontrol edildiği değeri ifade ederken, gram da tekrar edilen bu değerin dizi içindeki ağırlığına karşılık gelmektedir.

Örnek Ngram: “StarlangYazılımDanışmanlık” dizgisinin ngram değerlerine göz atalım. n değerini hesaplama kolaylığı açısından 2 harf olarak kabul edelim, yani bu dizgideki ardışık 2 elemanlı harf bloklarına göz atalım. Bu durumda “StarlangYazılımDanışmanlık” dizgisinin n=2 ile hesaplanan ngram değerleri aşağıdaki gibi olacaktır:

Bigram ve Ngram Aynı Şey Midir?

Bigram, ngramın özel bir çeşididir diyebiliriz. n sayısının büyüklüğüne göre bazı ngramlara özel isimler verilmektedir, bigramda bu isimlerden biridir. Aşağıda özel isimli ngramların bir listesini bulabilirsiniz.

  • n=1 ise unigram
  • n=2 ise bigram (digram da denmektedir)
  • n=3 ise trigram
  • n>3 ise (genellikle) ngram

Ngram Neden Kullanılır?

Ngram modelleri, ardışık bir dizinin bir sonraki elemanını (n-1) formatlı Markov zincirinden yararlanarak tahmin etmekte kullanılan bir istatistiksel dil modelidir. Günümüzde ngram modelleri, istatistiğe dayalı doğal dil işleme, hesaplamalı dilbilim, dilbilimsel modelleme, istatistik ve iletişim teorisi gibi alanlarda sıklıkla kullanılmaktadır. 

Ngram modelleri, aynı işi yapan diğer algoritma ve modellerle kıyasla ölçeklenebilir ve çok daha basit olduklarından dolayı popülerlik kazanmıştır.

n sayısı büyüdükçe bağlama dair daha fazla bilgi sağlayabilen ngramlar, küçük n sayıları ile de daha küçük çaplı deney ve modellere verimli bir şekilde uyarlanabilmektedir. Ayrıca bir ngram modeli ile doğal dillerin dizileri, istatistiksel parametreler kullanılarak modellenebilmektedir. 

Ngram, doğal dil işleme süreçlerinde pek çok farklı amaçla kullanılmaktadır. Özellikle telefonda mesaj yazarken faydalandığımız kelime tahmin özelliği (predictive text) ve otomatik düzeltme (autocorrect), ngramdan faydalanmaktadır. Örneğin “sıhhatler” kelimesini yazdıktan sonra “olsun” kelimesini öneren telefon klavyelerimiz, bu öneriyi yaparken istatistiksel veriden ve ngramdan faydalanmaktadır.

Ngram modelleri ayrıca imla düzeltme gibi görevleri gerçekleştirmek için de kullanılabilir. Mesela sadece ASCII karakterleri kullanarak yazılmış bir Türkçe metni doğru ortografiye çevirmek, yani metne ç, ı, ş, ü, ö, ğ ve İ karakterlerini eklemek için ngramdan faydalanılabilir. Diyelim ki elimizde böyle bir metin var ve bu metinde de “kir” sözcüğü geçmekte. Bu sözcüğün doğru yazılmış hali “kır” ya da “kir” olabilir. Algoritma, ‘i’ karakterini ‘ı’ya çevirmek ya da olduğu gibi bırakmak seçeneklerini değerlendirirken bu sözcükten önce ve sonra gelen sözcüklere bakarak doğru kararı almak adına ngram modellerinden faydalanabilir. 

Bunlara ek olarak ngram SVM, Naive Bayes, MaxEnt modelleri gibi makine öğrenmesi modellerinde de kullanılmaktadır. 

Ngram Phyton’da Kullanılır Mı?

Evet! Ngram, Python’da kodlanabileceği gibi Java’da da kodlanabilir. Cümle düzeyinde ngram üretmek için aşağıdaki Python ve Java kodlarını deneyebilirsiniz. 

Phyton ile

import re
 
def generate_ngrams(text,n):
 
    # split sentences into tokens
    tokens=re.split("\\s+",text)
    ngrams=[]
 
    # collect the n-grams
    for i in range(len(tokens)-n+1):
       temp=[tokens[j] for j in range(i,i+n)]
       ngrams.append(" ".join(temp))
 
    return ngrams

Java ile

private static void generateNgrams(int N, String sent, List ngramList) {
  String[] tokens = sent.split("\\s+"); //split sentence into tokens
 
  //GENERATE THE N-GRAMS
  for(int k=0; k<(tokens.length-N+1); k++){
    String s="";
    int start=k;
    int end=k+N;
    for(int j=start; j<end; j++){
     s=s+""+tokens[j];
    }
    //Add n-gram to a list
    ngramList.add(s);
  }
}//End of method

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir