GATE experiment at KIND Lab, SIIT

งานทดลองสุดสัปดาห์ที่ผ่านมา

POS-tagged document in GATE

เมื่อวานทดลองเขียน wrapper ครอบ Stanford Log-linear Part-Of-Speech Tagger ให้กลายเป็นปลั๊กอินสำหรับใช้กับ GATE (หลังจากตั้งท่ามานาน)

pipeline ในรูป มี 3 Processing Resources คือ tokensier, splitter และ tagger

tokensier คือ net.siit.gate.DictionaryBasedTokeniser เป็นตัวตัดคำธรรมดา ๆ ใช้พจนานุกรม1 และออกแบบให้ตัดได้คำที่ยาวที่สุด (longest-matching) ทำงานกับ AnnotationSet ของ GATE โดยตรง — จะสร้าง AnnotationSet ชื่อ “Token” ขึ้นมา

splitter คือ ANNIE Sentence Splitter เป็นตัวแบ่งประโยค โดยใช้กฎ (ภาษา JAPE เป็นลักษณะ regular expression over annotation) ตัวนี้มากับ GATE อยู่แล้ว และไม่ได้ออกแบบมาสำหรับภาษาไทย — เราเอามาใช้ไถ ๆ ไป เพื่อให้สร้าง AnnotationSet ชื่อ “Sentence” เท่านั้น (เป็นการ “สมมติว่ามี” จะได้ทดลองขั้นต่อไปได้)

tagger คือ net.siit.gate.StanfordPOSTagger เป็นตัวกำกับชนิดของคำ (Part-of-Speech) เป็น wrapper ไว้เรียกใช้/แปลงข้อมูลจาก edu.stanford.nlp.tagger.maxent.MaxentTagger ซึ่งเป็นตัวกำกับชนิดของคำแบบเรียนรู้จากชุดตัวอย่าง2 ตัว MaxentTagger จะรับข้อมูลเข้า/ส่งข้อมูลออกเป็น List<Sentence> ก็ต้องแปลงให้กลายเป็น AnnotationSet (เอาคำจากชุด “Token” โดยใช้ชุด “Sentence” ระบุขอบเขตประโยค3) เพื่อให้เข้ากับ GATE — ในขั้นตอนสร้าง List<Sentence> ตัว wrapper นี้ จะทึกทักเอาเองว่า Annotation ทั้งหมดใน AnnotationSet นั้น ไม่ทับซ้อนกัน (overlapping), ซึ่งจริง ๆ แล้ว ใน GATE นั้นอนุญาตให้ Annotation มันทับซ้อนกันได้ เช่น ถ้า Token ดันมีซ้อนกันเป็น [ab{cd]efg} แบบนี้ ตอนที่ตัว tagger (wrapper) แปลงเป็น Sentence จะได้ Sentence ที่บรรจุ Word = { “abcd”, “cdefg” }

ทั้งหมดเป็น Java (ในส่วนที่พัฒนาเอง ใช้ NetBeans)

ทั้งหมดนี้ ไม่มีอะไรเป็น “ของใหม่” เป็นเพียงการทดลองหยิบชิ้นส่วนหรืออัลกอริธึมที่คนอื่นทำไว้แล้ว มาลองประกอบเข้าด้วยกันในกรอบ (framework) ของ GATE เท่านั้น (ส่วนที่มีเสริมเข้าไป ก็เพื่อให้ประกอบสนิทกันเท่านั้น)

แต่คาดหวังว่า การมีกรอบที่ชัดเจนแบบนี้ จะช่วยลดงานที่ไม่จำเป็นในการทดลอง/วิจัยในอนาคตไปได้บ้าง เพื่อจะได้มีเวลาไปเน้นเรื่อง “ใหม่ ๆ” จริง ๆ

1 สามารถระบุพจนานุกรมตอนสร้าง instance ใหม่ได้ ปัจจุบันคำส่วนหนึ่งมาจากคลังข้อมูลเอกสารการแพทย์ที่ KIND Lab, SIIT ทำร่วมกับ เภสัช ศิลปากร อีกส่วนหนึ่งมาจากตัวตัดคำ KU Wordcut ของเกษตร (สุธี สุดประเสริฐ), ใช้ Trie เป็นโครงสร้างข้อมูลขณะตัดคำ (org.speedblue.util.Trie)

2 ชุดตัวอย่างนำมาจากคลังข้อความ ORCHID โดยเนคเทค (ทดสอบแปลงข้อมูลโดยใช้สคริปต์ Groovy บน JVM)

3 จริง ๆ แล้ว เราสามารถใส่คำทั้งหมดเข้าไปประมวลผลทีเดียวได้ (คือมี 1 ประโยคใน List<Sentence> และทุกคำในเอกสารบรรจุอยู่ในประโยคนั้น) แต่การทำแบบนั้น คิดว่าน่าจะเปลืองหน่วยความจำ อีกเรื่องคือ ยังไม่ได้ศึกษาโดยละเอียดว่า ขอบเขตของประโยค มีส่วนต่อการคำนวณหาค่าความน่าจะเป็นในการกำกับชนิดของคำของคลาส MaxentTagger หรือไม่ (ตั้งสมมติฐานไว้ว่า น่าจะมี จึงพยายามแบ่งประโยค)

technorati tags: 

Fix "uses unchecked or unsafe operations" for GATE’s FeatureMap

วันนี้นั่งไล่โค้ดตัวปลั๊กอิน GATE ทั้งวัน

กำลังเขียนปลั๊กอินเพื่อเอามาใช้กับโครงการที่กำลังทำอยู่ตอนนี้ที่ SIIT (เอ๊ะ ผมบอกรึยังนะ ว่าผมมาเป็นผู้ช่วยวิจัยอยู่นี่ ไว้ค่อยเล่าว่าทำอะไรละกัน ทีหลัง) ก็ใช้ GATE นี่แหละ

วันนี้พยายามแก้ warning ที่เจอมาตั้งแต่วันก่อน แต่ปล่อย ๆ ไปก่อน วันนี้ได้โอกาส ก็มาตามเก็บให้เรียบร้อย

โค้ดมันคล้าย ๆ นี้:


1: FeatureMap features = Factory.newFeatureMap();
2: features.put("key", object);

บรรทัดที่ 2 เนี่ย พอคอมไพล์ จะทำให้เกิด warning:


Note: MyJava.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

ไปเจอใน forum.java.sun.com เค้าบอกว่า มันเกิดเพราะ เราไม่ได้กำหนด parameter ให้กับตัว Map (เรื่อง generic)

ลองแก้ที่โค้ดตัวเอง ไม่สำเร็จ
ก็เลยต้องไปแก้โค้ดของ FeatureMap ของตัว GATE ซะ

ดังนี้:

ที่ไฟล์ gate/SimpleFeatureMap.java:

แก้
public interface SimpleFeatureMap extends Map
เป็น
public interface SimpleFeatureMap extends Map<Object, Object>

ที่ไฟล์ gate/util/SimpleMapImpl.java:

แก้
class SimpleMapImpl implements Map
เป็น
class SimpleMapImpl implements Map<Object, Object>

ลอง build GATE ดู ใช้ได้ build ผ่าน, ทดสอบรัน GATE โอเค

ลองคอมไพล์โปรแกรมตัวเอง (ที่เรียกใช้ FeatureMap) โอเค ไม่มี warning ละ เยี่ยม

ถ้าไม่มีซอร์สโค้ดแจกมา ให้ดู ให้แก้ คงทำงี้เองไม่ได้เนอะ ต้องรอเขาลูกเดียว ตั้งตา

เมลถาม(เอง)-ตอบ(เอง) เรื่องนี้เข้าเมลกลุ่ม ไปละ – -“

ไปประชุมเรื่อง YouMedia ก่อนนะ 😉

หมายเหตุ: นั่งเขียนที่ร้าน Cup B หยุดอยู่ที่ร้านนี้ เพราะหยุดดูข่าว iPhone ที่เค้าเปิดให้ดูหน้าร้าน (จอคอม) แล้วคนในร้านออกมาชวนคุย เราเลยนั่งทำงานอยู่ร้านนี้มันซะเลย หาที่นั่งทำงานเงียบ ๆ อยู่พอดี / Mac Cafe Mini @ Cup B

update: Ian Roberts หนึ่งในผู้ดูแล GATE ตอบรับแล้ว เดี๋ยวจะแก้โค้ดใน main GATE tree ให้ 🙂

technorati tags:
,

Newline in GATE

ใน GATE, ถ้าเราอยากรู้ว่า เอกสารที่เรากำลังทำงานอยู่เนี่ย มันใช้ อักขระขึ้นบรรทัดใหม่ (newline) แบบไหน ก็เรียกดูได้จากฟีเจอร์ที่ชื่อ “docNewLineType”
โดย docNewLineType นี้ เป็น String มีค่าได้ 4 อย่าง: { “CR”, “LF”, “CRLF”, “LFCR” }

CR คือ Carriage Return — ปัดแคร่(ไปซ้ายสุด) (\r ในหลายภาษาโปรแกรม),
LF คือ Line Feed — เลื่อนบรรทัดใหม่ (\n)

เพื่อขึ้นบรรทัดใหม่ เครือญาติ UNIX อย่าง Linux กับ Mac OS X ใช้ LF ตัวเดียว,
ใน Mac OS (จนถึงรุ่น 9) ใช้ CR ตัวเดียว,
ส่วนเพื่อนรัก Windows ของเรา เป็นเด็กนอย ใช้มันสองตัวเลย CRLF กันเหนียว*, DOS ก็เช่นกัน
(* พูดจริง ๆ แล้ว DOS/Windows ทำตัวเลียนแบบเครื่องพิมพ์ดีดจักรกลได้เหมือนที่สุด คือต้องปัดแคร่ไปซ้ายสุดก่อน จากนั้นจึงค่อยเลื่อนกระดาษไปหนึ่งบรรทัดได้ เป็นการเริ่มบรรทัดใหม่)

นอกเรื่องซะไกล อ่ะ เขียนโค้ดได้อย่างนี้ (ตรงที่เป็นตัวหนา)


int nllen = 1;
String nl = (String) document.getFeatures().get("docNewLineType");
if (nl.equals("CRLF") || nl.equals("LFCR")) {
  nllen = 2;
}

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

technorati tags: , ,

Thai GATE

Thai GATE — General Architecture for Text Engineering, Thai users group
http://groups.google.com/group/thaigate
กลุ่มผู้ใช้ GATE ชาวไทย ตั้งแล้ว โดย วีร์ 😛

เชิญถกเรื่องการใช้การพัฒนาเกทกันได้ โดยเฉพาะเรื่องที่เกี่ยวกับภาษาไทย 🙂

และเราจะขอ มั่ว เรียกผู้ใช้เกทชาวไทยว่า “Siamigaters” สยามิเกเตอร์ ..เป็นไอ้โขงกันไปเลย 😛

technorati tags:
,