NLTK corpus readers for NECTEC BEST and ORCHID corpora

ความเดิมจากตอนที่แล้ว ทดลองสร้าง corpus reader ใน NLTK

ตอนนี้แก้การ encode ให้ใช้ได้กับ nltk.Text() แล้ว (แทนที่จะเก็บเป็น unicode ก็เก็บเป็น utf-8 encoded str แทน)

พร้อมกับเพิ่มตัวอ่านสำหรับคลังข้อความ BEST และ ORCHID ด้วย

ตัวอ่านคลัง BEST ในรุ่น 0.3 นี้ เรียกดูเป็นหมวดได้ (ข่าว วรรณกรรม สารานุกรม บทความ) เรียกดูข้อมูลกำกับขอบเขตคำ (word boundaries) ได้ แต่ยังไม่รองรับ <NE>named-entities</NE> กับ <AB>คำย่อ</AB> เนื่องจาก BEST ไม่มีข้อมูลขอบเขตประโยค ตัวอ่านคลังจะสร้างขึ้นเอง โดยสมมติ \n เป็นขอบเขตประโยค

ส่วนตัวอ่านคลัง ORCHID ในรุ่น 0.3 นี้ เรียกดูข้อมูลกำกับขอบเขตคำและชนิดคำ (Part-of-Speech) ได้ แต่ยังไม่รองรับขอบเขตย่อหน้า และยังเรียกดูเป็นรายเอกสารไม่ได้ (รุ่นนี้ทำงานกับคลัง ORCHID แบบที่ถูกเอา document-related metadata ออกไป)

ดาวน์โหลด & ติดตั้ง

แพ็คเกจ rotic รุ่น 0.3 ซอร์สโค้ดเผยแพร่ด้วยสัญญาอนุญาต GNU GPLv2 ตาม NLTK – ดาวน์โหลด rotic-0.3.tar.gz

วิธีติดตั้ง อ่าน README.TXT และ INSTALL.TXT – อย่าลืมดาวน์โหลดคลังข้อความมาติดตั้งด้วย รายละเอียดและสัญญาอนุญาตของข้อมูลแต่ละชุด อยู่ใน CORPORA.TXT

มีคำแนะนำอะไร เขียนมาบอกกันได้ครับ อยากจะลองทำให้มันเอาไปใช้ในการเรียนการสอนได้ – ไม่เฉพาะสำหรับนักเรียนคอมพิวเตอร์เท่านั้น แต่สำหรับนักเรียนภาษาศาสตร์ ฯลฯ ด้วย

ตอนนี้ความเร็วไม่ค่อยดีเท่าไหร่ โดยเฉพาะการโหลดตัว ORCHID ซึ่งใหญ่มาก ส่วนหนึ่งเป็นเพราะโค้ดยังซ้ำซ้อนอยู่หลายจุด เช่นตรงการแปลง utf-8 ที่น่าจะทำได้ตั้งแต่ระดับแรก ๆ ที่อ่านเข้ามาเลย ไม่ใช่มาแปลงเอาตอนหลัง-ต้องวนลูปอีกหนึ่งครั้งแบบขณะนี้ โค้ดยัง refactor ได้อีกเยอะ ใครคล่อง Python ก็ช่วยดูหน่อยนะครับ ผมแค่พอเขียนไถ ๆ ได้ ขอบคุณครับ 🙂

ตัวอย่างจาก example.py

1. พิมพ์ข้อความมั่ว ๆ ขึ้นมาจากตัวแบบ n-gram ที่สร้างจากคำในคลัง foosci :


foosci_text = nltk.Text(foosci.words())
foosci_text.generate()

ผลลัพธ์ :

… ซึ่ง ทฤษฎี สรุป ความรู้ ของ เรา เอา ไส้เดือน ไป ปล่อย ใน พื้นที่ ๆ มี ความ สงสัย ระหว่าง ความ เชื่อ เรื่อง มิติ ใหม่ นี้ …

2. พิมพ์ คำ/ชนิดคำ จาก 5 ประโยค แรกของคลัง ORCHID
โปรดสังเกตว่า เราใช้ชุดชนิดคำ (POS/tagset) แบบง่าย สามารถสลับชุดชนิดคำได้โดยสลับค่า simplify_tags :


for sent in orchid.tagged_sents(simplify_tags=True)[0:5]:
    print "[",
    for (word, tag) in sent:
        print word + "/" + tag,
    print "]"

ผลลัพธ์ :

[ การ/FIX ประชุม/V ทาง/N วิชาการ/N /PUNC ครั้ง/C ที่_1/DETN ]
[ โครงการวิจัยและพัฒนา/N อิเล็กทรอนิกส์/N และ/CONJ คอมพิวเตอร์/N ]
[ ปีงบประมาณ/N /PUNC 2531/N ]
[ เล่ม/C /PUNC 1/DETN ]
[ ศูนย์เทคโนโลยีอิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ/N ]

3. หาค่าการกระจายของสองคำ การ และ ความ ใน 4 หมวดของคลัง BEST
โปรดสังเกตว่า ตรงคำที่เราจะป้อนเข้าไปให้ฟังก์ชั่นต่าง ๆ ของ NLTK เราจะแปลงมันเป็น utf-8 encoded str ก่อน :

cfd = nltk.ConditionalFreqDist( (genre, word) for genre in best.categories() for word in best.words(categories=genre)) genres = ['news', 'encyclopedia', 'novel', 'article'] prefixs = [w.encode("utf-8") for w in [u'การ', u'ความ']] cfd.tabulate(conditions=genres, samples=prefixs) read more

playing around Thai blog corpus with NLTK

อยากจะลองเล่น NLTK กับข้อมูลภาษาไทยดู คิดไปคิดมา เอาข้อมูลจาก foosci.com มาลองดูละกัน เขาเปิดให้ใช้ เป็น ครีเอทีฟคอมมอนส์ แสดงที่มา-อนุญาตแบบเดียวกัน (CC by-sa)

แต่ไม่อยากไปดึงมาเอง ขี้เกียจ เห็นว่าโครงการโรตี (อัลฟ่า) โดย Opendream ดูดบล็อกไทยจำนวนหนึ่งมาเก็บไว้ได้ระยะหนึ่งแล้ว เพื่อใช้ในการแนะนำลิงก์ (ดูตัวอย่างที่ keng.ws ที่ท้ายแต่ละโพสต์) ก็เลยเอาจากตรงนั้นมาใช้ละกัน

ข้อมูลที่มีเป็น XML ที่ dump มาจาก MySQL เราก็เขียนสคริปต์ก๊อก ๆ แก๊ก ๆ ดึงเฉพาะที่อยากได้ออกมา ด้วย xml.etree.cElementTree (ตอนแรกใช้ ElementTree แตน ๆ แต่อืดเกิน เนื่องจากแฟ้มมันใหญ่)
เอา HTML tags ออกด้วย Beautiful Soup แล้วตัดคำด้วย python-libthai ตัดประโยคแบบถึก ๆ ด้วย .split(‘\n’) จะได้ข้อมูลออกมาหน้าตาประมาณนี้ (จะเห็นว่าข้อมูลมันไม่ได้สมบูรณ์มาก มีแท็ก HTML โผล่มาด้วย-อันนี้เป็นที่ข้อมูลป้อนเข้าที่ dump มา) :

<?xml version="1.0" encoding="utf-8"?> <roti> <entry id="4947" url="http://www.foosci.com/node/401" ...> <tags> <tag>LHC</tag> <tag>quantum physics</tag> ... </tags> <title> <w>บิดา</w> <w>ของ</w> <w>อนุภาค</w> ... </title> <content> <s> <w>p</w> <w>นัก</w> <w>วิทยาศาสตร์</w> ... </s> <s> <w>pcenter</w> <w space="1"> </w> <w>ภาพ</w> ... </s> ... </content> </entry> <entry> ... </roti> read more

The 3rd ADD Summer School

The 3rd Asian Applied Natural Language Processing for Linguistics Diversity and Language Resource Development (ADD 3) Lectures + Workshops
Feb 25 – Mar 3, 2008
@ Sirindhorn International Institute of Technology, Bangkadi Campus, Pathumthani, Thailand

ปีนี้เน้นเรื่องการประมวลผลภาพ (ข้อความ) และการประมวลผลเสียงพูด

พรุ่งนี้ว่าจะไปเข้าชั้นเรียน เรื่อง Semantic Web โดย อ.วิลาศ วูวงศ์ read more

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). read more

TIGER API 1.8 released

TIGER API is a library which allows Java programmers to easily access the structure of any corpus given as a TIGER-XML file.

oeze, one of the authors of TIGER API, has leave a message to us today:

BTW, Tiger API has moved. This is the new URL: TIGER API.

We have also included a section describing how to access corpora encoded in Penn Treebank format and other formats.

Thanks, oeze ! 🙂

link: http://tigerapi.org

Emdros – a database engine for annotated text

เมื่อคืนวีร์พูดถึง Emdros ว่าน่าสนใจ สำหรับงานฐานข้อมูลทางภาษาศาสตร์ ก็เลยเข้าไปดูเว็บซะหน่อย

Emdros is:

  • an opensource text database engine for storage and retrieval of analyzed or annotated text.
  • applicable especially in corpus linguistics and computational linguistics.
  • equiped with a powerful query-language MQL, based on the Extended MdF mathematical model of text.

A short paper explaninig Emdros.

ข้างบนจะเห็นคำว่า Extended MdF หรือที่ในเว็บ Emdros จะใช้คำว่า EMdF, ชื่อเต็มๆ ของมันคือ Extended Monads dot Feature โดยพัฒนาต่อมาจาก Monads dot Feature (book; review) read more

CFP: NLP for Under-Resourced Languages

2nd Call for Papers for the Workshop
NLP for Under-Resourced Languages
Friday, 10 June 2005. Dourdan, France

Held in conjunction with the TALN 2005 conference (6-10 June 2005)

Linguistic work on these languages is often lacking, and must overcome a number of difficulties:

  • the presence of many lexical alternatives
  • multiple spellings for the same word
  • the lack of exhaustive lexicons
  • non-standardized transcription methods
  • etc.

น่าจะเกี่ยวกับภาษาไทยบ้างนะ
อย่างตัวสะกดของเรา ก็เปลี่ยนไปตามสมัยนิยมบ้าง เปน สอาด
หรือบางคำสะกดผิดกันแพร่หลาย จนถ้านับตามความนิยม มันก็น่าจะเป็นคำที่ ‘ถูก’ อย่าง สาธร/สาทร ราดหน้า/ลาดหน้า
ส่วน transcription ถ้านับเรื่อง transliteration สำหรับภาษาไทย ก็ไม่มีมาตรฐานที่ใช้แพร่หลาย (มาตรฐานน่ะมี แต่ใช้ไม่แพร่หลาย และก็ยังมีข้อยกเว้น โดยเฉพาะเรื่องคำจากภาษาบาลี-สันสกฤต )
รวมทั้งเรื่องการเขียนคำทับศัพท์ด้วย นี่ชัดๆ เลย เขียนกันไปคนละทิศคนละทาง มาตรฐานก็มี (อีกแล้ว) แต่ไม่ค่อยมีใครใช้ อีกทั้งตัวมาตรฐานเอง ก็ยังมีคำยกเว้นอยู่มากมาย คือเว้นให้กับคำที่เขียนจนเป็นที่นิยมไปแล้ว ให้สะกดแบบเดิมไป read more