LibThai Dictionary Adjustment
ทำงานโอเพนซอร์สมีมากกว่าเขียนโค้ด ต้องพยายามสื่อสารกับชุมชนด้วย
เป็นเวลากว่าสองเดือนเทียว ตั้งแต่ผม ออกแบบโค้ดส่วน 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
5 ความเห็น:
ณ 23 สิงหาคม 2550 เวลา 12:19 , ob the air แถลง…
ตาแห้ง ผมแนะนำให้หยอดน้ำตาเทียมนะครับ ผมใช้ยี่ห้อ cellufresh อยู่ หยอดเมื่อแสบตา เปลืองเงินดีกว่าตาพังตอนแก่ครับ
ณ 23 สิงหาคม 2550 เวลา 16:25 , veer แถลง…
ไว้ผมลอกไปใช้บ้าง ลอล. ผมพยายามเขียนกฎแบบที่คิดว่าชาวบ้านจะอ่านรู้เรื่อง แล้วใช้โปรแกรมมา interpret เอา แน่นอนมันช้า. คิดๆอยู่ว่าลองเขียน compile เลยดีเปล่า :-P.
ณ 23 สิงหาคม 2550 เวลา 19:52 , ChaoChao แถลง…
ผมว่าควรจะใช้แว่นตาช่วยนะครับเป็นแว่น
ตาเหมือนแว่นตากันแดดน่ะครับ ใช้สำหรับเล่นคอมพ์โดยเฉพาะครับ
หรือไม่ก็เปลี่ยนเป็นจอที่มีหน้าจอขุ่น ๆ หน่อยน่ะครับ เป็นจอ LCD แบบในโน๊ตบุ๊ครุ่นเก่าหน่อยน่ะครับ แสงจะได้ไม่จ้ามากเหมือนจอ crytal น่ะครับ
ณ 23 สิงหาคม 2550 เวลา 20:02 , Thep แถลง…
wanaris, chaochao, ผมได้น้ำตาเทียมจาก รพ. มาหยอดแล้วครับ (ยี่ห้อ GenTeal) หยอดตามหมอสั่งก็เริ่มดีขึ้น ส่วนเรื่องแว่น คิดเหมือนกันครับ ว่าจะหาแว่นกันลมไว้ใส่ตอนออกไปข้างนอก เพราะตาจะไวต่อลมมาก เปิดพัดลมในห้องทำงานไม่ได้เลย ส่วนแว่นกรองแสง อาจจะลองหาดูด้วยครับ
veer, พยายามตัดคำแบบ rule-based?
ณ 23 สิงหาคม 2550 เวลา 21:17 , veer แถลง…
thep: ผสมๆกันหละครับ.
ถ้าคิดแบบ abstract หน่อยจะได้ง่ายๆ (แต่ implement จริงๆก็ต่างไปนิดๆหนะครับ)
1. สร้าง lattice (word graph) โดยใช้ dict + rule + การเชื่อมทุกวิธี(สำหรับ unknown word)
2.ตัด edge ที่ขัดกับ rule ใน lattice ออก
3.หา shortest path โดยที่ score หามากจากจำนวนตัวอักษรที่อยู่ใน unknown word และ จำนวนคำ.
let r = cmp(n_unk_char_a, n_unk_char_b);
if r != 0 then return r;
return cmp(n_word_a, n_word_b);
แต่ก็รู้สึกว่าวิธีหา score แบบนี้ยังไม่ดีกับ unknown word เท่าไหร่อะครับ. ก็พยายามปรับๆ อยู่. แล้วจะลองเอาไปใช้กับภาษาอื่นๆบ้าง ยกเว้นญี่ปุ่น หรือจีน ที่เขาทำดีมากๆอยู่แล้ว จริงๆภาษาไทยก็ไม่อยากทำเท่าไหร่ แต่ก็ ....
อีกอย่างหนึ่งคือ เท่าที่ลองการใช้กฎช่วยไม่ได้ช่วยอะไรมากในกรณีที่ dict พออยู่แล้วอะครับ. (มันก็ดีขึ้นนะครับ แต่นิดเดียว.)
ถ้าโชคดีติด IJCNLP เดี๋ยวเอา paper มา post อีกที :-P.
อีกอย่างคือผมเขียน libtst ร่วมกับ lindever ขึ้นมาหนะครับ. มันน่าจะ overflow ยากหน่อย แต่ก็ไม่เล็ก และไม่เร็วเท่า datrie แน่ๆ แต่ก็อาจจะเอามาใช้ในการทดลองได้.
แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)
<< กลับหน้าแรก