บันทึกการสร้างแป้นพิมพ์ไทย Manoonchai (2) : สร้าง Typing Effort Model เพื่อให้คะแนนความ “พิมพ์ง่าย”
หลังจากที่เราได้กำหนดสเปคของตัวแป้นพิมพ์แล้วในตอนที่ 1 ซึ่งส่วนสำคัญในการสร้างตัวแป้นพิมพ์จะแบ่งออกเป็น 2 ส่วนคือ
- Model เพื่อนำชุดคำไปประมวลผล
- ชุดคำ และบทความภาษาไทย
ในโพสนี้เราจะมาสร้าง Model นี้ขึ้นมา โดยหลักการแทบทั้งหมดจะนำมาจากโครงการ Carpalx
Carpalx
หลักการของ Carpalx คือการคำนวนความ “พิมพ์ง่าย” ของแป้นพิมพ์ ซึ่งความพิมพ์ง่ายหรือ Low Typing Effort นั้นผู้สร้าง Carpalx ได้สรุปไว้ดังนี้
- ลดการใช้งานนิ้วที่ไม่แข็งแรง (นิ้วก้อย, นิ้วนาง พิมพ์ยากกว่านิ้วกลาง, นิ้วชี้)
- เน้นการใช้งานแป้นเหย้า (Home Row) ซึ่งลดการขยับของนิ้วและมือในการพิมพ์
- ลดการใช้นิ้วซ้ำกันในการพิมพ์ เช่นคำว่า “ที่” ในแป้นเกษมณีใช้นิ้วเดียวกันทั้งหมด ซึ่งจะทำให้พิมพ์ยากกว่าการเฉลี่ยให้ใช้นิ้วอื่นๆ ด้วย
- เฉลี่ยการพิมพ์ด้วยมือซ้ายให้เท่ากันกับมือขวา (แป้นเกษมณีจากการสำรวจใช้มือขวามากกว่ามือซ้าย ในอัตราส่วน 70:30
- การสลับมือในการพิมพ์คำ (ส่วนนี้ยังเป็นที่ถกเถียงกันอยู่ แต่ผู้สร้าง Carpalx เชื่อว่าการพิมพ์แบบ Hand rolling in ที่ไล่นิ้วจากด้านนอกเข้าสู่ด้านใน จะใช้ Effort ต่ำกว่าการสลับมือ เช่น “qwer” พิมพ์ง่ายกว่า “qowp”)
และจากหลักการเหล่านี้จะต้องนำมาประมวลผลร่วมกับตัวชุดคำภาษาไทยด้วย โดยมีหลักดังนี้
- แบ่งคำหรือบทความออกเป็น Triads หรือทุกๆ สามอักขระ เช่น “ประเทศไทย” จะถูกแบ่งเป็น 7 Triads :
ประ
,ระเ
,ะเท
,เทศ
,ทศไ
,ศไท
,ไทย
การแบ่งเช่นนี้จะทำให้เราแยกแยะได้ว่าแต่ละตัวอักษรถูกพิมพ์ร่วมกับตัวอักษรอื่นใดบ้าง - นำ Triads จากข้อแรกมานับความถี่ว่าถูกใช้บ่อยแค่ใน ส่วนนี้จะทำให้าเรียงลำดับความสำคัญของตัวอักษรรวมถึงการพิมพ์ร่วมกับตัวอื่นๆ เพื่อในการสร้างจะได้ไม่เผลอนำไปอยู่ในคอลัมน์เดียวกัน (เช่นคำว่า “ที่”) ซึ่งจะทำให้เกิด Effort ในการพิมพ์สูงขึ้น
จากโมเดลแป้นพิมพ์ดังกล่าว เมื่อร่วมกับข้อมูลที่นำเข้าไป จะคำนวณออกมาเป็น Typing Effort รวมและเป็นตัวบ่งชี้ว่าแป้นพิมพ์นั้นพิมพ์ง่ายหรือไม่
ผลของ Carpalx นั้นแสดงให้เห็นว่า แป้นภาษาอังกฤษ Colemak และ Dvorak นั้นมี Typing Effort ต่ำกว่า Qwerty เป็นอย่างมาก
แล้วในกรณีของภาษาไทยล่ะ?
Thai Carpalx
เนื่องจาก Carpalx นั้นทำเพื่อ Optimize แป้นพิมพ์ภาษาอังกฤษ ที่ตัวอักษรมีแค่ 26 ตัวและตัวพิมพ์ใหญ่อยู่ปุ่มเดียวกับตัวพิมพ์เล็ก ทำให้การคำนวณผลไม่มีเรื่องของ Effort ในการกดปุ่ม Shift เลย เหตุนี้ผมจึงสร้าง Carpalx-th เพื่อเพิ่มความสามารถในการคำนวณ Effort ของตัวอักษรที่ต้องกด Shift ร่วมด้วย โดยผมได้ตั้งคะแนน Effort ของ Triads ไว้ดังนี้
- ถ้าไม่มีการกด Shift เลย : 0 คะแนน (พิมพ์ง่ายที่สุด)
- กด Shift 1 ใน 3 ตัวอักษร : 1 คะแนน
- กด Shift ทั้ง 3 ตัวอักษร : 2 คะแนน
- กด Shift 2 ใน 3 ตัวอักษร แบบ Monotonic (
sSS
หรือSSs
) : 2 คะแนน - กด Shift 2 ใน 3 ตัวอักษร แบบ Non-monotonic (
SsS
) : 3 คะแนน (พิมพ์ยากที่สุด เพราะต้องปล่อยและกด Shift ใหม่)
โค้ดทั้งหมดที่เขียนจะเป็น JavaScript และ TypeScript ซึ่งข้อดีคือสามารถ Import มารันบนเว็บได้ด้วย ตัวโค้ดอยู่ที่นี่ https://github.com/Manoonchai/carpalx-th
เตรียมข้อมูล
เมื่อมีโมเดลแล้ว ขั้นต่อไปจะเป็นการหาคลังคำและบทความเพื่อมาสร้าง Triads ซึ่งผมนำข้อความจากหลายๆ แหล่งมาใช้ เพื่อเฉลี่ยและลดความ Bias ของข้อมูลไปด้วย แหล่งของข้อมูลที่เลือกใช้มีดังนี้
- 5,000 คำที่ใช้บ่อย จากคลังข้อมูลภาษาไทยแห่งชาติ ภาควิชาภาษาศาสตร์คณะอักษรศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย
- Wongnai Corpus จากวงใน แอปรีวิวร้านอาหาร
- Wisesight Sentiment Corpus จากกลุ่ม PyThaiNLP
- ThaiSum ชุดข้อมูลจากเว็บไซต์ไทยรัฐ, ไทยพีบีเอส, ประชาไท และ เดอะแสตนดาร์ด
- ทวีตภาษาไทยที่ Scrape ด้วย Twint และใช้ Manoonchai/triads_extractor ในการดึง Triads จากข้อมูลมากกว่า 10 GB (ตัวนี้ทำหลังจากได้ Manoonchai v0.3 แล้ว ถือว่าเป็น Validate Dataset ว่า Layout ใช้จริงใน Social Network ได้ดีหรือไม่)
เมื่อทำการสร้าง Triads แล้วจะได้ข้อมูลพร้อมความถี่ เพื่อใช้ในการหา Typing Effort ต่อไป
เริ่ม Optimize!
มาถึงจุดที่เราจะนำ Carpalx มาใช้แล้ว! นั่นคือเอา Triads ทั้งหมดมารันกับโมเดล โดยเริ่มจากแป้นเกษมณีและปัตตโชติก่อน
จากผลที่รันพบว่า จาก Dataset สี่อย่าง โดยเฉลี่ยแล้วปัตตโชติมี Effort ต่ำกว่าเกษมณีถึง 18.68%
ฉะนั้นหากเราอยากได้ Layout ที่ดีกว่าปัตตโชติ ก็ควรที่จะทำให้มี Effort ที่ตำ่กว่านี้อีก ซึ่งเราจะทำได้ด้วยการค่อยๆ ทดลองสลับปุ่ม และหาค่า Effort ใหม่ว่าดีขึ้นหรือไม่
จากโค้ดที่ผมทำเป็น TypeScript ทำให้ผมสามารถเขียนเว็บมาครอบตัว Carpalx-th และทำการคำนวณ Effort จากบนหน้าเว็บได้เลย ที่ Manoonchai Layout Analyzer (Source code : https://github.com/Manoonchai/layout-analyzer)
แต่การที่เราจะมานั่งเดาว่าตัวไหนอยู่ที่ไหนแล้ว Effort ต่ำก็คงจะใช้เวลานานเกินไป เราก็เลยใช้โค้ดสุ่มเสียเลย โดยตัว Carpalx หลักก็มีการสุ่มหา Layout เหมือนกันโดยจะใช้วิธี Simulated Annealing (รายละเอียดทางเทคนิคดูจาก Dev Log Twitter Thread)
จากการสุ่มหามากกว่า 100 ล้านครั้ง ทำให้ได้แป้นพิมพ์ Manoonchai v0.3 ที่มีค่า Effort ตำ่กว่าแป้นเกษมณีถึง 45%!
ในตอนถัดไป เราจะมาวิเคราะห์ตัวแป้น Manoonchai กัน แต่ถ้าใครอยากลองพิมพ์ ให้ไปทดลองพิมพ์เล่นดูได้ที่เว็บ manoontype.web.app โดยไม่ต้องติดตั้ง Layout ลงบนเครื่อง
สามารถติดตามตอนต่อไปได้ด้วยการกด Follow ผมไว้ และกดปรบมือ 👏 เยอะๆ เป็นกำลังใจด้วยครับ 🤗
และดู Dev Log ได้ใน Twitter Thread นี้ รวมถึงผลของการได้ทดลองใช้แป้นพิมพ์ Manoonchai แล้วประมาณ 2–3 อาทิตย์ครับ
Edit : อ่านต่อ ตอนที่ 3