\

Facebook


วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2558

[ C# ] โปรแกรมคำนวน Keyword Density


อย่างที่รู้กันว่า Google จัดอันดับเว็บไซด์ด้วยความเกี่ยวข้องของเนื้อหาบทความและ keywords ที่ต้องการค้นหา ซึ่งก็มีหลายหลายเครื่องมืออยู่แล้วในท้องตลาดที่ช่วยคำนวนความถี่ของคีย์คิดเป็นเปอร์เซนต์ แต่วันนี้ผมอยากลองเขียนโปรแกรมคำนวนขึ้นมาใช้เองดูบ้างครับ

เริ่มจากการรับข้อความ string เข้ามานั้น ต้องเอาเข้าฟังชั่นตัดคำก่อน ซึ่งภาษาอังกฤษนั้นถูกสร้างขึ้นมาให้ผสมไปด้วยวรรคคำทำให้ง่ายต่อการแบ่งคำเป็นส่วนๆแตกต่างจากภาษาอื่นๆเช่นภาษาไทยที่ใช้การแบ่งคำด้วยคำในพจนานุกรมซึ่งโจทย์นั้นยากกว่ามาก จัดข้องความเข้า split() ด้วยอักษร “ ”(เว้นวรรค) เลยครับงานนี้หมูๆ

จากนั้นต้องลบคำที่ไม่เกี่ยวข้องในการคำนวนความถี่ซึ่งประกอบไปด้วย ตัวเลข อักขระพิเศษ เครื่องหมายและสัญลักษณ์ ซึ่งทั้งหมดนั้นผมวิเคราะห์โดยใช้ Case Sensitive นั้นคือการเริ่มคำด้วยอักษรตัวเล็กหรือตัวใหญ่นั้นให้ถือเป็นคนละคำ หลังจากที่เตรียมอักษรพร้อมแล้วขั้นตอนต่อไปก็คือการคิดเป็นเปร์เซนต์

จากสูตร (ความถี่ของคำ / จำนวนคำทั้งหมด) x 100 ก็จะได้ผลลัพท์ออกมาเป็นโปรแกรมคำนวน Keyword Density ตามโค๊ดตัวอย่างข้างล่างนี้

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView.DataSource = GetResult(richTextBox.Text);
            dataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridView.Update();
            textBox.Text = analyzeText.Count().ToString();
            textBoxMess.Text = countMess.ToString();
        }
        public string[] analyzeText;
        public int countMess = 0;
        private DataTable GetResult(string text)
        {
            string newText = prepareText(text);
            analyzeText = new string[] { };
            analyzeText = newText.Split(' ');
            double countWords = analyzeText.Count();
            List listResult = new List();

            foreach (string key in analyzeText)
            {
                if (key == " " || key == string.Empty || key.ToLower() == "a" ) continue;
                if (listResult.Where(it => it.key.Equals(key)).Any())
                {
                    
                    listResult.First(it => it.key.Equals(key)).freq++;
                    listResult.First(it => it.key.Equals(key)).percent = (listResult.First(it => it.key.Equals(key)).freq/countWords) * 100.0;
                    double a = listResult.First(it => it.key.Equals(key)).freq;
                }
                else
                {
                    listResult.Add(
                        new KeywordModel()
                        {
                            key = key,
                            freq = 1,
                            percent = (1.0 / countWords) * 100,
                        }
                        );
                }
            }
            DataTable dt = new DataTable();
            dt.Columns.Add("Keyword");
            dt.Columns.Add("Frequency");
            dt.Columns.Add("Percent");
            DataRow dr;
            foreach (var result in listResult.OrderByDescending(it => it.freq))
            {
                dr = dt.NewRow();
                dr[0] = result.key;
                dr[1] = result.freq;

                dr[2] = result.percent.ToString().Substring(0, result.percent.ToString().IndexOf('.') + 2) +"%";
                dt.Rows.Add(dr);
            }

            return dt;
        }
        private string prepareText(string originalText)
        {
            countMess = 0;
            string[] exceptWords = ("As ; as ; and ;And ; the ;The ;.; many ; much ;0;1;2;3;4;5;6;7;8;9;{;};(;);:;!;@;#;$;%;&;*;"
                                    +" you ;You ; of ;Of ; for ;For ; is ;Is ; are ;Are ; into ;Into ; it ;It ;"
                                    +" in ;In ; to ;To ; or ;Or ; if ;If ; with ;With ; that ;That ").Split(';');
            foreach (string c in exceptWords)
            {
                if (c != "")
                {
                    originalText = originalText.Replace(c, " ");
                    countMess++;
                }
            }
            return originalText;
        }

        public class KeywordModel
        {
            public string key { get; set; }
            public int freq { get; set; }
            public double percent { get; set; }
        }
    }
}

จากตัวอย่าง Windows Application ประกาศตัวแปร exceptWords เพื่อจัดเป็น array ของคำที่ต้องการตัดทิ้ง อย่าลืมแก้ไขกันก่อนด้วยถ้าอยากเพิ่มหรือลบคำใดเข้าไป

ปรับปรุงโค๊ดยังไง
1 เพิ่มส่วนของคำที่ไม่รวมเข้ากับการคำนวนเช่น  the, and, or
2 ปรับปรุงการ search คำแบบอื่นที่ไม่ใช่ for loop

May be like this posts