ย้ายบล็อกไปที่ bact.cc แล้วนะครับ

พ.ร.บ.คอมพิวเตอร์
หยุด ร่างพ.ร.บ.คอมพิวเตอร์
พื้นที่เก็บข้อมูลออนไลน์ ฟรี 2GB จาก Dropbox (sync กับ Windows, Linux, Mac, iPhone, Android ฯลฯ ได้)
Showing posts with label computational linguistics. Show all posts
Showing posts with label computational linguistics. Show all posts

2009-04-24

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>

ใน w คือ คำ, ใน s คือ ประโยค

ดาวน์โหลดข้อมูล : foosci-20090424.tar.bz2 (สัญญาอนุญาต CC by-sa เช่นเดียวกับเนื้อหาใน foosci.com)
ข้างในจะมีสองแฟ้ม foosci00.xml และ foosci01.xml ให้ก๊อปปี้ไปใส่ในไดเรกทอรีข้อมูลของ NLTK (NLTK_DATA) $NLTK_DATA/corpora/rotibc ตัวโมดูลที่จะพูดถึงต่อจากนี้จะวิ่งมาหาที่ตำแหน่งนี้

ได้ข้อมูลมาแล้ว จะเอาเข้าไปใช้ใน NLTK ยังไง ? ก็ต้องเขียนตัว corpus reader ขึ้นมาก่อน ซึ่งกรณนี้ เราจะทำต่อมาจาก XMLCorpusReader (เรียกว่า inherit ไหม?) โดยไอเดียไม่มีอะไรมาก ก็ implement ตัวฟังก์ชั่น .words() เพื่อส่งกลับรายการคำ และฟังก์ชั่น .sents() เพื่อส่งกลับรายการประโยค โดยดูตัวอย่างจาก BNCCorpusReader

ที่ต้องทำเพิ่มเติมก็คือ สร้างแฟ้ม __init__.py ใส่ไว้ใน package เพื่อที่ว่าตอนโหลด มันจะได้โหลดเอาตัวข้อมูลขึ้นมาให้เราอัตโนมัติเลย (ซึ่งไม่ต้องกลัวอึด เพราะว่าโหลดแบบ lazy คือยังไม่ได้โหลดข้อมูลจริง ๆ จนกว่าจะใช้)

ตอนทำ __init__.py นี้ ทำให้รู้ว่า ทุกไดเรกทอรีที่เราจะใส่โมดูลอะไรลงไป จะต้องมีแฟ้มนี้ ไม่งั้นตอน build มันจะไม่นับไดเรกทอรีนั้นเป็น package จะข้ามไป เพราะงั้นถึงไม่ได้จะโหลดจะทำอะไร ก็ต้องใส่แฟ้มว่าง ๆ ไว้ (ดูเอกสาร Python Tutorial - Modules)

ใน __init__.py ไม่มีอะไรมาก แค่โหลดข้อมูลเฉย ๆ :
foosci = LazyCorpusLoader('rotibc', RotiCorpusReader, r'foosci\d+\.xml')

ดาวน์โหลดแพคเกจ roti.corpus : rotibc-0.1.tar.gz
แตกออกมาแล้ว ก็ลงด้วยคำสั่ง :
sudo python setup.py install
(ดูวิธีสร้าง setup.py มาจากเอกสาร Distutils - Creating a Source Distribution)

โอเค ครบละ ข้อมูล โปรแกรมอ่าน คราวนี้มาเล่นกัน ลองใน interpreter shell ของ Python ก็ได้


>>> from roti.corpus import foosci
>>> foosci.fileids() #แสดงรายชื่อแฟ้มในคลังข้อความ
['foosci00.xml', 'foosci01.xml']
>>> foosci.words() #แสดงรายการคำ
['p', u'\u0e19\u0e31\u0e01', ...]
>>> for w in foosci.words()[0:5]: #พิมพ์คำจากรายการ ตำแหน่ง 0-5
...     print w,
... 
p นัก วิทยาศาสตร์ อังกฤษ ที่ 
>>>
>>> foosci.sents() #แสดงรายการประโยค
[['p', u'\u0e19\u0e31\u0e01', ...],
['pcenterimg', ' ', 'src=http://', ...], ...]
>>>

จะเห็นว่า เราพอจะเล่นอะไรกับมันได้ละ ถ้าจะเล่นมากกว่านี้ ลองดูตัวอย่างที่ Getting Started (NLTK)

ตัวอย่างหนึ่งจาก NLTK Book บทที่ 2 Accessing Text Corpora and Lexical Resources เขาลองเล่นกับ conditional frequency distribution เอามาสร้างประโยคมั่ว ๆ เล่น จากโมเดลไบแกรม ด้วยโค้ดด้านล่างนี้ :


def generate_model(cfdist, word, num=15):
    for i in range(num):
        print word,
        word = cfdist[word].max()

words = foosci.words()
bigrams = nltk.bigrams(words)
cfd = nltk.ConditionalFreqDist(bigrams)

ลองใส่คำอะไรสักคำให้มันดู มันจะสร้างประโยคมาให้


>>> generate_model(cfd, u'คอมพิวเตอร์')
คอมพิวเตอร์ ที่ มี ความ เสี่ยง มะเร็ง เต้า นม   href=http:// www. physorg. com/ ~r/ foosci/

การสร้างประโยคนั้น generate_model() ใช้วิธีเลือกเอาคำที่น่าจะเกิดต่อจากคำข้างหน้ามากที่สุด มาเรียงต่อกัน

ลองเล่นต่ออีกนิดหน่อยกับติวอันนี้ Working with corpora: Character Ngrams

ถ้ามีคลังข้อความที่น่ารัก ๆ กว่านี้ ก็น่าจะใช้ NLTK นี้ไปใช้เรียนสอน NLP หรือภาษาศาสตร์คลังข้อมูลง่าย ๆ ได้

ปัญหาอย่างนึงที่เจอตอนนี้คือ nltk.text.Text() ใช้กับ unicode ไม่ได้ คือมันจะพยายามแปลงข้อความไปเป็น ascii ซึ่งแปลงไม่ได้ แล้วก็จะตาย nltk.text.Text() นี่มีฟังก์ชั่นน่าใช้สำหรับการเรียนรู้เรื่องภาษาศาสตร์เยอะพอดู เช่น .concordance() .collocations() .similar()

<อัปเดต 2009.04.25> ใช้กับ nltk.Text() ได้แล้ว (แก้ตามคำแนะนำจากเมลกลุ่ม nltk-users) โดยต้องให้คำใน list เป็น str ("") ที่ encode ด้วย utf-8 แทนที่จะใส่เป็นสตริงแบบ unicode (u"") ทำได้โดยแก้สองฟังก์ชั่น _elt_to_words() และ _elt_to_sents() ในแฟ้ม roti/corpus/rotibc.py ตรง .append(w.text) ให้เป็น.append(w.text.encode("utf-8", "replace")) เดี๋ยวจะปรับตัวแพคเกจใหม่ </อัปเดต>

ลองเล่นดูครับ เอาไปโมต่อตามสบาย โค้ดทั้งหมดเป็น public domain

ใช้ NLTK แล้วพบปัญหา คุยกับผู้ใช้รายอื่น ๆ ได้ที่เมลกลุ่ม nltk-users หรือถ้าอยากคุยกับคนไทย ลองกลุ่ม THLTA


แถม : Open License และคลังข้อมูลภาษา

ในงาน NAC 2009 โดยสวทช.ที่ผ่านมา ได้มีโอกาสแลกเปลี่ยนประเด็น open content, open license และ คลังข้อมูลภาษา กับคนในวงการ NLP จำนวนหนึ่ง ซึ่งก็มีความคิดเห็นหลาย ๆ อย่าง หลาย ๆ มุมก้นไป

เกือบทุกคนเห็นด้วยว่า เป็นเรื่องสำคัญที่ควรจะมีอะไรที่มันแชร์กันได้ ที่มัน open แต่ความหมายของคำว่า open สำหรับแต่ละคนก็ดูจะไม่เท่ากัน บางคนบอกว่า คลังอันนั้นอันนี้ฟรี ตัวนั้นตัวนี้โอเพ่นซอร์ส แต่พอไปดูเอาจริง ๆ ในรายละเอียด ก็พบว่า จำเป็นต้องลงทะเบียนก่อนบ้างหรือไม่ได้อัปเดตนานแล้วบ้าง (พจนานุกรม Lexitron) หรือลิงก์ดาวน์โหลดหายไปบ้าง (ORCHID Corpus - ดาวน์โหลดได้ที่ backup site) หรือก่อนหน้านี้เรื่องของฟอนต์หลาย ๆ ตัว ที่เอามาใช้ได้ฟรี แต่ไม่รู้ว่าจะโมได้ไหม redistribute ได้ไหม

ความเห็นของผมก็คือ จะเปิดหรือจะปิด อย่างไรก็ได้ เป็นสิทธิของเจ้าของข้อมูลที่เขาลงแรงลงเวลาไป แต่ถ้าจะบอกว่าเปิด ก็ขอให้บอกให้ชัดเจนหน่อย ว่าในเงื่อนไขอะไร แล้วจะเอามาใช้จริง ๆ ได้ยังไง การบอกว่า เปิด เฉย ๆ โดยไม่ได้ให้รายละเอียดอะไรเลย ในทางปฏิบัติก็แทบจะเหมือนการไม่เปิด หน้า การแลกเปลี่ยนทรัพยากรและเครื่องมือ ที่ THLTA ก็อาจจะเป็นความพยายามหนึ่งที่จะทำให้เรื่องพวกนี้เคลียร์

สิ่งที่ผมคิดว่าน่าสนใจ และเป็นคุณสมบัติสำคัญของ open licenses ทั้งหลาย ไม่ว่าจะเป็น copyleft, GNU หรือ Creative Commons ก็คือ การไม่ต้องขออนุญาต ผมคิดว่าการไม่ต้องขออนุญาตนี้ทำให้ ข้อมูล โค้ด ไอเดีย ต่าง ๆ มันไหลเวียนได้อย่างอิสระ-ทันที ใครอยากจะเล่นอะไรก็เอา เต็มที่ ตามเงื่อนไขที่ประกาศไว้ชัดเจนล่วงหน้า ไม่ต้องรอไปรอมา ไม่ต้องตกอยู่ในภาวะไม่แน่ใจ

ซึ่งจริง ๆ แล้วเรื่องของความชัดเจนนี้ แม้จะเป็น closed content, closed source หรืออะไรก็ตาม ก็สามารถจะชัดเจนเรื่องนี้ได้ เพียงประกาศให้ชัดเจน — ไม่ใช่แค่บอกเฉย ๆ ว่า เปิด แล้วก็ทิ้งให้งง ให้เดาใจกันเล่น ๆ ว่า ตกลงจะเปิดแบบไหน เปิดยังไง

technorati tags: , , ,

2008-07-17

different treatments of Mai Yamok in BEST Corpus

In the first release of BEST Word Segmented Corpus (free registration required for corpus download), I found different segmentations for May Yamok (repetition mark):

  • |พร้อม|ๆ| |กับ|
  • |ร้อย|ๆ |ปี|
  • |ทั้งๆ ที่|
  • |ต่างๆ| |ดัง|
  • |ย่อ|ๆ| |ว่า|
  • |ย่อ|ๆ |ว่า|

(Real data, taken from encyclopedia_00005.txt. '|' is word/token boundary)

These are probably intended. Or inconsistency ? Not quite sure, will ask people around.

BEST เป็นการประเมินประสิทธิภาพอัลกอริธึม/ซอฟต์แวร์ประมวลผลภาษาไทย ปีนี้จัดแข่งขันซอฟต์แวร์ตัดคำไทย ในงาน NSC ครั้งที่ 11 - สนใจร่วมได้

technorati tags: , ,

2008-01-28

Zellig Harris's Operator Grammar

ค้น ๆ เรื่อง Dependency Grammar อยู่ ก็ไปเจอนี่เข้า: Operator Grammar

เท่าที่อ่าน ๆ ไม่กี่หน้า ก็ประมาณว่า Operator Grammar เสนอข้อจำกัดสากล (universal constraint) 3 อย่าง คือ Dependency การจะใช้คำบางคำได้จำเป็นต้องมีคำอื่นบางคำร่วมด้วย, Likelihood การใช้คำร่วมกันบางแบบมีโอกาสเกิดมากกว่าแบบอื่น, Reduction คำในแบบผสมที่มีโอกาสเกิดสูงสามารถลดรูปให้สั้นลงได้ และบางครั้งก็ละทั้งหมดได้เลย

ซึ่งนักภาษาศาสตร์บางคนก็ชี้ การมี Likelihood นี้ หมายถึง Operator Grammar นี้ คำนึงถึงเรื่อง สถิติ/ความน่าจะเป็น ในแก่นของไวยากรณ์เลย ไม่ใช่เป็นการเพิ่มเติมทีหลัง

ส่วนเรื่อง Reduction ก็เป็นตัวชี้ให้เห็นได้ว่า การลดขนาดของข้อความ/จำนวนคำ ไม่จำเป็นต้องเป็น การลดจำนวนของสารสนเทศ (information)

นอกจากนี้ในการวิพากษ์เปรียบเทียบ Link Grammar และ Operator Grammar (ซึ่งต่างก็มีแนวคิดบางส่วนคล้ายคลึง/ได้อิทธิพลมาจาก Dependency Grammar) ด้วย โดยบอกว่า Operator Grammar นั้น มีเรื่อง semantics ด้วย (และ Link Grammar ไม่มี) โดยผมคิดว่าอยู่ในส่วนของ Dependency ที่มีคำประเภทต่าง ๆ ที่ต้องการอาร์กิวเมนต์ต่าง ๆ กัน (เช่น นาม ไม่ต้องการอาร์กิวเมนต์เลย, กริยาบางประเภทต้องการนามหนึ่งตัว บางประเภทต้องการสองตัว) ซึ่งตรงนี้คิดว่าได้รับอิทธิพลมาจาก Categorial Grammar

Operator Grammar นี้ เสนอโดย Zellig Harris ซึ่งในวิกิพีเดียบอกว่า นี่เป็นผลงานที่สรุปงานทั้งชีวิตของเขา 60 ปีในการครุ่นคิดเรื่องภาษา สารสนเทศ และวาทกรรม เขาเป็นผู้ก่อตั้งภาควิชาภาษาศาสตร์แห่งแรกในสหรัฐอเมริกา ที่มหาวิทยาลัยเพนซิลเวเนีย (ซึ่งจนถึงปัจจุบัน เพนซิลเวเนียก็ยังเป็นหนึ่งในมหาวิทยาลัยชั้นนำด้านภาษาศาสตร์และภาษาศาสตร์เชิงคำนวณมาโดยตลอด ทฤษฎีไวยากรณ์มากมายเกิดขึ้นที่นี่) Zellig Harris เป็นอาจารย์ภาษาศาสตร์ของ Noam Chomsky

ผมอ่านทั้งหมดด้วยความตื่นเต้น

Zellig S. Harris (1909-1992)

  • 1988. Language and Information (ISBN 0-231-06662-7)
  • 1989. The Form of Information in Science: Analysis of an immunology sublanguage (ISBN 90-277-2516-0)
  • 1991. A Theory of Language and Information: A Mathematical Approach (ISBN 0-19-824224-7)
  • 1997. The Transformation of Capitalist Society (ISBN 0-8476-8412-1)

technorati tags: , ,

2007-12-27

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