Paxa Labs
บทความทั้งหมด

2 กันยายน 2569 · อ่าน 2 นาที

การตัดคำภาษาไทยคืออะไร และทำไมจึงกำหนดผลของการแปล เสียงพูด และการค้นหา

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

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

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

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

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

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

คำภาษาไทยสั้น บนคลังข้อมูล BEST2010 คำภาษาไทยยาวเฉลี่ย 3.855 ตัวอักษร (COLING (2014)) และเว็บไซต์นี้ปัดเป็น 4 เมื่อแปลงจำนวนคำเป็นจำนวนตัวอักษรที่คิดค่าบริการ ย่อหน้าร้อยคำจึงเป็นสายอักขระราวสี่ร้อยตัวที่มีช่องว่างอยู่ราวสามจุด และขอบเขตทั้งร้อยจุดต้องอนุมานเอาทั้งหมด

สายอักขระที่ตัดได้สองแบบ#

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

สายอักขระตัดแบบหนึ่งตัดอีกแบบ
ตากลมตา กลม (ดวงตากลม)ตาก ลม (ผึ่งลมให้แห้ง)
ไปหามเหสีไป หา มเหสี (ไปพบพระมเหสี)ไป หาม เห สี (หามไป แล้วเหลือพยางค์ที่ไม่เป็นคำ)
มากกว่ามาก กว่า (มากกว่า)มา กกว่า (มา แล้วตามด้วยสิ่งที่ไม่เป็นคำ)
ขนมอบขนม อบ (ขนมที่อบ)ขน มอบ (ขน แล้วมอบ)

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

หนึ่งสายอักขระ สองการตัดคำ
ตากลม

  ตา   กลม      ดวงตากลม
  ตาก  ลม       ผึ่งลมให้แห้ง

เด็กคนนี้ตากลม        เด็กมีดวงตากลม
เอาผ้าไปตากลม        เอาผ้าไปผึ่งลม

อักษรห้าตัวเดิม คำข้างหน้าเป็นผู้ตัดสิน

ภาพนี้คือปัญหาทั้งหมดในบรรทัดเดียว ไม่มีอะไรใน ตากลม ที่เลือกการอ่านให้ ตัวเลือกมาจาก เด็กคนนี้ หรือ เอาผ้าไป ซึ่งอยู่นอกสายอักขระที่ตัวจับคู่ทีละคำกำลังมองอยู่

ตัดผิดแล้วคำแปลเป็นอย่างไร#

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

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

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

ตัดผิดแล้วเสียงพูดเป็นอย่างไร#

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

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

คำคำอ่านทำไมตัวคำเป็นผู้ตัดสิน
ปลา · ปลัดปลา · ปะ-หลัดอักษรเปิดคู่เดียวกัน เป็นเสียงควบในคำหนึ่ง สองพยางค์ในอีกคำ
จักรยาน · จักรีจัก-กระ-ยาน · จัก-กรีอักษรสี่ตัวแรกเหมือนกัน ตัดพยางค์คนละแบบ
สรร · กรรมสัน · กัมรร ซ้อนอ่านว่า อัน ท้ายคำ และ อัม หน้าตัวสะกด

โมเดลที่หาคำเจอแล้วอ่านทุกคำเหล่านี้ถูก โมเดลที่อ่านอักษรเรียงทีละตัวอ่านทุกคำผิดตั้งแต่พยางค์แรก หน้า Text-to-Speech รวบรวมกฎการอ่านแบบนี้ไว้อีกหลายข้อ พร้อมคำอ่านที่คนไทยออกเสียงจริง

ตัดผิดแล้วไทม์สแตมป์ระดับคำเป็นอย่างไร#

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

API เสียงพูดคืนไทม์สแตมป์ได้สามระดับ คือคำ ประโยค และทั้งข้อความ และช่วงระดับคำเดินตามการตัดคำของโมเดลเอง หน้าซับไตเติล แสดงผลลัพธ์นั้นเป็นบทอ่านที่ไฮไลต์ตามเสียง ระดับประโยคเลี่ยงคำถามนี้ได้ทั้งหมดเมื่อคำบรรยายต้องเปลี่ยนแค่ครั้งเดียวต่อบรรทัด

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

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

การจับคู่พจนานุกรมกับโมเดลบริบท#

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

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

หมายเหตุ

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

ควรทำอย่างไรเมื่อเรียก API ด้วยข้อความไทย#

  • ส่งทั้งประโยคหรือส่งเป็นเซกเมนต์ ชิ้นส่วนที่ตัดตามจำนวนตัวอักษรอาจเริ่มหรือจบกลางคำ แล้วโมเดลต้องเดาทั้งสองขอบ
  • ใส่ชื่อแบรนด์ ชื่อสินค้า และชื่อสถานที่ในอภิธานศัพท์ในรูปที่เผยแพร่จริง ศัพท์ที่ระบุไว้จะถูกจับคู่เป็นหน่วยเดียวและไม่ถูกแยก
  • ใช้ do_not_translate กับสายอักขระที่ต้องคงเดิม และส่ง format เมื่อข้อความมีมาร์กอัป เพื่อให้โมเดลรักษาแท็กไว้บนขอบเขตที่มันมองเห็น
  • ขอ timestamps ในระดับที่ผลิตภัณฑ์ต้องการ ช่วงระดับประโยคนิ่ง ส่วนช่วงระดับคำคือการตัดคำของโมเดลเอง
  • ตัดคำค้นด้วยวิธีเดียวกับที่ใช้สร้างดัชนี ความไม่ตรงกันของสองฝั่งคือสาเหตุปกติของการค้นหาภาษาไทยที่พลาดผลลัพธ์ที่ควรเจอ
  • ทดสอบสายอักขระกำกวมจากตารางข้างต้นในเพลย์กราวด์ พร้อมประโยครอบข้าง แล้วอ่านผลลัพธ์แบบที่คนไทยอ่าน

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