ทำไมโปรแกรมนับคำถึงนับภาษาไทยผิด
ภาษาไทยไม่เว้นวรรคระหว่างคำ การนับด้วยการแยกช่องว่างจึงให้ผลผิด และการนับตัวอักษรก็ไม่ได้มีคำตอบเดียว
ลองวางข้อความไทยลงในโปรแกรมนับคำสักตัวหนึ่ง แล้วดูตัวเลขที่ได้ ถ้ามันขึ้นว่า “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 คำต่อนาที
ปัญหาคือ “คำ” ในภาษาไทยหลังตัดคำแล้วมักสั้นกว่าคำภาษาอังกฤษ การเอาอัตราของภาษาอังกฤษมาใช้ตรง ๆ จึงทำให้เวลาอ่านภาษาไทยดูนานเกินจริง เราปรับตัวเลขขึ้นให้สอดคล้องกับลักษณะของภาษามากขึ้น แต่ต้องบอกตามตรงว่ามันคือค่าประมาณที่ปรับตามเหตุผล ไม่ใช่ตัวเลขที่มีงานวิจัยรองรับ
ใช้มันเป็นตัวเปรียบเทียบความยาวระหว่างบทความได้ แต่อย่าใช้เป็นตัวเลขที่ต้องแม่นยำ
การนับประโยคภาษาไทยยากกว่าที่คิด
ภาษาอังกฤษจบประโยคด้วยจุด เครื่องหมายคำถาม หรืออัศเจรีย์ ซึ่งนับได้ค่อนข้างแม่น
ภาษาไทยไม่ใช้จุดจบประโยค แต่ใช้การเว้นวรรค ปัญหาคือเราก็เว้นวรรคระหว่างวลี หลังคำเชื่อม และหน้าชื่อเฉพาะด้วยเหมือนกัน ไม่มีกฎง่าย ๆ ที่แยกสองอย่างนี้ออกจากกันได้
ลองดูประโยคนี้:
วันนี้อากาศดีมาก ผมไปเดินเล่นที่สวนสาธารณะ แล้วก็กลับบ้าน
คนอ่านเห็นเป็นสามประโยค นับจุดได้ศูนย์ นับช่องว่างได้สาม ส่วนระบบตัดประโยคมาตรฐานตอบว่าหนึ่ง — ทั้งสามวิธีให้คำตอบไม่ตรงกันสักวิธี
ด้วยเหตุนี้ เครื่องมือของเราจึงแสดงคำเตือนว่าจำนวนประโยคเป็นค่าประมาณเมื่อเจอข้อความภาษาไทย เครื่องมือไหนที่บอกจำนวนประโยคภาษาไทยแบบชี้ชัดโดยไม่มีข้อแม้ คือกำลังเดาให้คุณโดยไม่บอก
ลองด้วยข้อความของคุณเอง
เครื่องมือนับคำและตัวอักษร ใช้การตัดคำไทยจริงและนับตัวอักษรตามที่ตาเห็น พร้อมแสดงจำนวนหน่วยเก็บข้อมูลแยกไว้ให้สำหรับคนที่ต้องใช้
ทุกอย่างทำงานในเบราว์เซอร์ของคุณ ข้อความที่วางลงไปไม่ถูกส่งออกไปที่ใด ซึ่งสำคัญถ้าสิ่งที่คุณกำลังนับคือร่างงานที่ยังไม่เผยแพร่