C# Linq ileKelime( Word ) Histogram Oluşturma

10 Tem

Konuya direk dalmadan önce histogramın ne olduğunu açıklamadan geçmek istemiyorum. Histogram, bir topluluktaki elemanların sayısal sıklıklarını, yoğunluklarını belirten tablolar diyebiliriz. Gösterim şekli olarak genelde grafiksel bir gösterimi vardır. İsterseniz tablo şeklinde de tutabilirsiniz. Ancak Grafiksel gösterimler daha akılda kalıcıdır.

Histogramı c# tarafında özetleyecek bir kelime analiz uygulamasının uygun olacağını düşündüm. Bu amaçla, bir döküman içerisindeki kelimelerin hangi sıklıklarla kullanıldığını çıkaran bir uygulama yapmayı planladım.

Uygulamaya başlarken öncelikle bir analiz yapan sınıf tasarlamam gerektiğine karar verdim. Analyzer adında bir sınıf oluşturarak işe başladım. Bu sınıf içerisinde de verilen text ifadenin kelimelerine ait bir histogram tablosu çıkaran GetTextHistogram adında metod oluşturdum.


public class Analyzer
{

    public IEnumerable<AnalyzeItem> GetTextHistogram(string text)
    {

       var array = text.Split(' ');
       var result = array.GroupBy(i => i.ToLower())
                         .Select(i => new AnalyzeItem { Word = i.Key, Count = i.Count() });

        return result;

    }

}

public class AnalyzeItem
{
      public string Word { get; set; }
      public int Count { get; set; }
}

Örneği incelediğimizde kelimelerin tekrarlanış miktarını veren bir tip olan AnalyzeItem tipi de göze çarpmakta. Bu tip hangi kelimenin kaç kez tekrar ettiğini bize vermekte. Örneğin  “bayram” kelimesinin kaç defa tekrar edildiğinin sonucunu tutmaktadır.

Burada LINQ nimetlerinden de faydalanmadan yapamadım. Eğer LINQ olmasaydı dizilerle kırk takla atarak sonuca ulaşmaya çalışacaktık.

Programın kullanımı da şu şeklide olacaktır.

static void Main(string[] args){

      string text = "Merhaba syn Ali Veli, size uygun şartlarda kredi imkanı ABCBANK ta. ABCBANK www.abcbank.com da. Kredi almak istiyorsanız ABCBANK a gelin.";

      Analyzer analyzer = new Analyzer();

      var data = analyzer.GetTextHistogram(text);

      foreach (var item in data)
      {
         Console.WriteLine(item.Count + "\t" + item.Word);

      }

}

Dilerseniz uygulamayı bir extension method haline de getirebilirsiniz. Onu da şu şeklide yapmak mümkündür.


public static class Extensions
{
    public static IEnumerable<AnalyzeItem> Histogram(this string text)
    {
       var array = text.Split(' ');
       var result = array.GroupBy(i => i.ToLower())
                         .Select(i => new AnalyzeItem { Word = i.Key, Count = i.Count() });

       return result;
    }

}

Bu extension metodla kodun kullanımı epeyce değişiyor.

static void Main(string[] args)
{
     string text = "Merhaba syn Ali Veli, size uygun şartlarda kredi imkanı ABCBANK ta. ABCBANK www.abcbank.com da. Kredi almak istiyorsanız ABCBANK a gelin.";

     foreach (var item in text.Histogram())
     {
           Console.WriteLine(item.Count + "\t" + item.Word);

     }
}

Artık bütün string tiplere histogram uyglamak mümkün hele geldi.