Corpus-Related Research

สาขาวิจัยที่สามารถใช้ประโยชน์จากคลังข้อความได้ เช่น
ภาษาศาสตร์เชิงคำนวณ วัฒนธรรมศึกษา และ การวิเคราะห์วาทกรรม

ใน Linguistics of Political Argument: The Spin-Doctor and the Wolf-Pack at the White House [gbook], Alan Partington รองศาสตราจารย์ด้านภาษาศาสตร์ แห่งคณะรัฐศาสตร์ มหาวิทยาลัยคาเมรีโน ประเทศอิตาลี ได้พิจารณาความสัมพันธ์ระหว่างทำเนียบขาวกับสื่อ โดยการวิเคราะห์ทางภาษาศาสตร์จากคลังข้อความ ซึ่งประกอบไปด้วยสรุปคำแถลงข่าวประมาณ 50 ชิ้นในช่วงปีท้าย ๆ ของการดำรงตำแหน่งของประธานาธิบดีคลินตัน โดยหัวข้อนั้น มีตั้งแต่เรื่องในโคโซโวไปจนถึงเรื่องความสัมพันธ์คลินตัน-เลวินสกี

งานชิ้นนี้ไม่เหมือนใครก่อนหน้า ตรงที่มันทำให้เราเห็นว่า เราสามารถนำเทคโนโลยี concordance (การแสดงคำที่กำหนดในบริบทต่าง ๆ) และหลักฐานทางภาษาศาสตร์อย่างละเอียด มาใช้ในการศึกษาคุณสมบัติต่าง ๆ ของวาทกรรม ทั้งในตัวบทและกลวิธีการสื่อสารของผู้พูดได้-อย่างไร


Tony McEnery and Andrew Wilson, Corpus Linguistics, Edinburgh University Press. ISBN 0-7486-0482-0. [gbook]

technorati tags:
,

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: 

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: , ,

Using dictionary with ICU4J BreakIterator

การสร้างและเรียกใข้พจนานุกรมสำหรับตัดคำ ใน ICU4J

จดวิธีการตัดคำด้วย DictionaryBasedBreakIterator ของ ICU4J และการสร้างพจนานุกรมตัดคำเอง

(เฮ้! นี่คือ “จาวา” ขวัญอ่อน? รักสวยรักงาม? .. ระวังถูกงับมือ! เราเตือนคุณแล้วนะ :P)


การสร้างไฟล์พจนานุกรมสำหรับตัดคำ

ใช้โปรแกรม BuildDictionaryFile สร้างไฟล์พจนานุกรม, วิธีใช้คือ:

BuildDictionaryFile input [encoding] [output] [list]
  • input = ข้อมูลเข้า ไฟล์พจนานุกรม เป็นไฟล์ชนิดข้อความ หนึ่งคำต่อหนึ่งบรรทัด
  • encoding = รหัสตัวอักษรของไฟล์พจนานุกรม เช่น TIS-620, UTF-8 (ถ้าไม่ใส่จะใช้ค่าปริยาย คือ UTF-8)
  • output = ข้อมูลออก ผลลัพธ์ เป็นไฟล์ชนิดไบนารี (จะใช้เป็นอินพุตของคอนสตรัคเตอร์ของคลาส DictionaryBasedBreakIterator ต่อไป)
  • list = ข้อมูลออก รายการคำที่ถูกบรรจุในพจนานุกรม (output) เป็นไฟล์ชนิดข้อความ หนึ่งคำต่อหนึ่งบรรทัด ใช้รหัสตัวอักษร UTF-8 (ไม่ใส่ก็ได้)

เช่น ถ้าไฟล์ข้อความที่เราจะแปลงเป็นพจนานุกรมตัดคำ ชื่อ tdict.txt ก็สั่ง:

# java com.ibm.icu.dev.tools.rbbi.BuildDictionaryFile tdict.txt \
    TIS-620 tdict.dic tdict-list.txt

รอซักพัก เราก็จะได้ไฟล์ tdict.dic ไปใช้ละ

การใช้โปรแกรม BuildDictionaryFile จำเป็นต้องมีไลบรารี ICU4J อยู่ใน classpath (ใช้ออปชั่น -cp ก็ได้)

ซอร์สโค้ด BuildDictionaryFile.java นั้น ไม่ได้เผยแพร่ออกมาพร้อมกับตัว ICU4J แต่หาดาวน์โหลดได้ในอินเทอร์เน็ต (update 2011.05.13: ไฟล์ BuildDictionaryFile.java ที่ ICT Trac) (ค้นอินเทอร์เน็ตด้วยคำว่า “BuildDictionaryFile.java” แล้วพยายามหาไฟล์รุ่นที่ใหม่ที่สุด ตัวที่ผมใช้อยู่นี้ อยู่ในแพคเกจ com.ibm.icu.dev.tools.rbbi ถ้ารุ่นเก่ากว่านี้มันจะอยู่ในแพคเกจ com.ibm.tools.rbbi คิดว่าเค้ามีการปรับแพคเกจใหม่นิดหน่อย)

การคอมไพล์ ต้องมีไลบรารี ICU4J อยู่ใน classpath (ใช้คลาส com.ibm.icu.util.CompactByteArray, com.ibm.icu.text.UnicodeSet และ com.ibm.icu.impl.Utility)


การใช้ไฟล์พจนานุกรมในการตัดคำ

คลาสที่เราใช้ในการตัดคำด้วยพจนานุกรม ใน ICU4J คือ คลาส DictionaryBasedBreakIterator ในแพคเกจ com.ibm.icu.text
(DictionaryBasedIterator นี้ เป็นซับคลาสของคลาส RuleBasedBreakIterator ซึ่งเป็นอินพลีเมนเตชันของแอบสแตรคคลาส BreakIterator อีกที)

คอนสตรัคเตอร์ของ DictionaryBasedBreakIterator ที่เราจะใช้ ต้องการพารามิเตอร์สองตัว
คือ กฎการตัดคำ (String) และ พจนานุกรม (InputStream)

ผมไม่รู้จะหากฎมาจากไหนดี ก็เลยไปเอามาจากที่เค้ามีอยู่แล้วละกัน อย่างนี้

String rules = (RuleBasedBreakIterator.getWordInstance(new Locale ("th"))).toString();

คำสั่งนี้ จะไปเรียกเอาตัวตัดคำด้วยกฎ (สำหรับคำภาษาไทย) มาจากคลาส RuleBasedBreakIterator
ซึ่งจริง ๆ ผมก็ไม่รู้แน่ ว่ามันมีอยู่หรือไม่ อย่างไรก็ตาม หากตัว RuleBasedBreakIterator ไม่มีตัวตัดคำสำหรับโลแคล (locale) ใด มันก็จะส่งคืนตัวตัดคำปริยาย (มาตรฐาน) มาให้เรา เอาเป็นว่าไม่ต้องห่วงละกัน (ยังนึกวิธีดี ๆ ไม่ออกน่ะ :P)
Update: 2006.12.28 พี่ป๊อกไขขาน สร้างความกระจ่างเรื่องที่ว่า กฎมันมาจากไหน ดูได้ที่ เสริม ICU4J ในนั้นยังแสดงวิธีการดึงกฎจากไฟล์กฎอีกด้วย (แต่จะสร้างไฟล์กฎยังไงหว่า? .. ต้องศึกษากันต่อไป)

หลังจากได้ตัวตัดคำด้วยกฎมาแล้ว เราก็ดึงกฎการตัดออกมาซะ ด้วยเมทธอด toString()
(ง่าย ๆ อย่างนี้แหละ .. แต่หาอยู่นาน – -“)

จากนั้น เราก็เตรียมพจนานุกรม ก็ไม่มีอะไรมาก แค่ชี้ไปหาไฟล์ที่เราสร้างมาจากโปรแกรม BuildDictionaryFile ตะกี้

InputStream dict = new FileInputStream("tdict.dic");

เท่านี้ล่ะ

จากนั้นเราก็สามารถสร้างอินสแตนซ์ของ DictionaryBasedBreakIterator ได้แล้ว

BreakIterator iter = DictionaryBasedBreakIterator(rules, dict);

การใช้งานก็เหมือนกับ BreakIterator ปกติ (ซึ่งก็คล้ายกับ iterator ทั่วไป)
โดยเริ่มแรกเราต้องส่งข้อความที่จะตัดไปให้ตัว BreakIterator เสียก่อน ด้วยเมธทอด setText()
จากนั้นเราก็ให้ iterator มันวนไปเรื่อย ๆ ด้วยเมทธอด next() จนกว่าจะจบข้อความ

โค้ดด้านล่างจะทำการพิมพ์คำที่ตัดได้ ตามด้วยตัวอักษร “|” ทีละคำ ๆ วนไปจนกว่าจะจบข้อความ


String text = "ข้อความที่จะตัดในนี้";

iter.setText(text); // iter คือ BreakIterator มาจากข้างบน

int start = iter.first();
for (int end = iter.next();
      end != BreakIterator.DONE;
      start = end, end = iter.next()) {
  System.out.print(text.substring(start,end));
  System.out.print("|");
}

เอ แล้วเราทำ serialization ตัวตัดคำ+พจนานุกรมที่สร้างขึ้นมาแล้วได้รึเปล่านะ ?


ข้อจำกัดของพจนานุกรมสำหรับตัดคำใน ICU4J อย่างหนึ่งที่พบ ก็คือ
ขนาดของพจนานุกรมไม่สามารถใหญ่กว่า 32,767 คำได้
คาดว่า ในซอร์สโค้ดอาจจะใช้ตัวแปรชนิด short (Java short ใช้ 16 บิต) ในการอ้างอิงตำแหน่งคำ
จึงสามารถอ้างอิงตำแหน่งได้สูงสุดเท่ากับตัวเลขที่ใหญ่ที่สุดที่ (signed) short เก็บได้ ซึ่งก็คือ 32,767 นั่นเอง
(หากต้องการให้พจนานุกรมใหญ่กว่านี้ อาจลองแก้ไข คลาส BuildDictionaryFile และ DictionaryBasedBreakIterator แต่ก็อาจพบผลข้างเคียงได้ ในคลาสที่เรียกใช้หรือสืบทอดคลาสเหล่านี้)

ICU4J API References

technorati tags: 

Statistical Machine Translation lecture at Kasetsart University

บรรยาย: การแปลภาษาด้วยเครื่องด้วยวิธีทางสถิติ: อะไรที่เป็นไปได้ในวันนี้?

โดย ฟิลิปป์ เคิห์น มหาวิทยาลัยเอดินบะระ สก็อตแลนด์

วันจันทร์ที่ 18 ธันวาคม 2549 – 9:30-11:30 น.

ห้อง 204 ตึกวิศวกรรมคอมพิวเตอร์ (ตึก 15) มหาวิทยาลัยเกษตรศาสตร์ บางเขน

ลงทะเบียน


Lecture: Statistical Machine Translation: What is possible today?

by Philipp Koehn, University of Edinburgh, Scotland

Monday, December 18, 2006 – 9:30-11:30 am

Room 204, Computer Engineering Building (Building 15), Kasetsart University

Register


Synopsis:

Philipp will give an overview of the current state of the art and the research challenges in machine translation. Translating text from one language to another by computer is one of the oldest challenges in artificial intelligence research, but for many years machine translation (MT) has been considered a dirty word by many for failing to deliver. Today, with the use of novel methods, fast computers and access to large amounts of translated material, we are coming closer to a solution to this problem and it is now possible to build machine translation system within a few hours.

The statistical approach to machine translation provides a set of techniques for automatically learning translation knowledge from existing human translations (bilingual data), and applying that knowledge to translate previously-unseen sentences. When it was first introduced, statistical MT was far too slow and inaccurate to be useful — it was an interesting lab experiment. Now, statistical MT significantly outperforms other methods in many language pairs and domains, at speeds permitting commercial applications like foreign news broadcast translation.

Key issues addressed include:

  • What changes have occurred that now make this possible?
  • How good is the quality and what remains to be done?
  • How has use of phrasal and syntactic knowledge helped?
  • What are the major technical advances of the past few years, and known limitations?
  • What new techniques are now being applied to machine translation to improve quality even further?

Presenter Bio:

Philipp Koehn is a lecturer (Assistant Professor) at the University of Edinburgh. He received his PhD from the University of Southern California, where he was a research assistant at the Information Sciences Institute (ISI) from 1997 to 2003. He was a postdoctoral research associate at the Massachusetts Institute of Technology (MIT) in 2004, and joined the University of Edinburgh as a lecturer in 2005. His research centers on statistical machine translation, but he has also worked on speech in 1999 at AT&T Research Labs and text classification in 2000 at Whizbang Labs. Philipp is a co-founder of Getprice, a German price comparison Internet company, where he acted as CTO from 2000-2005.

technorati tags: 

Sanskrit and Artificial Intelligence

Knowledge Representation in Sanskrit and Artificial Intelligence
by Rick Briggs, Roacs, NASA Ames Research Center
(published in AI Magazine, Volume 6, Number 1, Spring 1985)

There have been suggestions to use Sanskrit as a metalanguage for knowledge representation in e.g. machine translation, and other areas of natural language processing because of its highly regular structure (The AI Magazine, Spring, 1985 #39). This is due to Classical Sanskrit being a regularized, prescriptivist form abstracted from the much more irregular and richer Vedic Sanskrit. This levelling of the grammar of Classical Sanskrit occurred during the Brahmana phase, after the language had fallen out of popular use, arguably qualifying Classical Sanskrit as an early engineered language.
— from Wikipedia entry, Sanskrit

via note

tags: , , , , ,

The 1st School of Asian Applied NLP

ใครสนใจก็ลองสมัครไปเรียนดูนะครับ รับประมาณ 30 คนได้ ไม่เห็นเค้าพูดถึงค่าใช้จ่ายเลย (หรือว่าออกให้ ฟรี ? :P)

Asian Applied Natural Language Processing for Linguistics Diversity and Language Resource Development (ADD) is delighted to announce the call for participation of the First School of Asian Applied NLP (August 21 – September 1, 2006).

More information, course outline and detail schedule.

Important dates

  • Jul 21, 2006 Due date of application submission
  • Jul 31, 2006 Notification of participant acceptance
  • Aug 21 – Sep 1, 2006 Course 1: Introduction to NLP + Workshop

Venue

Sirindhorn International Institute of Technology (SIIT), Thammasat University, Pathumthani, Thailand

Organizers and Supporters

NICT Asia Research Center (Japan) — Asian Language Resources Network ProjectNECTEC (Thailand) — SIIT (Thailand) — Asia-Pacific Association for Machine TranslationAsian Federation of Natural Language ProcessingPAN Localization ProjectCenter for Research in Urdu Language Processing (Pakistan)

ADD School of Asian Applied Natural Language Processing

tags: , ,

KICSS 2006 : Knowledge, Information and Creativity Support Systems

The 1st International Conference on
Knowledge, Information and Creativity Support Systems

August 1-4, 2006 Ayutthaya, Thailand

(abstract submission deadline: May 15, 2006)

http://kind.siit.tu.ac.th/kicss2006/

The conference will cover a broad range of research topics in the fields of knowledge engineering and science, information technology, creativity support systems and complex system modeling. They include, but are not limited to:

  • Knowledge Discovery in Database / Data Warehouse/Mining
  • Decision Sciences / Decision Support Systems
  • Group Decision and Negotiation
  • Creativity Support Systems
  • Knowledge Sciences, Technologies and Management
  • Knowledge Reuse and Ontology
  • Knowledge-based E-Commerce / E-learning, E-knowledge
  • Web Intelligence Tools
  • Intelligent Systems and Agents
  • Complex System Modeling and Analysis
  • Meta-synthesis and Advanced Modeling
  • Natural Language Understanding Tools

Hosted by SIIT, Thammasat University
Co-hosted by JAIST and TCL Lab
Sponsored/supported by JCS, NECTEC and AFNLP

tags: , , ,