เจาะข้อมูล LEXiTRON
จุดประสงค์
- แปลงข้อมูลของพจนานุกรม LEXiTRON ให้เป็นฐานข้อมูลพจนานุกรมของ dictd
- เพื่อเป็นบันทึกและถ่ายทอดความรู้ต่อไป
เกี่ยวกับ LEXiTRON
พจนานุกรมอิเล็กทรอนิกส์ LEXiTRON เป็นพจนานุกรมที่สร้างและเผยแพร่โดย NECTEC. เนื้อหาของข้อมูลมีทั้่งการแปลจากอังกฤษ-ไทย และ ไทย-อังกฤษ. ตัวโปรแกรม LEXiTRON ที่ใช้บนลินุกซ์เขียนด้วย Java และมีไฟล์ข้อมูลแยกไว้ต่างหาก. ในบทความนี้จะเกี่ยวข้องกับข้อมูลโดยตรงไม่เกี่ยวข้องกับโปรแกรมแต่อย่างใด.ข้อมูลของ LEXiTRON
จาก FTP ของ OpenTLE จะมีข้อมูลแยกให้ดาว์นโหลดต่างหากได้แก่ไฟล์ lexitron-data.zip. เอาไฟล์นี้มากระจายออกด้วย unzip.
$ unzip -t lexitron-data.zip
Archive: lexitron-data.zip
testing: etlex OK
testing: telex OK
testing: LICENSE-th.txt OK
testing: LICENSE.txt OK
No errors detected in compressed data of lexitron-data.zip.
$ unzip lexitron-data.zip
หลังจากที่กระจายไฟล์ข้างในแล้วเราลองมาดูไฟล์ etlex กับ telex กัน.
ไฟล์ etlex เป็นไฟล์ข้อมูลศัพท์อังกฤษ-ไทย, ส่วนไฟล์ telex เป็นไฟล์ข้อมูลศัพท์ไทย-อังกฤษ. ดูเนื้อหาข้างในด้วย less ก็จะพบว่ามีลักษณะไฟล์แบบนี้
<Doc> <esearch>a</esearch> <eentry>a</eentry> <tentry>หนึ่ง (คำนำหน้าคำนามเพื่อแสดงว่าคำนามนั้นๆ ไม่ชี้เฉพาะ)</tentry> <ecat>DET</ecat> <id>0</id> </Doc> ...ทำให้รู้ว่าไฟล์นี้น่าจะเป็น XML. Tag ที่ใช้ในไฟล์นี้พอสื่อความได้เช่น esearch เป็นคำที่กำหนดไว้เป็นต้น. เนื่องจากผมไม่มีข้อมูลไฟล์นี้มี Tag อะไรบ้าง, จึงมีความจำเป็นต้องลิสชื่อ Tag ทั้งหมดออกมาดู. ทำอย่างไร? ต้อง parse ไฟล์นี้ครับ.
เตรียม encoding แบบ UTF-8
หลังจากศึกษาเรื่องราวของ XML เล็กๆน้อยจาก Internet ก็ตกลงใจว่าจะใช้ perl เขียน parser ของไฟล์นี้.ก่อนที่จะเขียน parser สิ่งที่ต้องทำก่อนคือแปลงไฟล์นี้ให้มี encoding เป็น UTF-8 ก่อนเพราะจะได้เป็นมาตรฐานใช้งานได้คล่อง.
$ iconv -f tis620 -t utf8 -o test etlex iconv: illegal input sequence at position 1239420ปัญหาที่พบคือไฟล์ etlex นี้ไม่ใช่ encoding แบบ TIS-620! ไปดูที่ที่เกิดข้อผิดพลาดก็จะเห็นว่ามีอักขระแปลกปลอมติดมาด้วย. หลังจากที่ลบอักขระแปลกปลอมเหล่านี้ออกไปแล้วสั่งคำสั่ง iconv ใหม่ก็ยังเหมือนเดิมอีกแต่เป็นที่ใหม่. สรุปว่ามีหลายที่มีอักขระแปลกปลอมอยู่. แก้ด้วยมือไม่ไหวเลยมีความจำเป็นต้องเขียนสคริปต์ช่วย.
$ ./fixchars.pl etlex > etlex.tis-620 $ iconv -f tis620 -t utf8 -o etlex.utf-8 etlex.tis-620แล้วก็จะได้ข้อมูลดิบแบบ UTF-8.
ดู Tag ทั้งหมด
ก่อนอื่นเขียน parser ง่ายๆชื่อ listalltags.pl มา parse แสดง Tag ทั้งหมดที่มีอยู่ในไฟล์.$ ./listalltags.pl etlex.utf-8 Doc esearch eentry tentry ecat id junk after document element at line 8, column 0, byte 256 at /usr/lib/perl5/vendor_perl/5.8.0/i686-linux/ XML/ Parser.pm line 187ปรากฏว่าโปรแกรมตายกลางครร. ไปหาข้อมูลทาง google ได้ว่า "junk after document element" หมายถึงไฟล์ XML ทีไม่มี root element. คือในเอกสาร XML หนึ่งจะต้องมี root element ซึ่งในไฟล์นี้ไม่มี. เลยเขียน <etlex> ไว้ที่บรรทัดแรกและ </etlex> ไว้ที่บรรทัดสุดท้ายของไฟล์แล้ว parse ใหม่.
$ ./listalltags.pl etlex.utf-8 | sort | uniq not well-formed (invalid token) at line 14823, column 19, byte 390464 at /usr/lib/perl5/vendor_perl/5.8.0/i686-linux/ XML/ Parser.pm line 187 Doc eant ecat eentry esearch esyn ethai etlex id tentryคลายกลายเป็นว่ามี invalid token บรรทัดที่ 14823 เลยไปดูแล้วปรากฏว่ามีเครื่องหมาย & อยู่เลยแก้เป็น &. แก้พวก token ที่ไม่ถูกต้องให้หมดทุกที่แล้ว parse ใหม่จะได้ผลดังนี้.
$ ./listalltags.pl etlex.utf-8 | sort | uniq Doc eant ecat eentry esearch esyn ethai etlex id tentry
ความหมายของ Tag
ดูจากข้อมูลในไฟล์แล้วสรุปความหมายของ Tag ที่ใช้ได้ดังนี้- Doc : เริ่ม record ของคำศัพท์
- eant : คำภาษาอังกฤษที่มีความหมายตรงข้าม
- ecat : ประเภทของคำ
- eentry : คำภาษาอังกฤษ
- esearch : คำภาษาอังกฤษ
- esyn : คำภาษาอังกฤษที่มีความหมายเหมือนกัน
- ethai : คำภาษาไทยที่มีความหมายใกล้เคียง
- id : เลข id ของคำ
- tentry : คำแปลภาษาไทย
- Doc : เริ่่ม record ของคำศัพท์
- eentry : คำภาษาอังกฤษ
- id : เลข id ของคำ
- notes : หมายเหตุ
- tant : คำภาษาไทยที่มีความหมายตรงข้าม
- tcat : ประเภทของคำ
- tdef : คำอธิบาย
- tenglish : คำภาษาอังกฤษที่มีความหมายใกล้เคียง
- tentry : คำภาษาไทย
- tnum : หน่วย
- tsample : ตัวอย่างประโยคภาษาไทย
- tsearch : คำภาษาไทย
- tsyn : คำภาษาไทยที่มีความหมายเหมือนกัน
สร้างไฟล์ข้อมูลดิบ
ไฟล์ข้อมูลดิบที่จะสร้างนี้คือฟอร์แมตที่เรียกว่า c5, headword (คำที่ต้องการหา) จะอยู่ถัดจากบรรทัดที่มีเครื่องหมาย underscore (_) 5 ตัวเป็นอย่างต่ำ. ไฟล์ c5 นี้สร้างจาก XML ของ LEXiTRON ด้วยสคริปต์ parse_etlex.pl และ parse_telex.pl.$ ./parse_etlex.pl etlex.utf-8 > etlex.c5
สร้าง database-info
database-info เป็นข้อมูลที่เกี่ยวกับข้อมูลของพจนานุกรมเช่นหนังสืออนุญาตการใช้ (license). เขียนเก็บไว้ที่ไฟล์ lexitron.infoสร้างฐานข้อมูลพจนานุกรม
ใช้คำสั่ง dictfmt เพื่อสร้างฐานข้อมูลพจนานุกรม.$ cat lexitron.info etlex.c5 | dictfmt \ -c5 -u ftp://ftp.opentle.org/pub/lexitron/source/lexitron-data.zip\ -s "LEXiTRON version 2, etlex" \ --without-info --allchars \ --locale th_TH.UTF-8 etlexแล้วจะได้ไฟล์สองไฟล์คือ etlex.dict และ etlex.index. หลังจากนั้นบีบอัดข้อมูล etlex.dict ให้เล็กด้วยคำสั่ง dictzip.
$ dictzip etlex.dictผลลัพธ์ที่ได้คือไฟล์ etlex.dict.dz.
ติดตั้งฐานข้อมูล
ฐานข้อมูลของ dictd เช่นใน gentoo จะไว้ที่ /usr/lib/dict ก็เอาไฟล์ etlex.dict.dz และ etlex.index ไปไว้ที่นั้น.การรัน dictd เซิฟร์เวอร์ต้องใช้ตัวเลือก --locale th_TH.UTF-8 ด้วยเพื่อให้เซิฟร์เวอร์รู้ว่าฐานข้อมูลมี encoding แบบ UTF-8.
ใช้งาน
ใช้โปรแกรมอะไรที่รองรับ DICT protocol ต่อเข้ากับเซิฟร์เวอร์. ตัวอย่างเช่น kdict, gnome-dictionary, dict ฯลฯ.
Bugs
- ชื่อฐานข้อมูลไม่ยอมแสดงใน client
- ไม่สามารถหาแบบ match กับพจนานุกรมไทย-อังกฤษ (เป็นที่เซิฟร์เวอร์?)
ดาว์นโหลด
ดาว์นโหลดจาก TLWG CVS.ติดต่อสอบถาม
LTN developer channel/webboard.