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


ไม่มีความคิดเห็น:
แสดงความคิดเห็น