Theppitak's blog

My personal blog.

23 สิงหาคม 2550

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 เท่าที่ควร ผมค่อย ๆ สร้างกฎบางอย่างขึ้นเองจากการกระทบประสาทซ้ำ ๆ ของตัวอย่างต่าง ๆ แล้วในที่สุดก็แทบทิ้งเกณฑ์เดิมไปเลย ผมยังไม่แน่ใจ ว่าจะสามารถบรรยายกฎนั้นออกมาได้หรือไม่

ป้ายกำกับ:

5 ความเห็น:

  • 23 สิงหาคม 2550 12:19 , Blogger Waranis แถลง…

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

     
  • 23 สิงหาคม 2550 16:25 , Blogger veer แถลง…

    ไว้ผมลอกไปใช้บ้าง ลอล. ผมพยายามเขียนกฎแบบที่คิดว่าชาวบ้านจะอ่านรู้เรื่อง แล้วใช้โปรแกรมมา interpret เอา แน่นอนมันช้า. คิดๆอยู่ว่าลองเขียน compile เลยดีเปล่า :-P.

     
  • 23 สิงหาคม 2550 19:52 , Blogger ChaoChao แถลง…

    ผมว่าควรจะใช้แว่นตาช่วยนะครับเป็นแว่น
    ตาเหมือนแว่นตากันแดดน่ะครับ ใช้สำหรับเล่นคอมพ์โดยเฉพาะครับ
    หรือไม่ก็เปลี่ยนเป็นจอที่มีหน้าจอขุ่น ๆ หน่อยน่ะครับ เป็นจอ LCD แบบในโน๊ตบุ๊ครุ่นเก่าหน่อยน่ะครับ แสงจะได้ไม่จ้ามากเหมือนจอ crytal น่ะครับ

     
  • 23 สิงหาคม 2550 20:02 , Blogger Thep แถลง…

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

    veer, พยายามตัดคำแบบ rule-based?

     
  • 23 สิงหาคม 2550 21:17 , Blogger 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 วัน)

<< กลับหน้าแรก

hacker emblem