ทำงานโอเพนซอร์สมีมากกว่าเขียนโค้ด ต้องพยายามสื่อสารกับชุมชนด้วย
เป็นเวลากว่าสองเดือนเทียว ตั้งแต่ผม ออกแบบโค้ดส่วน itemization ใหม่ สำหรับตัวตัดคำใน libthai ซึ่งเป็นการทำงานต่อจากขั้นแรกที่ได้ รื้อเขียนตัวตัดคำด้วยพจนานุกรมใหม่ เมื่อปีกลาย
การเขียนส่วน itemization ใหม่เมื่อสองเดือนก่อนนั้น ก็ทำให้โค้ดระดับบนเข้ากับ UAX #14 (Unicode Line Breaking Properties) ยิ่งขึ้น แต่ยังก่อน ก่อนจะ release libthai รุ่นใหม่ ยังมีอีกเรื่องหนึ่งที่ผมวางแผนไว้ คือการสนับสนุนคำประสม ซึ่งเป็นอีกประเด็นหนึ่งที่มีคนเสนอใน GNOME Bug #382437
เกณฑ์การตัดคำประสมนั้น พี่ปลา ที่เนคเทค (คนละคนกับ blaa ในห้อง ubuntu-th/tlwg) ได้ทำ สรุป ไว้ โดยประยุกต์จากหลักภาษาไทยเล็กน้อยเพื่อให้เข้ากับการตัดบรรทัด เกณฑ์นี้ ได้ออกแบบรองรับการใช้ยัติภังค์ (hyphenation) ไว้เรียบร้อย แต่เนื่องจาก libthai ยังไม่ทำ hyphenation จึงยังต้องเปลี่ยนให้เป็นแบบตัดคำล้วน ๆ
แรกเริ่มเดิมที การ maintain dictionary นี้ ผมอยากได้อาสาสมัครมาช่วยกันทำ แต่เนื่องจากยังมีประเด็นทางเทคนิคที่ผมกังวล คือ double-array trie ที่ใช้เก็บ dict นั้น ต้อง overflow แน่ ๆ เมื่อเพิ่มคำประสมเข้าไป ผมมีทางเลือกสองทาง คือเพิ่มขนาด index ใน trie ให้โตกว่า 16 บิต หรืออีกทางคือลดขนาด dict ลง โดยเลือกตัดคำโบราณที่ไม่พบในเอกสารใดทิ้ง หลังจากแก้ปัญหานี้ได้ จึงจะเปิดทางสะดวกสำหรับอาสาสมัคร
ผมเลือกอย่างหลัง เพราะมองเห็นความเป็นไปได้ แถมยังเป็นการประหยัดหน่วยความจำกว่าด้วย อีกประการหนึ่ง คำโบราณมักจะสร้างความประหลาดใจเสมอ ๆ เวลาที่พบคำที่ไม่มีในพจนานุกรมแล้วมันพยายามตัดแบบแปลก ๆ ให้ หรือแย่กว่านั้น บางคำที่มีความกำกวม คำโบราณจะโผล่เข้าไปทำให้ตัดผิดได้บ่อย ๆ ตราบใดที่ libthai ยังไม่ได้ใช้ข้อมูลสถิติประกอบ การเก็บคำโบราณไว้จะสร้างโอกาสการตัดผิดได้พอสมควร
ฉะนั้น ผมจึงค่อย ๆ ไล่เปิดพจนานุกรม เลือกเพิ่มคำประสมเข้าไป ตัดคำที่ไม่มีที่ใช้ทิ้ง แต่ผมจะรู้ได้อย่างไร ว่าคำคำหนึ่งมีที่ใช้หรือเปล่า? ตัดสินจากความรู้สึกหรือ? ก็อาจจะได้ แต่มันอาจหลุดรอดประสบการณ์การอ่านอันจำกัดของผมไปได้ ผมจึงอาศัย corpus คนจนที่อินเทอร์เน็ตมีให้ คือ google โดยพิสูจน์คำแปลก ๆ ด้วยการค้น google ดูแหล่งปรากฏ พร้อมทั้งดูความเป็นไปได้ของการแทรกแซงกรณีกำกวมไปในตัว
พูดแล้วอายจัง เวลามีใครถาม ว่าทำ dict ยังไง ได้ข้อมูลจากไหน.. พวกแล็บ NLP ทั้งหลาย เขามีการสร้าง corpus tools สำหรับประมวลผลอัตโนมัติ ถามว่าผมใช้วิธีไหน เป็นวิธีโบราณสุด ๆ ครับ คือใช้แรงงานคน บวกกับ google นี่แหละ เพียงแต่ว่า ไม่ได้เริ่มจากศูนย์ เนื่องจากมี word list ที่ทางราชบัณฑิตยสถานเผยแพร่ผ่านเนคเทคเมื่อหลายปีก่อน (ผมเองแหละ ที่เป็นคนสกัด word list ออกมาจากข้อมูลดิบของพจนานุกรมในตอนนั้น :P) ผมไม่แน่ใจว่าตัวข้อมูลในแหล่งดาวน์โหลดต้นฉบับยังอยู่หรือเปล่า แต่ถ้าใครสนใจจะใช้ข้อมูล ก็ยังมีสำเนาที่ import ไว้ที่ LTN CVS นะครับ
กลับมาที่ libthai ต่อ ปรากฏว่า การปรับ dict ที่ว่า ต้องใช้เวลามากกว่าที่คิด เพราะผมดันป่วยเป็นโรคตาแห้งซะนี่ ก็เลยทำ ๆ พัก ๆ วันละนิดละหน่อย เก็บเล็กผสมน้อยตลอดเดือนสองเดือนที่แทบไม่ได้ blog ถึงงานพัฒนาเลย (ยกเว้นงานช่วยชาติอย่าง mozilla) ว่าจะ blog เล่า (เดี๋ยวใครจะว่ามุบมิบทำ ไม่ให้สาธารณชนรับทราบ :P) ก็ผัดวันประกันพรุ่งมาเรื่อย เพราะแสบตา ตอนนี้ ใกล้เสร็จแล้วแหละครับ
ในตอนท้าย ก็มาถึงจุด overflow จริง ๆ ทำให้มีโอกาสได้ปรับโค้ด double-array trie ให้จัดการกับ edge case ได้ดียิ่งขึ้นด้วย ประเดี๋ยวเมื่อทุกอย่างเรียบร้อย คงไล่ release ทีละตัว และที่ว่าจะให้อาสาสมัครช่วย ก็อาจต้องเลื่อนออกไป เพราะตอนนี้ dict ปริ่มเต็มพอดี (แต่อาจเพิ่มคำได้บ้างเป็นบางคำ ถ้าบังเอิญยัดลงไปได้ ใครมีคำจะเสนอเพิ่มก็ลองเสนอได้ครับ อย่างเช่น คำที่พบในข่าวปัจจุบันอย่าง "อมาตยาธิปไตย" เนี่ย ผมเพิ่มไปละ)
ในการปรับ dict ผมพบว่าในช่วงแรก ๆ ตัวเองยึดกับเกณฑ์ที่พี่ปลาสรุปไว้ แต่เมื่อทำไป ก็พบว่ามันไม่ practical เท่าที่ควร ผมค่อย ๆ สร้างกฎบางอย่างขึ้นเองจากการกระทบประสาทซ้ำ ๆ ของตัวอย่างต่าง ๆ แล้วในที่สุดก็แทบทิ้งเกณฑ์เดิมไปเลย ผมยังไม่แน่ใจ ว่าจะสามารถบรรยายกฎนั้นออกมาได้หรือไม่
ป้ายกำกับ: libthai