2 กันยายน 2569 · อ่าน 2 นาที
การตัดคำภาษาไทยคืออะไร และทำไมจึงกำหนดผลของการแปล เสียงพูด และการค้นหา
การตัดคำภาษาไทยคือการหาขอบเขตคำในข้อความที่เขียนติดกันโดยไม่เว้นวรรค และทำไมมันจึงกำหนดผลการแปล การเว้นจังหวะเสียงพูด ไทม์สแตมป์ และการค้นหา
การตัดคำภาษาไทยคือขั้นตอนหาว่าคำหนึ่งจบตรงไหนและคำถัดไปเริ่มตรงไหน ในข้อความที่เขียนติดกันโดยไม่เว้นวรรคระหว่างคำ ทุกระบบที่รับภาษาไทย ไม่ว่าจะแปล อ่านออกเสียง ทำดัชนี หรือใส่เวลาให้ข้อความ ต้องผ่านขั้นตอนนี้ก่อนจึงจะทำงานของตัวเองได้
ในภาษาอังกฤษขั้นตอนนี้มองไม่เห็น เพราะช่องว่างทำงานให้เสร็จแล้ว ในภาษาไทยช่องว่างมีอยู่จริงแต่มีความหมายอีกอย่าง บทความนี้อธิบายว่าช่องว่างในภาษาไทยหมายถึงอะไร แสดงสายอักขระที่ตัดได้สองแบบ แล้วตามรอยการตัดผิดหนึ่งครั้งไปดูผลในคำแปล ประโยคที่อ่านออกเสียง ไฟล์ซับไตเติล และดัชนีค้นหา
ทำไมภาษาไทยไม่เว้นวรรคระหว่างคำ#
ภาษาไทยเขียนคำในวลีเดียวกันติดกันไปตลอด ผมกินข้าวที่ร้านอาหารไทย เป็นหกคำสำหรับคนไทย และเป็นโทเคนเดียวสำหรับฟังก์ชันที่แยกข้อความด้วยช่องว่าง ตัวอักษรช่องว่างถูกเก็บไว้ใช้กับหน่วยที่ใหญ่กว่า มันบอกจุดจบของวลีหรืออนุประโยค ซึ่งเป็นหน้าที่ของจุลภาคหรือมหัพภาคในภาษาอังกฤษ และปรากฏน้อยกว่าที่คนอ่านภาษาอังกฤษคาดไว้มาก
ธรรมเนียมนี้เก่าและสม่ำเสมอ ตัวเลข ชื่อเฉพาะ และคำต่างประเทศบางครั้งมีช่องว่างขนาบสองข้าง คำลงท้ายประโยคบางครั้งก็ยืนแยกออกมา แต่คำที่อยู่ในวลีเดียวกันไม่เคยเว้นวรรค คนอ่านเรียนรู้ที่จะหาขอบเขตจากคลังคำและบริบท แบบเดียวกับที่คนอ่านภาษาอังกฤษรู้ว่า lead ในประโยคนั้นหมายถึงความหมายไหน
คำภาษาไทยสั้น บนคลังข้อมูล BEST2010 คำภาษาไทยยาวเฉลี่ย 3.855 ตัวอักษร (COLING (2014)) และเว็บไซต์นี้ปัดเป็น 4 เมื่อแปลงจำนวนคำเป็นจำนวนตัวอักษรที่คิดค่าบริการ ย่อหน้าร้อยคำจึงเป็นสายอักขระราวสี่ร้อยตัวที่มีช่องว่างอยู่ราวสามจุด และขอบเขตทั้งร้อยจุดต้องอนุมานเอาทั้งหมด
สายอักขระที่ตัดได้สองแบบ#
ข้อความไทยส่วนใหญ่ตัดได้ทางเดียวเมื่อรู้คลังคำ กรณียากคือสายอักขระที่การตัดสองแบบให้คำจริงทั้งคู่ พจนานุกรมตัดสินไม่ได้ เพราะพจนานุกรมมีคำของทั้งสองฝั่งอยู่ครบ
| สายอักขระ | ตัดแบบหนึ่ง | ตัดอีกแบบ |
|---|---|---|
| ตากลม | ตา กลม (ดวงตากลม) | ตาก ลม (ผึ่งลมให้แห้ง) |
| ไปหามเหสี | ไป หา มเหสี (ไปพบพระมเหสี) | ไป หาม เห สี (หามไป แล้วเหลือพยางค์ที่ไม่เป็นคำ) |
| มากกว่า | มาก กว่า (มากกว่า) | มา กกว่า (มา แล้วตามด้วยสิ่งที่ไม่เป็นคำ) |
| ขนมอบ | ขนม อบ (ขนมที่อบ) | ขน มอบ (ขน แล้วมอบ) |
สองแถวแรกคือกรณีที่เจอจริงในงาน ตากลม กำกวมจริง และมีเพียงประโยครอบข้างเท่านั้นที่บอกได้ว่าหมายถึงแบบไหน ไปหามเหสี ดูกำกวมสำหรับเครื่องแต่ไม่กำกวมสำหรับคน เพราะการตัดแบบที่สองเหลือพยางค์ที่ประกอบเป็นคำไม่ได้ สองแถวหลังมีรูปแบบเดียวกัน การตัดแบบหนึ่งเป็นวลีที่คนพูด อีกแบบเป็นลำดับรายการในพจนานุกรมที่ไม่มีใครเขียน
ตากลม ตา กลม ดวงตากลม ตาก ลม ผึ่งลมให้แห้ง เด็กคนนี้ตากลม เด็กมีดวงตากลม เอาผ้าไปตากลม เอาผ้าไปผึ่งลม อักษรห้าตัวเดิม คำข้างหน้าเป็นผู้ตัดสิน
ภาพนี้คือปัญหาทั้งหมดในบรรทัดเดียว ไม่มีอะไรใน ตากลม ที่เลือกการอ่านให้ ตัวเลือกมาจาก เด็กคนนี้ หรือ เอาผ้าไป ซึ่งอยู่นอกสายอักขระที่ตัวจับคู่ทีละคำกำลังมองอยู่
ตัดผิดแล้วคำแปลเป็นอย่างไร#
ระบบแปลที่ตัดคำก่อนแล้วค่อยแปลจะรับการตัดผิดทุกครั้งมาเต็ม ๆ เอาผ้าไปตากลม ที่ตัดเป็น ตา กลม ให้ประโยคเกี่ยวกับผ้าและดวงตากลม ผลลัพธ์ลื่นไหล ถูกไวยากรณ์ และผิด และผู้ตรวจที่อ่านภาษาไทยไม่ออกจะไม่มีสัญญาณใดบอกเลยว่าเกิดอะไรขึ้น
ชื่อเฉพาะคือกรณีที่พบบ่อยที่สุด แบรนด์ที่เขียนด้วยอักษรไทย เช่น ไลน์ สำหรับแอปแชต หรือ แกร็บ สำหรับบริการเรียกรถ เป็นสายพยางค์ธรรมดา ตัดผิดทาง ไลน์ กลายเป็นคำว่าเส้น และแบรนด์หายไปจากคำแปล API แปลภาษา รับอภิธานศัพท์ด้วยเหตุผลนี้โดยตรง ศัพท์ที่ระบุไว้ในรูปที่เผยแพร่จริงจะถูกจับคู่เป็นหน่วยเดียวและแปลออกมาตามที่ผู้เรียกเขียน
มาร์กอัปคืออีกจุดที่การตัดผิดพลาด แท็กในบรรทัดที่ใส่กลับด้วยตำแหน่งตัวอักษรจะตกอยู่กลางคำทุกครั้งที่ตำแหน่งเลื่อนไปหนึ่งตัว และในภาษาไทยหมายถึงตกระหว่างพยัญชนะกับสระที่เป็นของมัน ฟิลด์ format มีอยู่เพื่อให้โมเดลได้รับมาร์กอัปเอง และรักษาแท็กไว้บนขอบเขตคำที่มันมองเห็น
ตัดผิดแล้วเสียงพูดเป็นอย่างไร#
โมเดลเสียงพูดต้องรู้คำเพื่อรู้สองอย่าง จะหายใจตรงไหน และจะอ่านตัวอักษรอย่างไร จังหวะเว้นวรรคเดินตามคำและอนุประโยค การหยุดกลางคำฟังเหมือนพูดติดอ่าง และประโยคที่อ่านโดยไม่หยุดเลยฟังเหมือนเครื่อง ทั้งช่องว่างและเครื่องหมายวรรคตอนต่างไม่ได้บอกโมเดลว่าคำอยู่ตรงไหน
การอ่านพยางค์ก็ขึ้นกับคำเช่นกัน อักษรชุดเดียวกันตัดพยางค์คนละแบบในคนละคำ และมีเพียงตัวคำเท่านั้นที่ตัดสิน ปลา อ่านพยางค์เดียวเป็นเสียงควบ ปลัด เปิดด้วยอักษรสองตัวเดียวกันแต่อ่านสองพยางค์ว่า ปะ-หลัด จักรยาน อ่านว่า จัก-กระ-ยาน และ จักรี อ่านว่า จัก-กรี โดยตัดพยางค์ต่างกันหลัง จักร ที่ใช้ร่วมกัน ส่วน รร ซ้อน อ่านว่า อัน เมื่ออยู่ท้ายคำใน สรร (สัน) และเป็น อัม เมื่อมีตัวสะกดตามใน กรรม (กัม)
| คำ | คำอ่าน | ทำไมตัวคำเป็นผู้ตัดสิน |
|---|---|---|
| ปลา · ปลัด | ปลา · ปะ-หลัด | อักษรเปิดคู่เดียวกัน เป็นเสียงควบในคำหนึ่ง สองพยางค์ในอีกคำ |
| จักรยาน · จักรี | จัก-กระ-ยาน · จัก-กรี | อักษรสี่ตัวแรกเหมือนกัน ตัดพยางค์คนละแบบ |
| สรร · กรรม | สัน · กัม | รร ซ้อนอ่านว่า อัน ท้ายคำ และ อัม หน้าตัวสะกด |
โมเดลที่หาคำเจอแล้วอ่านทุกคำเหล่านี้ถูก โมเดลที่อ่านอักษรเรียงทีละตัวอ่านทุกคำผิดตั้งแต่พยางค์แรก หน้า Text-to-Speech รวบรวมกฎการอ่านแบบนี้ไว้อีกหลายข้อ พร้อมคำอ่านที่คนไทยออกเสียงจริง
ตัดผิดแล้วไทม์สแตมป์ระดับคำเป็นอย่างไร#
ไทม์สแตมป์ระดับคำคือช่วงเสียงที่ผูกกับคำหนึ่งคำ ในภาษาอังกฤษคำมีให้อยู่แล้ว และการจับคู่เวลาคืองานทั้งหมด ในภาษาไทยโมเดลต้องสร้างคำขึ้นมาก่อน และไทม์สแตมป์รับสิ่งที่โมเดลสร้างมาทั้งหมด การตัดผิดให้ช่วงเสียงที่ครอบคำหนึ่งคำครึ่ง และซับไตเติลที่สร้างจากช่วงเหล่านั้นจะไฮไลต์พยางค์ผิดตัว
API เสียงพูดคืนไทม์สแตมป์ได้สามระดับ คือคำ ประโยค และทั้งข้อความ และช่วงระดับคำเดินตามการตัดคำของโมเดลเอง หน้าซับไตเติล แสดงผลลัพธ์นั้นเป็นบทอ่านที่ไฮไลต์ตามเสียง ระดับประโยคเลี่ยงคำถามนี้ได้ทั้งหมดเมื่อคำบรรยายต้องเปลี่ยนแค่ครั้งเดียวต่อบรรทัด
ตัดผิดแล้วดัชนีค้นหาเป็นอย่างไร#
ดัชนีค้นหาเก็บเทอม และเทอมคือคำ ดัชนีที่สร้างโดยแยกภาษาไทยด้วยช่องว่างจะเก็บทั้งวลีเป็นเทอมเดียว และคำค้นที่เป็นคำเดียวในวลีนั้นจะหาไม่เจอ ดัชนีที่สร้างด้วยตัวตัดคำจะหาคำเจอ และเจอตามการตัดที่ตัวตัดคำเลือกไว้ คำค้นต้องถูกตัดแบบเดียวกัน ด้วยตัวตัดคำตัวเดียวกัน มิฉะนั้นสองฝั่งจะไม่ตรงกัน
ผลในทางปฏิบัติคือคุณภาพการค้นหาภาษาไทยถูกจำกัดด้วยคุณภาพการตัดคำ และการเปลี่ยนตัวตัดคำหมายถึงการสร้างดัชนีใหม่ทั้งหมด แคตตาล็อกสินค้ารู้สึกก่อนใคร เพราะชื่อสินค้าคือสายอักขระที่ตัวตัดคำไม่เคยเห็นมาก่อนพอดี
การจับคู่พจนานุกรมกับโมเดลบริบท#
วิธีการมีสองตระกูล วิธีพจนานุกรมไล่ไปตามสายอักขระและหยิบคำที่ยาวที่สุดที่พจนานุกรมมีในแต่ละตำแหน่ง แล้วถอยกลับเมื่อส่วนที่เหลือตัดไม่ได้ วิธีนี้เร็ว โปร่งใส และถูกในข้อความส่วนใหญ่ แต่พลาดในสายอักขระกำกวมข้างต้น เพราะทั้งสองการตัดอยู่ในพจนานุกรม และวิธีนี้ไม่มีทางมองประโยครอบข้าง มันยังพลาดทุกคำที่ไม่อยู่ในพจนานุกรม ซึ่งรวมชื่อใหม่แทบทั้งหมด
โมเดลบริบทอ่านตัวอักษรรอบแต่ละตำแหน่งแล้วทำนายว่ามีขอบเขตตกตรงนั้นหรือไม่ มันเรียนรู้ว่า เด็กคนนี้ ตามด้วยคำบรรยายลักษณะ และ เอาผ้าไป ตามด้วยการกระทำ แล้วตัด ตากลม ตามนั้น มันรับมือคำที่ไม่รู้จักได้จากรูปร่าง เพราะคำไทยมีโครงสร้างพยัญชนะ สระ และวรรณยุกต์ที่จำได้ ต้นทุนของมันคือการเป็นโมเดล ซึ่งมาพร้อมข้อมูลฝึกและกรณีพลาดตามแบบของโมเดล
หมายเหตุ
สองตระกูลนี้มักถูกใช้ร่วมกัน พจนานุกรมให้ขอบเขตที่ง่าย และโมเดลบริบทตัดสินส่วนที่เหลือ ไม่ว่าไปป์ไลน์ใช้วิธีไหน การตัดคำที่ได้คือการตัดคำที่ทุกขั้นตอนถัดไปต้องรับต่อ
ควรทำอย่างไรเมื่อเรียก API ด้วยข้อความไทย#
- ส่งทั้งประโยคหรือส่งเป็นเซกเมนต์ ชิ้นส่วนที่ตัดตามจำนวนตัวอักษรอาจเริ่มหรือจบกลางคำ แล้วโมเดลต้องเดาทั้งสองขอบ
- ใส่ชื่อแบรนด์ ชื่อสินค้า และชื่อสถานที่ในอภิธานศัพท์ในรูปที่เผยแพร่จริง ศัพท์ที่ระบุไว้จะถูกจับคู่เป็นหน่วยเดียวและไม่ถูกแยก
- ใช้
do_not_translateกับสายอักขระที่ต้องคงเดิม และส่งformatเมื่อข้อความมีมาร์กอัป เพื่อให้โมเดลรักษาแท็กไว้บนขอบเขตที่มันมองเห็น - ขอ
timestampsในระดับที่ผลิตภัณฑ์ต้องการ ช่วงระดับประโยคนิ่ง ส่วนช่วงระดับคำคือการตัดคำของโมเดลเอง - ตัดคำค้นด้วยวิธีเดียวกับที่ใช้สร้างดัชนี ความไม่ตรงกันของสองฝั่งคือสาเหตุปกติของการค้นหาภาษาไทยที่พลาดผลลัพธ์ที่ควรเจอ
- ทดสอบสายอักขระกำกวมจากตารางข้างต้นในเพลย์กราวด์ พร้อมประโยครอบข้าง แล้วอ่านผลลัพธ์แบบที่คนไทยอ่าน