อย่างที่รู้กันว่า 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(); ListlistResult = 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