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

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

2009-04-29

Another Sunny Day animation

I just love this song. It reminds me a long walk over a city I used to spent a good part of my life in. It was raining in the morning, but the sky went very clear after that. Found this animation in YouTube, and love it also. Thanks to this interconnectivity and hypertextuality. — Another Sunny Day, Belle & Sebastian.

my blip.fm: http://blip.fm/bact

technorati tags: , ,

2009-04-28

The Condition of Free Culture

(เงื่อนไขสู่วัฒนธรรมเสรี)

ขอคิดต่อจากพี่เทพ

...

เป็นไปได้ว่า เหตุหนึ่งที่ free culture หรือ วัฒนธรรมเสรี นั้นยังไม่แพร่หลายหรือไปไม่ถึงไหนในบางสังคม ก็เพราะ วัฒนธรรมในสังคมนั้น ๆ ไปกันไม่ได้กับแนวคิด เสรี เป็นพื้นฐานของวัฒนธรรมเสรี

...

เสรี = ไม่ต้องขออนุญาต

คุณสมบัติหลักของ สัญญาอนุญาตแบบเปิด (open licenses) ก็คือ การผู้นำไปใช้ไม่ต้องขออนุญาตผู้ถือครองลิขสิทธิ์

เพียงผู้นำไปใช้ ตกลงยินดีที่จะทำตามเงื่อนไข ที่ทางผู้ถือครองลิขสิทธิ์ประกาศเอาไว้แล้ว-อย่างชัดแจ้ง-ต่อสาธารณะ เขาก็มีสิทธิจะใช้งานนั้นในทันที

สิ่งนี้แปลว่า ถ้าคุณทำตามกติกาเดียวกัน ข้อตกลงเดียวกัน คุณก็จะได้รับการปฏิบัติเหมือน ๆ กัน

แต่สิ่งง่าย ๆ แบบนั้น ก็อาจจะเป็นเรื่องลำบากในสังคมหลายมาตรฐาน ที่กติกาเดียวกันก็มักจะให้ผลกับคนกลุ่มต่าง ๆ ต่างกัน

...

เป็นไปได้เช่นกันว่า เหตุหนึ่งที่วัฒนธรรมเสรี นั้นถูกเข้าใจเพี้ยน ๆ ไป เช่นว่า เสรี ก็คือ ให้ใช้ฟรี แค่ขออนุญาตกันก็พอ นั้นก็เพราะ ความมี ความเป็น authority เป็นเรื่องสำคัญในสังคมนั้น หรือ สังคมนั้นโน้มเอียงไปทางสังคมอุปถัมภ์

ความจำเป็นต้องอนุญาต นั้นแปลว่า จะยังต้องมีฝ่ายหนึ่งฝ่ายใด มีอำนาจมากกว่าอีกฝ่ายเสมอ นอกจากนี้มันยังมีแง่มุมของการรวมศูนย์ (centralized) สู่ผู้ให้อนุญาต

ผู้ให้อนุญาตนี้เอง ที่จะเป็นผู้มีสิทธิ์ขาดตัดสินว่า อะไรทำได้ อะไรทำไม่ได้ — ซึ่งสิ่งนี้เช่นกัน ก็ไปกันไม่ได้กับเรื่อง ถ้าทำตามกติกาเดียวกัน ก็ควรรับผลเดียวกันเสมอกัน

เพราะความมี ความเป็น authority ที่ใหญ่กว่ากติกานั้น พูดง่าย ๆ ก็คือสิ่งที่เรียกว่า ฉันคือกฎ

อยากจะอนุญาตคนนี้ แต่ไม่อนุญาตคนนั้น มีอะไรไหม ?

...

เสรี != (ไม่เท่ากับ) ไม่ต้องเสียเงิน

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

สิ่งนี้คือการแลกเปลี่ยนบนฐานของความพอใจและสมัครใจของทั้งสองฝ่าย — เราอาจเรียกสิ่งนี้ว่าความเกื้อกูลระหว่างกันได้ แต่ที่แน่นอนคือ มันไม่ใช่ความเมตตา ไม่ใช่การทำบุญ ไม่ใช่การให้ทาน และไม่ใช่เรื่องบุญคุณ

(ทัศนคติของ องค์กรที่ บริจาค โค้ดเป็นโอเพนซอร์สแก่สาธารณะและให้ชุมชนมาร่วมทำงานด้วย กับ องค์กรที่ ส่งต่อ โค้ดเป็นโอเพนซอร์สแก่สาธารณะและเข้าไปเป็นส่วนหนึ่งของชุมชนในการทำงาน จึงเป็นสองทัศนคติที่แตกต่างกันอย่างมาก)

ความสัมพันธ์ระหว่าง ผู้นำงานไปใช้และผู้ให้ใช้งาน ในวัฒนธรรมเสรี จึงเป็นไปในลักษณะเท่าเทียมเสมอกัน นั่นคือ ต่างก็เป็น peer กัน แลกเปลี่ยนกันในฐานะความสัมพันธ์ที่เท่าเทียมกัน

ซึ่งความเป็น peer ที่เสมอกันนี้เอง ที่ก็ไปกันไม่ได้อีก กับเรื่อง authority หรือความสัมพันธ์แบบมีระดับ (client/server, master/slave, ...)

ความต้องการสร้างบุญคุณบารมี และ อำนาจในการอนุญาต (อย่างรู้ตัวหรือไม่ก็ตาม) จึงอาจจะเป็นอีกเหตุ ที่แนวคิดเสรี ใน วัฒนธรรมเสรี อาจจะไปกันไม่ได้กับ สังคมอุปถัมภ์ และ สังคมลำดับชั้น

...

เช่นนี้แล้ว ในทางหนึ่ง ขบวนการวัฒนธรรมเสรี (free culture movement) จึงอาจจะจำเป็นอยู่เอง ที่นอกเหนือจากความพยายามในการปฏิรูประบบทรัพย์สินทางปัญญาให้มีความเป็นธรรมเสมอภาคขึ้นกว่าเดิมหรือสร้างทางเลือกใหม่ เช่น เนื้อหาแบบเปิดต่าง ๆ แล้ว ก็อาจต้องเข้าร่วมกับการปฏิรูปสังคมโดยรวม เพื่อผลักดันสภาพของสังคม ให้เอื้อกับ แนวคิด เสรี ด้วย

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

...

โลกอีกแบบนั้นเป็นไปได้ แค่เปิดฝา แล้วก็แฮ็กมัน

technorati tags: , , ,

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)

ผลลัพธ์ :

             การ ความ
        news 29567 11186
encyclopedia 25477 8541
       novel 4258 9097
     article 33200 16651

เล่นต่อเอง จากตัวอย่างในหนังสือ NLTK

เดี๋ยวอาจจะให้น้องฝึกงานที่โอเพ่นดรีมเอาไปทำต่อ เช่นทำให้มันใช้ AB, NE หรือขอบเขตประโยค/ย่อหน้าได้ .. เห็นนั่งเล่นเกมมาหลายวันละ :p

technorati tags: , , ,

2009-04-26

Anti-censorship website got blocked by Thai university and ISPs

Reports from Thai netizens to Thai Netizen Network's mailing list showing yet another attempt from Thai authorities to shut down any media that's not on their side. Unsurprisingly (and that's sad to say so), the time comes to Freedom Against Censorship Thailand (FACT). Two commercial ISPs and one university have been reported that they blocked the anti-censorship blog.

It was found on Saturday 2009.04.25. Users who using Internet service of TOT, Buddy Broadband or Kasetsart University will not be able to access http://facthai.wordpress.com/.

Ministry of ICT recently admits they blocked nearly 9,000 urls, of which 6,200 are concerned as a treat to national security. Thai Netizen Network website reports the 66 Red-Shirt/Red-Shirted urls that MICT sent to every ISPs and major websites, urging them to entirely blocked the urls. Noted that this list does not included FACT's url, but it got blocked anyway. With enough ignorance, the MICT block list also includes http://ning.com/ (a social network service), http://www.cbox.ws/ (a chat box service), and http://www.no-ip.org/ (a dynamic DNS service) — common services used by many Thai netizens and bloggers, orange or pink, watching AF TV or not.

The authorities probably expected that every Thai should sacrifices not just their rights and freedom, but also conveniences in everyday life in this time of Media War.

Fortunate enough, some ISPs can think by and for themselves (+their customers). While blocking almost every other urls in the MICT list, they don't touch ning.com and no-ip.org. OK, stupid enough, CSLoxinfo still blocked mashable.com, a (Red-Shirt, huh?) IT news site.

I see necessity in this very situation to repeat it over that: Government's Security IS NOT EQUAL TO National Security.

ความมั่นคงของรัฐบาล ไม่เท่ากับ ความมั่นคงของรัฐ

Summary report on http://facthai.wordpress.com/ blockage:
Can't access (BAD) from (at least) 3 ISPs: TOT, Buddy Broadband, Kasetsart University [source]

  • TOT - BAD (2009.04.25 13:07)
  • Maxnet - OK (2009.04.25 13:48)
  • Kasetsart - BAD (2009.04.25 14:32)
  • CAT HiNet - OK (2009.04.25 16:04)
  • Comcast (US) - OK (2009.04.25 16:36)
  • TOT - BAD (2009.04.25 17:15)
  • TOT - BAD (2009.04.25 17:33)
  • True - OK (2009.04.25 17:40)
  • TOT - BAD (2009.04.25 21:49)
  • True - OK (2009.04.25 23:14)
  • Buddy - BAD (2009.04.26 02:16)
  • CSLoxinfo - OK (2009.04.26 11:26)

technorati tags: , ,

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

2009-04-22

encode("UTF-8", "ignore") ข้าม ๆ เรื่องที่ทำไม่ได้ใน Python

หลังจากเอา python-libthai ของวีร์มาใช้กับข้อมูลที่ได้มาจากเว็บ ก็พบปัญหาเรื่อง character encoding นิดหน่อย

libthai นั้นปัจจุบันทำงานกับข้อมูลที่เป็นภาษาไทย 8 บิตอยู่ (น่าจะเป็น TIS-620) ตัว python-libthai เลยมีขั้นตอนการแปลงจากยูนิโค้ดไปเป็น 8 บิตก่อน ทีนี้ ปรากฏว่า encoder "CP874", "TIS_620" และ "ISO8859_11" ของ Python มันดันแปลงตัวอักษรบางตัวไม่ได้ (เนื่องจากใน charset พวกนั้น มันไม่มีตัวอักษรดังกล่าว) โปรแกรมก็เลยจะตาย ถ้าไปเจออักษรพวกนั้น

ก่อนตายมันจะโวยทำนองว่า :

UnicodeEncodeError: 'charmap' codec can't encode character
u'\u200b' in position 3560: character maps to <undefined>

วิธีแก้แบบถึก ๆ คือ เอาหูไปนาเอาตาไปไร่ซะ ignore มัน ด้วยการไปแก้ แฟ้มชื่อ libthai.c ของ python-libthai (แฟ้มนี้เป็น wrapper ที่ไปเรียก libthai ให้)

หาบรรทัดที่เรียกฟังก์ชั่น PyUnicode_Encode/Decode แล้วแก้พารามิเตอร์ตัวที่สี่เป็น "ignore" ซะ

เช่น จาก


PyObject *txt_cp874 =
    PyUnicode_Encode(s1, s1_len, "CP874", NULL);
tok =
    PyUnicode_Decode(buffer, tok_len, "CP874", NULL);

เป็น


PyObject *txt_cp874 =
    PyUnicode_Encode(s1, s1_len, "CP874", "ignore");
tok =
    PyUnicode_Decode(buffer, tok_len, "CP874", "ignore");

แล้ว sudo python setup.py install ใหม่อีกรอบ (อย่าลืมล้าง build เก่าทิ้งก่อน) ก็น่าจะใช้ได้แล้วครับ

ลิงก์ : Python Unicode How-to

technorati tags: , ,

2009-04-20

modifying setup.py for libthai Python binding in MacPorts environment

(ปรับปรุง 2009.04.21 พบท่าง่ายกว่าเดิม ดูด้านล่าง)

เอา libthai Python binding ที่วีร์ทำเอาไว้มาใช้บน Mac OS X + MacPorts ต้องดัดแปลง setup script นิดนึง

เนื่องจากผมติดตั้ง libthai ผ่านทาง MacPorts (ด้วยคำสั่ง sudo port install libthai) ดังนั้นแฟ้มไลบรารี (libthai.a) กับแฟ้ม include (*.h) ทั้งหลาย จึงไม่ได้อยู่ในตำแหน่งปกติที่ apple-gcc จะวิ่งไปหา (ผมใช้ i686-apple-darwin9-gcc-4.0.1 ลองใช้ gcc-4.2, gcc-mp-4.4 ที่อยู่ในเครื่องแล้ว มันบอกไม่รู้จัก flag โน้น flag นี้ ผมก็เซ็ตไม่เป็นด้วย เลยใช้ gcc ตัวที่เขาให้มาแต่เดิมนี่แหละ) จึงจำเป็นต้องแก้ไข setup.py นิดหน่อย เพื่อบอกตำแหน่งของ include_dirs และ library_dirs ใหม่ ตามนี้ :


from distutils.core import setup, Extension

setup(name="libthai", version="0.0.1",
      ext_modules=[ 
        Extension('libthai', 
                  include_dirs = ['/opt/local/include'],
                  libraries = ['thai'],
                  library_dirs = ['/opt/local/lib'],
                  sources = ['libthai.c']
)])

ก็จะสามารถ build และ install ได้ครับ - ของใครอยู่ที่อื่น ก็แก้ไปตามนั้นครับ - ผมดูตัวอย่างจากเอกสารหน้านี้ : 3. Building C and C++ Extensions with distutils

หมายเหตุ: libthai ที่ใช้นี้ยังเป็นรุ่น 0.1.9 อยู่ ตอนนี้รุ่นล่าสุดคือ 0.1.11 ออกมาไล่ ๆ กับ libdatrie และ swath ตัวใหม่ ติดตามข่าวได้ที่ linux.thai.net / ขอบคุณคุณวีร์ พี่เทพ และทุกท่าน


อัปเดต 2009.04.21: เพิ่งเจอท่าที่ง่ายกว่า ไม่ต้องแก้ setup.py คือเรากำหนดไดเรกทอรีได้ที่บรรทัดคำสั่งเลย ตอน build จากนั้นค่อยสั่ง install อีกที เช่น :


$ sudo python setup.py build_ext --include-dirs=/opt/local/include --library-dirs=/opt/local/lib
$ sudo python setup.py install

หรือจะกำหนดไว้ในแฟ้ม setup.cfg ก็ได้ เผื่อใช้หลายรอบ :


[build_ext]
include-dirs=/opt/local/include
library-dirs=/opt/local/lib

ทั้งหมดนี้ ดูตามเอกสาร 3. Writing the Setup Configuration File

ก่อน build อย่าลืมเปลี่ยน gcc ให้เป็นรุ่นที่เหมาะสม=ใช้แล้วคอมไพล์ผ่าน เช่นกรณีนี้ ผมต้องใช้ gcc 4.0 ก็ให้เลือกด้วย gcc_select (หรือ ln symbolic link เอาเองก็ได้)

$ sudo gcc_select gcc40

ถ้าอยากรู้ว่ามีอะไรให้เลือกบ้าง สั่ง gcc_select -l (ไม่ต้องตกใจ ถ้ามันแสดงน้อยกว่าที่เรามี gcc_select มันแสดงเฉพาะตัวที่มันหาเจอเท่านั้น ก็คือที่มี symbolic link อยู่ในไดเรกทอรีเดียวกับตัว gcc_select มันเอง ... กรณีนั้น ก็ แหะ ๆ ใช้ ln ไปตามเดิมครับ - -")

เช่นเดียวกัน ก่อน install ก็อย่าลืมเปลี่ยน Python ให้เป็นรุ่นที่เหมาะสม=รุ่นที่เราอยากจะติดตั้งตัว extension นี้เข้าไป กรณีผม ผมอยากติดตั้งลงไปใช้กับ Python 2.5 ก็คล้าย ๆ เดิม เลือกด้วย python_select (หรือ ln symbolic link เอาเองก็ได้ เช่นกัน)

$ sudo python_select python25-apple

ป.ล. อะไรคือ mp-gcc ?

technorati tags: , ,

2009-04-19

on the flip side of Hero

ไม่ว่าการพยายามฆ่าหรือจองล้างจองผลาญ ทักษิณ องคมนตรี หรือ สนธิ ก็น่าหดหู่พอกัน เพราะมันหมายความว่า ในสังคมเรายังมีคนคิดว่า การกำจัดคนหนึ่งคนออกไป จะสามารถแก้ปัญหาอะไรได้

แต่ความคิดนี้คงไม่แปลกอะไร ในสังคมง่อยเปลี้ย-ธุระไม่ใช่-ไม่ยอมช่วยเหลือตัวเอง ที่เรียกหา ฮีโร่-พระเอกขี่ม้าขาว อยู่ตลอดเวลา (ไม่ว่าจะในรูปผู้นำเผด็จการอันเข้มแข็ง ราชาผู้ทรงธรรม กำนันผู้อาทร หรือคณะรัฐประหารผู้เมตตา) ก็คงจำเป็นอยู่เอง ที่พวกเขาจะต้องสร้างด้านตรงข้าม ตัวโกง-ผู้ร้ายมีเขาแหลมในผ้าคลุมสีดำ ให้เป็นต้นเหตุแห่งความชั่วร้ายทั้งปวง เพื่อผ่อนคลายย้ายเทความผิดบาปให้พ้นไปจากตัวพวกเขา

ฉันไม่ผิด มันผิด
ฉันกลัว ไม่อยากยุ่ง ฮีโร่ ช่วยฉันที

หนังซูเปอร์ฮีโร่ที่เต็มโรงตอนนี้ อาจจะบอกภาวะอะไรบางอย่างของสังคม

แต่อย่าลืมว่า เมื่อยอดมนุษย์เข้าตาจนเปลี่ยนใจ อะไรจะรับประกัน ว่าเขาจะไม่กลายเป็นผู้ร้ายเสียเอง ? อะไรจะรับประกัน ว่ายอดมนุษย์จะไม่กลายเป็นผู้ร้ายเสียเอง ?

จอม เพชรประดับ: นับจากนี้ไป “ประเทศไทย” จะไม่เหมือนเดิม

technorati tags: , ,

2009-04-10

[11 Apr] Creative Industries and Its Discontent workshop @ Chula

วัฒนศาลา ไทยแซ่บ ร่วมกับ สถาบันวิจัยสังคม จุฬาฯ จัดเสวนาโต๊ะกลม

Creative Industries and Its Discontent

เสาร์ 11 เมษายน 2552 13:30-15:50 น.
ณ ห้องประชุมชั้น 4 สถาบันวิจัยสังคมจุฬา อาคารวิสิฐ-ประจวบเหมาะ จุฬาลงกรณ์มหาวิทยาลัย

โดยในงานนี้ได้เชิญ Dr. Adam Arvidsson นักสังคมวิทยาชาวสวีเดน ซึ่งปัจจุบันสอนอยู่ที่ มหาวิทยาลัยแห่งมิลาน ประเทศอิตาลี และที่วิทยาลัยธุรกิจโคเปนเฮเกน ประเทศเดนมาร์ก มาร่วมเสนาแลกเปลี่ยนงานวิจัยเรื่อง “อุตสาหกรรมสร้างสรรค์ในอังกฤษและเดนมาร์ก”

Dr. Adam Arvidsson มีงานหนังสือ Brands: Meaning and Value in Media Culture ตีพิมพ์กับสำนักพิมพ์ Routledge ในปี ค.ศ. 2006 และได้ทำวิจัยในเรื่องอุตสาหกรรมสร้างสรรค์ในอังกฤษและเดนมาร์ก และเรื่องแฟชั่นในอิตาลี

ผู้สนใจเข้าร่วมกรุณาติดต่อ วิริยะ สว่างโชติ โทร. 0-894-593-617 เพื่อสะดวกในการจัดเตรียมอาหารว่าง

technorati tags: , ,

Bangkok Red Shirts gatherings map by Prachatai

fyi, to avoid/observe/join the Red Shirts.

แผนที่และข่าว แสดงความเคลื่อนไหวเสื้อแดงทั่วกรุงเทพ โดยทีมข่าวประชาไท บน Google Maps

(คลิกที่ หมุดสีแดง พื้นที่สีแดง หมุดสีฟ้า พื้นที่สีฟ้า หมุดสีชมพู เพื่อดูความเคลื่อนไหวล่าสุด)

ดู แผนที่และข่าว แสดงความเคลื่อนไหวเสื้อแดงทั่วกรุงเทพ ในแผนที่ขนาดใหญ่กว่า

url: http://maps.google.co.th/maps/ms?ie=UTF8&hl=th&msa=0&msid=107550157098327041781.000467042bca478ba991d&source=embed&ll=13.761562,100.554428&spn=0.086368,0.154495&z=13

short url: http://bit.ly/Kdz2L

screenshot (for historical reason, I like to captured and keep this. Map visualization of a mob.):
Bangkok Red Shirts gatherings map by Prachatai

[via Prachatai newspaper]

technorati tags: , , ,