Toolora

ทำไมโปรแกรมนับคำถึงนับภาษาไทยผิด

ภาษาไทยไม่เว้นวรรคระหว่างคำ การนับด้วยการแยกช่องว่างจึงให้ผลผิด และการนับตัวอักษรก็ไม่ได้มีคำตอบเดียว

ลองวางข้อความไทยลงในโปรแกรมนับคำสักตัวหนึ่ง แล้วดูตัวเลขที่ได้ ถ้ามันขึ้นว่า “1 คำ” ทั้งที่คุณพิมพ์ไปทั้งประโยค นั่นไม่ใช่ความผิดพลาดชั่วคราว แต่เป็นวิธีทำงานของเครื่องมือส่วนใหญ่ที่ไม่เคยถูกออกแบบมาให้รองรับภาษาไทยตั้งแต่แรก

ภาษาไทยไม่เว้นวรรคระหว่างคำ

ภาษาอังกฤษแยกคำด้วยช่องว่าง โปรแกรมนับคำจึงทำงานง่ายมาก แค่ตัดข้อความตรงช่องว่างแล้วนับจำนวนชิ้น วิธีนี้ใช้ได้ผลกับภาษาที่เขียนติดกันไม่ได้

ภาษาไทยเขียนติดกันทั้งประโยค ช่องว่างในภาษาไทยไม่ได้แบ่งคำ แต่ใช้แบ่งวลีหรือจบประโยค เมื่อโปรแกรมที่ออกแบบมาสำหรับภาษาอังกฤษเจอข้อความไทย มันจึงเห็นเป็นก้อนเดียว

ข้อความ แยกด้วยช่องว่าง ตัดคำจริง
สวัสดีครับผมชื่อโทลอร่า 1 คำ 7 คำ
วันนี้อากาศดีมาก 1 คำ 5 คำ
ฉันไปตลาดเมื่อเช้านี้ 1 คำ 6 คำ

ตัวเลขทางซ้ายคือสิ่งที่คุณจะได้จากเครื่องมือทั่วไป ส่วนทางขวาคือจำนวนคำจริง ความต่างไม่ใช่เรื่องเล็กน้อย แต่ผิดกันหลายเท่า

เรื่องนี้สำคัญเมื่อคุณต้องเขียนงานที่มีเกณฑ์จำนวนคำ ทั้งงานส่งอาจารย์ บทความที่ลูกค้ากำหนดความยาว หรือคำบรรยายสินค้าที่มีข้อจำกัด การนับผิดตั้งแต่ต้นทำให้คุณเขียนสั้นหรือยาวเกินไปโดยไม่รู้ตัว

การตัดคำที่ถูกต้องทำงานอย่างไร

เมื่อไม่มีช่องว่างให้ยึด โปรแกรมต้องเดาว่าขอบเขตของแต่ละคำอยู่ตรงไหน วิธีที่ใช้กันคืออาศัยพจนานุกรม โปรแกรมจะลองแบ่งข้อความหลาย ๆ แบบ แล้วเลือกแบบที่ประกอบขึ้นจากคำที่มีอยู่จริงในพจนานุกรมได้ลงตัวที่สุด

เบราว์เซอร์สมัยใหม่มีความสามารถนี้ติดตัวมาแล้ว ผ่านมาตรฐานที่ชื่อ Intl.Segmenter ซึ่งใช้ฐานข้อมูล ICU อันเดียวกับที่ระบบปฏิบัติการใช้ตัดคำไทย นั่นแปลว่าการตัดคำที่ดีไม่จำเป็นต้องส่งข้อความของคุณไปประมวลผลที่เซิร์ฟเวอร์ไหนเลย

แต่มันก็ไม่ได้สมบูรณ์แบบ

การตัดคำด้วยพจนานุกรมทำงานได้ดีมากกับภาษาทั่วไป แต่มีจุดอ่อนที่ควรรู้ไว้ คือคำที่ไม่อยู่ในพจนานุกรม ทั้งชื่อคน ชื่อแบรนด์ คำทับศัพท์ใหม่ ๆ และคำเฉพาะทาง

ตัวอย่างที่ตรงที่สุดคือชื่อเว็บนี้เอง คำว่า โทลอร่า ไม่มีในพจนานุกรม ICU ระบบจึงตัดออกเป็นสามชิ้น:

โท | ล | อร่า

นั่นคือเหตุผลที่ตารางด้านบนแสดง สวัสดีครับผมชื่อโทลอร่า เป็น 7 คำ ทั้งที่คนอ่านจะนับได้ 5 คำ เพราะชื่อแบรนด์ถูกแยกเป็นสามส่วน

เราเลือกที่จะบอกเรื่องนี้ตรง ๆ มากกว่าปล่อยให้คุณไปเจอเอง เพราะถ้างานของคุณมีชื่อเฉพาะเยอะ ตัวเลขจะสูงกว่าความจริงเล็กน้อยเสมอ ไม่มีเครื่องมือตัวไหนแก้ปัญหานี้ได้หมด นอกจากจะเพิ่มคำเหล่านั้นเข้าพจนานุกรมเอง

การนับตัวอักษรก็ไม่ได้มีคำตอบเดียว

คำถามว่า “ข้อความนี้มีกี่ตัวอักษร” ฟังดูตรงไปตรงมา แต่จริง ๆ แล้วมีคำตอบที่ถูกต้องอยู่สามแบบ

  • หน่วยเก็บข้อมูล (code unit) คือตัวเลขที่โปรแกรมเมอร์ได้จากการเรียก .length เป็นวิธีที่คอมพิวเตอร์เก็บข้อความไว้ในหน่วยความจำ
  • จุดรหัส (code point) คือจำนวนอักขระตามมาตรฐาน Unicode
  • ตัวอักษรที่ตาเห็น (grapheme) คือสิ่งที่คนทั่วไปเรียกว่า “หนึ่งตัวอักษร”

สามอย่างนี้ให้ตัวเลขต่างกันได้มาก และภาษาไทยคือกรณีที่ต่างชัดที่สุด เพราะสระและวรรณยุกต์ของไทยเป็นอักขระแยกที่ไปเกาะอยู่บนพยัญชนะตัวเดียวกัน

ข้อความ หน่วยเก็บข้อมูล จุดรหัส ตาเห็น
ที่ 3 3 1
เพื่อน 6 6 4
👨‍👩‍👧‍👦 11 7 1

คำว่า ที่ คนไทยทุกคนอ่านว่าหนึ่งตัวอักษร แต่คอมพิวเตอร์เห็นเป็นสามชิ้น คือ ท + สระอี + ไม้เอก ส่วนอิโมจิครอบครัวนั้นเป็นอิโมจิสี่ตัวเชื่อมกันด้วยอักขระพิเศษ กลายเป็น 11 หน่วยในหน่วยความจำ แต่ตาเห็นเป็นรูปเดียว

เมื่อเครื่องมือสองตัวให้จำนวนตัวอักษรไม่ตรงกัน มักไม่ใช่เพราะตัวใดตัวหนึ่งผิด แต่เพราะทั้งสองตอบคนละคำถามกัน

ขีดจำกัดที่ควรรู้จริง ๆ

SMS คือกรณีที่กระทบกระเป๋าเงินโดยตรง ข้อความ SMS ภาษาอังกฤษล้วนส่งได้ 160 ตัวอักษรต่อหนึ่งข้อความ เพราะใช้ตารางอักขระแบบ GSM-7 ที่บีบอัดได้

แต่ตารางนั้นไม่มีตัวอักษรไทย พอมีอักษรไทยแม้แต่ตัวเดียว ระบบต้องเปลี่ยนไปใช้การเข้ารหัสแบบ UCS-2 ซึ่งกินพื้นที่มากกว่า ทำให้เหลือ 70 ตัวอักษรต่อข้อความ เท่านั้น

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

นี่คือสาเหตุที่ค่า SMS ภาษาไทยแพงกว่าที่หลายคนคาดไว้ และเป็นเหตุผลที่ควรนับตัวอักษรก่อนส่งข้อความจำนวนมาก

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

เวลาอ่านเป็นเพียงค่าประมาณ

ตัวเลข “อ่านจบใน X นาที” ที่เห็นตามเว็บ มาจากธรรมเนียมของวงการสิ่งพิมพ์ภาษาอังกฤษ ซึ่งใช้ราว 200 คำต่อนาที

ปัญหาคือ “คำ” ในภาษาไทยหลังตัดคำแล้วมักสั้นกว่าคำภาษาอังกฤษ การเอาอัตราของภาษาอังกฤษมาใช้ตรง ๆ จึงทำให้เวลาอ่านภาษาไทยดูนานเกินจริง เราปรับตัวเลขขึ้นให้สอดคล้องกับลักษณะของภาษามากขึ้น แต่ต้องบอกตามตรงว่ามันคือค่าประมาณที่ปรับตามเหตุผล ไม่ใช่ตัวเลขที่มีงานวิจัยรองรับ

ใช้มันเป็นตัวเปรียบเทียบความยาวระหว่างบทความได้ แต่อย่าใช้เป็นตัวเลขที่ต้องแม่นยำ

การนับประโยคภาษาไทยยากกว่าที่คิด

ภาษาอังกฤษจบประโยคด้วยจุด เครื่องหมายคำถาม หรืออัศเจรีย์ ซึ่งนับได้ค่อนข้างแม่น

ภาษาไทยไม่ใช้จุดจบประโยค แต่ใช้การเว้นวรรค ปัญหาคือเราก็เว้นวรรคระหว่างวลี หลังคำเชื่อม และหน้าชื่อเฉพาะด้วยเหมือนกัน ไม่มีกฎง่าย ๆ ที่แยกสองอย่างนี้ออกจากกันได้

ลองดูประโยคนี้:

วันนี้อากาศดีมาก ผมไปเดินเล่นที่สวนสาธารณะ แล้วก็กลับบ้าน

คนอ่านเห็นเป็นสามประโยค นับจุดได้ศูนย์ นับช่องว่างได้สาม ส่วนระบบตัดประโยคมาตรฐานตอบว่าหนึ่ง — ทั้งสามวิธีให้คำตอบไม่ตรงกันสักวิธี

ด้วยเหตุนี้ เครื่องมือของเราจึงแสดงคำเตือนว่าจำนวนประโยคเป็นค่าประมาณเมื่อเจอข้อความภาษาไทย เครื่องมือไหนที่บอกจำนวนประโยคภาษาไทยแบบชี้ชัดโดยไม่มีข้อแม้ คือกำลังเดาให้คุณโดยไม่บอก

ลองด้วยข้อความของคุณเอง

เครื่องมือนับคำและตัวอักษร ใช้การตัดคำไทยจริงและนับตัวอักษรตามที่ตาเห็น พร้อมแสดงจำนวนหน่วยเก็บข้อมูลแยกไว้ให้สำหรับคนที่ต้องใช้

ทุกอย่างทำงานในเบราว์เซอร์ของคุณ ข้อความที่วางลงไปไม่ถูกส่งออกไปที่ใด ซึ่งสำคัญถ้าสิ่งที่คุณกำลังนับคือร่างงานที่ยังไม่เผยแพร่