Metin İçindeki En Çok Kullanılan Kelimeleri Bulma

0 135

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.

Kelime Sıklığı Bulma Programı
Kelime Sıklığı Bulma Programı

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.

[wpdm_package id=’243′]

Kodumuzu aşağıdaki gibi. Yine programın çalışabilir haline 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;
            }
        }
    }
}

[wpdm_package id=’243′]

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bununla iyi olduğunuzu varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul etmek Mesajları Oku