Ö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 (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, 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.
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.
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.
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
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