En Çok Kullanılan Kelimeleri Bulma

Visual C# ile bir metinde bulunan kelimelerin kullanım sıklığını bulan basit bir programın yapımını anlatacağım. Bu projeyi Doğal Dil işleme konusunda sıklıkla duyacağınız kelime derlem çalışmalarının başlangıç aşaması olarak görebilirsiniz. Yine bu projeyi temel alarak kendi kelime derlem çalışmanızı gerçekleştirebilirsiniz.11

Program basit olarak metindeki kelimeleri parçalayıp kaçar kere kullanıldıkları bilgisiyle birlikte yandaki listeye ekliyor. Ek bir özellik olarak kelimenin metindeki yerini rahat görebilmek için listeden herhangi bir kelimeyi seçince metin kutusunda o kelimeyi sarıya boyuyor.
Yapım aşamalarını adım adım anlatacağım programın yapımına yeni bir Windows Form Oluşturup Form içine bir richTextBox (name alanını metin olarak ayarladım), bir dataGridView (name alanını kelimelistesi yaptım), yine bir düğme ve toplamkelime, essizkelime ve oran isminde 3 label ekleyerek başlıyoruz.

Yukarıda bulunan resimdeki gibi bir arayüze sahip olduysanız kod yazımına başlayabiliriz.

Kodumuzu aşağıdaki gibi. Yine programın çalışabilir halinei ve kaynak kodlarınıda bu yazının sonundan ulaşabilirsiniz.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Globalization;

namespace n_gram
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        static char[] _delimiters = new char[]
            {
	        ' ',
	        ',',
	        ';',
	        '.',
            '\t',
            '\r',
            '\n',
            '\'',
            '"',
            ':',
            '-',
            '!',
            '?'
            }; //Kelimelerimizin Nerelerden Ayırılacağını buluyoruz.
        private void hesapla_Click(object sender, EventArgs e)
        {

            kelimelistesi.Rows.Clear(); //Listbox taki elemanları temizliyoruz
            //Metni küçük herfe döndürüyorum
            CultureInfo culture = CultureInfo.CurrentCulture; 
            //Daha hızlı çalışması için Kültür tanımlamasını başta yapıyoruz
            string kmetin = metin.Text.ToLower(culture);
            //Metinin Kelimelerini Ayırırp words isimli bir diziye depoluyoruz
            var words = kmetin.Split(_delimiters, StringSplitOptions.RemoveEmptyEntries);

            //Kelimelirem isimli bir dictonary oluşturuyoruz
            Dictionary<dynamic, int> kelimelerim = new Dictionary<dynamic, int>();
            //count isimli kelime sayıcı fnksiyonumuzu çağırıyoruz,
            kelimelerim = Count(words);

            //fonksiyondan gelen kelimeler ve sayılarına göre sıraya sokuyoruz
            var items = from pair in kelimelerim
                    orderby pair.Value descending
                    select pair;
            //Toplam ve eşsiz kelimeleri form üzerindeki labellere yazdırıyorum.
            toplamkelime.Text = words.Count().ToString();
            essizkelime.Text = items.Count().ToString();

            int x = words.Count() - items.Count();

            int oran = 100-((100 * x) / words.Count());
            label2.Text = "Metindeki Eşsiz kelime Oranı %" + oran;
            //sıraya soktuğumuz kelime listesini sırayla forkdaki listboxa ekliyorum.

            foreach (KeyValuePair<dynamic, int> pair in items)
            {
               string kelime =pair.Key + " : "+  pair.Value;
               kelimelistesi.Rows.Add(pair.Key, pair.Value);
            }

        }
        public static Dictionary<dynamic, int> Count(dynamic[] array)
        {

            Dictionary<dynamic, int> counts = new Dictionary<dynamic, int>();

            foreach (var item in array)
            {

                if (!counts.ContainsKey(item))
                {
                    counts.Add(item, 1);
                }
                else
                {
                    counts[item]++;
                }

            }

            return counts;
        }
        public void boya(string kelime, Color renk, Boolean tamam)
        {
            int textEnd = metin.TextLength;
            int index = 0;
            int lastIndex = metin.Text.LastIndexOf(kelime);
            kelime.ToLower();
            /*Regex reg = new Regex(kelime, RegexOptions.IgnoreCase);
            foreach (Match find in reg.Matches(metin.Text))
            {
                metin.Select(find.Index, find.Length);
                metin.SelectionColor = Color.Red;
            }*/
            metin.Text.ToLower();
            while (index < lastIndex)
            {
                if (tamam)
                {
                    metin.Find(kelime, index, textEnd, RichTextBoxFinds.WholeWord);
                }
                else
                {
                    metin.Find(kelime, index, textEnd, RichTextBoxFinds.None);
                }

                metin.SelectionBackColor = renk;
                index = metin.Text.IndexOf(kelime, index) + 1;
            }

        }

        private void kelimelistesi_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            if (e.RowIndex != -1)
            {

                RichTextBox rtbTemp = new RichTextBox();
                rtbTemp.Text = metin.Text;
                metin.Rtf = rtbTemp.Rtf;
                string cell = "";
                if (kelimelistesi.Rows[e.RowIndex].Cells[0].Value != null)
                {
                    cell = kelimelistesi.Rows[e.RowIndex].Cells[0].Value.ToString();
                }

                //string value = cell.Value.ToString();
                // MessageBox.Show(value);

                // string ara = kelimelistesi.SelectedCells.ToString();
                boya(cell, Color.Yellow, true);
                label3.Text = cell;
                kelimelistesi.Rows[e.RowIndex].Selected = true;
            }
        }
    }
}

Programın çalışır halini indirmek için burayı  n-gram

Programın kaynak kodlarını ve proje dosyalarını indirmek için burayı n-gram-kaynak-kodlar tıklamanız yeterl olacaktır.

Program la ilgili yorumlarınız bekliyorum.

 

 

Bir önceki yazımız olan Yazılım sürecinde test etme ve kullanılabilirlik. başlıklı makalemizde algoritma, kiss ve yazılım süreci hakkında bilgiler verilmektedir.

Bir Cevap Yazın

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