21

โปรแกรมตัดคำ แบบใช้ PHP ล้วน ๆ

ที่ผ่านมามีหลายท่านสนใจถามเข้าหลังจากที่แสดงตัวอย่างเรียก Swath จาก PHP ให้ดู แต่ส่วนมากพอใช้บน Windows หลายคน ก็งง ๆ ผมก็งง ก็เลยจัดอันนี้ไป โปรแกรมตัดคำมันบน PHP ล้วน ๆ เสียเวลาเขียนไปหลายชั่วโมงอยู่ครับ น่าจะมี bug อะไรเต็มไปหมดถ้าท่านใดพบกรุณาแจ้งไปที่ https://github.com/veer66/PhlongTaIam/issue เดี๋ยวนี้ใช้ github แล้วครับ เพื่อท่านใดจะช่วยแก้จะได้ fork แล้ว pull request กลับมาได้เลย ไม่ต้องเสียเวลาย้ายไปย้ายมาให้ลำบากเหมือนโครงการก่อน

เข้าไป download ที่ https://github.com/veer66/PhlongTaIam ได้เลยครับ ถ้าเอาง่าย ๆ ก็ click ที่ปุ่มที่เขียนว่า zip และมีรูปเมฆมีลูกศรชี้ลงครับ ก็ได้ code ไปทั้งหมด เอาไปวางใน htdocs ก็น่าจะใช้ได้เลย

แต่ก็อาจจะเจ๊งบน Windows หรือสิ่งแวดล้อมที่ต่างจากที่ผมใช้อยู่อยู่ดี ถ้าปัญหาอะไรก็ถามไว้ที่นี่ได้ครับ แต่ว่าส่วนมากผมมักจะตอบไม่ได้  แต่ก็เผื่อมีท่านอื่นตอบได้ครับ

0

Part-of-speech tagger สำหรับภาษาไทย

โพสนี้จะใช้ model ที่ได้มาจาก corpus ของ NAiST Lab นะครับ ส่วนโปรกรมก็จะใช้ Jitar เนื่องจากว่า Jitar เขาใช้ Java นะครับ ก่อนอื่นก็ต้องติดตั้ง JDK ก่อน จากนั้นก็โหลด Jitar และ Model มาได้เลย  ตาม URL นี้ http://naist.cpe.ku.ac.th/pkg/jitar_model_large.zip และ http://naist.cpe.ku.ac.th/pkg/jitar-20100224.zip

พอแตก Zip ออกมาได้หาไฟล์ jitar-0.0.4.jar, ngrams และ lexicon ลากไปอยู่ใน folder เดียวกัน จากนั้นก็สร้างไฟล์สำหรับลองใช้โปรแกรมผมใช้ชื่อ test.txt เขียนข้างในว่า “ฉัน กิน ข้าว” อย่าลืมเว้นวรรคด้วยนะครับ ต้องใช้ charset เป็น UTF-8 ด้วย

เสร็จแล้วก็ลองรันดูแบบนี้ครับ java -cp jitar-0.0.4.jar org.langkit.tagger.cli.Tag lexicon ngrams < test.txt ก็จะได้ผลลัพธ์ออกเป็น pper vt ncn

pper คือ สรรพนามสำหรับแทนคน

vt คือ สกรรมกริยม

ncn คือ สามัญนาม

72

ใช้ Swath จาก PHP

Update: โปรแกรมตัดคำแบบใช้ PHP เลยก็มีนะครับ: https://github.com/veer66/PhlongTaIam

ทางบ้านถามเข้ามาหลายท่าน ผมจึงเขียนออกมาได้แบบนี้ครับ

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>Swath Web</title>
	<meta name="generator" content="TextMate http://macromates.com/">
	<meta name="author" content="Vee Satayamas">
	
</head>
<body>
<form method="post">
<textarea name="input_text" cols="80" rows="10"></textarea>
<input type="submit" value="submit">
</form>
<?php

    function swath($input_text) 
    {
        $input_filename= tempnam("/tmp", "swath_");
        $output_filename= tempnam("/tmp", "swath_");
        $input_text_tis620 = iconv("UTF-8", "TIS-620", $input_text);
        file_put_contents($input_filename, $input_text_tis620);
        system("/usr/bin/swath < $input_filename > $output_filename");
        $raw = file_get_contents($output_filename);
        $raw_utf8 = iconv("TIS-620", "UTF-8", $raw);
        unlink($input_filename);
        unlink($output_filename);
        return preg_split('/\|/', $raw_utf8);
    }

    if($_REQUEST['input_text']) {
        $output = swath($_REQUEST['input_text']);
        print implode(" ", $output);
    }
?>
</body>
</html>

แต่ว่าแบบนี้เราต้องลง swath ไว้ใน /usr/bin นะครับ ฯ​ ลงไว้ที่อื่นก็ไม่น่าเป็นไรนะครับ เปลี่ยนใน code เอาเลยก็ได้ ฯ อีกอย่างคือต้องการใช้ iconv ด้วย ฯ แต่ถ้าไม่ใช้ iconv ก็น่าจะได้อีกเหมือนกัน ฯ​ เปลี่ยนหน้าเว็บเป็น TIS-620 ให้หมดก็น่าจะใช้ได้เลย ฯ

0

GIZA++ 1.0.3 บน Ubuntu 9.10

ผมพยายามจะลง Giza++ 1.0.3 บน Ubuntu 9.10 จริงๆ มี .deb ให้ใช้แต่ว่า ผมไม่ได้ใช้เพราะอยากจะ code ของ Giza++ ด้วย

แต่ว่าก็มีปัญหานิดหน่อย เพราะว่า string ที่จองมาเก็บปี จองมาน้อยไปหน่อย คล้ายๆ ปัญหา y2k ก็เลย patch ไปแบบนี้

diff -Nur giza-pp/GIZA++-v2/file_spec.h giza-pp.orig/GIZA++-v2/file_spec.h
--- giza-pp/GIZA++-v2/file_spec.h	2010-02-06 19:05:55.000000000 +0000
+++ giza-pp.orig/GIZA++-v2/file_spec.h	2009-03-20 11:41:12.000000000 +0000
@@ -37,13 +37,13 @@
   struct tm *local;
   time_t t;
   char *user;
-  char time_stmp[18];
+  char time_stmp[17];
   char *file_spec = 0;
   
   t = time(NULL);
   local = localtime(&t);
   
-  sprintf(time_stmp, "%03d-%02d-%02d.%02d%02d%02d.", local->tm_year, 
+  sprintf(time_stmp, "%02d-%02d-%02d.%02d%02d%02d.", local->tm_year, 
 	  (local->tm_mon + 1), local->tm_mday, local->tm_hour, 
 	  local->tm_min, local->tm_sec);
   user = getenv("USER");

รายงานบักไปแล้วเหมือนจะซ้ำด้วย http://code.google.com/p/giza-pp/issues/detail?id=20 บรรยากาศก็เงียบๆ

13

ลองใช้ XMLChid กับ UnigramTagger ของ NLTK

ทีแรกผมก็เขียน xmlchid_loader.py เพื่ออ่าน xmlchid.xml ให้อยู่ในรูปแบบ corpus ของ NLTK

from xml.sax import make_parser
from xml.sax.handler import ContentHandler

class Handler(ContentHandler):
    def __init__(self):
        self.corpus = []

    def startElement(self, name, attrs):
        if name == 'word':
            surface = attrs['surface']
            tag = attrs['pos']
            self.corpus[-1].append((surface, tag))
        elif name == 'sentence':
            self.corpus.append([])

def load_xmlchid(filename):
    parser = make_parser()
    handler = Handler()
    parser.setContentHandler(handler)
    parser.parse(filename)
    return handler.corpus

และก็ทีนี้ก็ไปเรียกใช้ UnigramTagger ตามฟอร์ม

#-*- coding: UTF-8 -*-
from xmlchid_loader import load_xmlchid
from nltk import UnigramTagger
corpus = load_xmlchid('xmlchid.xml')
corpus = filter(lambda sent: len(sent) > 0, corpus)
tagger = UnigramTagger(corpus)
result = tagger.tag([u'การ', u'ทำ', u'การบ้าน'])
result = map(lambda w: (w[0], "UNK") if w[1] is None else w, result)
print u" ".join([u"/".join(w) for w in result])

ผลลัพธ์ก็จะได้แบบนี้

การ/FIXN ทำ/VACT การบ้าน/UNK
9

การติดตั้งและใช้งาน KUCut บน Windows (XP)

KUCut มีคนถามบ่อยเหมือนกันว่าติดตั้งใช้งานอย่างไร ผมก็เลยเขียนเป็น blog ไว้เลยดีกว่า

  1. ติดตั้ง Python 2.6.2
  2. ขั้นตอนแรกก็ดาวโหลด KUCut มาก่อนจาก kucut-1.2.7.tar.gz
  3. จากนั้นก็แตกไฟล์ zip ที่ดาวโหลดมาแล้วออกมา ในกรณีนี้ผมเก็บไว้ใน Desktop
  4. เรียกใช้งานโปรแกรม command prompt
  5. ใช้คำสั่ง cd เปลี่ยน directory ไปเป็น directory ของ KUCut
    kucut_screen1
  6. ติดตั้ง KUCut ด้วยคำสั่ง
    C:\Python26\python.exe setup.py install
    
  7. ลองสร้างไฟล์ test1.txt เขียนภาษาไทยไว้เพื่อทดสอบ (ใช้ character set TIS-620)
    ผมเขียนสิ่งนี้ลงไป:

    ทดลอง โปรแกรมตัดคำ
    
  8. สั่งตัดคำโดยใช้คำสั่ง
    C:\Python26\python.exe C:\Python26\Scripts\kucut --line="_" test1.txt
    
  9. ก็จะได้ไฟล์ test1.txt.cut ออกมา เปิดดูข้างในก็ควรจะเป็นแบบนี้
    ทดลอง _ โปรแกรม ตัด คำ 
    

เป็นอันเรียบร้อย วิธีใช้จาก Python เดี๋ยวผมจะเขียนอีกทีครับ (ถ้าผมทำได้)

0

ไปฟังเรื่อง Statistical machine translation ของ CAS-ICT

ตามที่ได้เมล์มาจาก http://groups.google.com/group/thlta/browse_thread/thread/633acafdd560b738 มีบรรยายเรื่อง SMT ที่ CAS-ICT โดย Prof. Dr. LIU Qun วันนี้ก็ได้ไปฟังมาแล้ว ได้ความรู้มากกว่าที่คาดไว้อีก เรื่องแปลโดยใช้ Forest ผมโหลดไฟล์มาแล้ว แต่ยังไม่ได้อ่าน พอไปฟังแล้วก็จับประเด็นได้เลย ^_^

จัด 10 โมงเช้าเวลากำลังดีครับ แต่ก็อย่าที่ทราบกันว่า อุทยานวิทยาศาสตร์ ออกจะไกลสักหน่อย ผมก็เลยตื่นมาตั้งแต่ 6 โมงครึ่ง แล้วก็ไม่รู้ทำอะไรอยู่กว่าจะได้ออกจากบ้างก็ 8 โมง แต่ก็ไปทัน

PA227457.JPG

ให้ดูว่าผมไปทันด้วย :-P

ไม่นานนัก ดร.เทพชัย ก็เปิดงาน

PA220003.JPG

เริ่มบรรยายแล้ว

Prof. Dr. Lui Qun

ภาพของบนใช้โทรศัพท์มือถือถ่าย แต่ว่าสิ่งที่สนใจคือ มี Vauquois triangle บน slide ด้วย แต่ว่าเขียนมาเพื่อใช้อธิบาย SMT เวลานี้

PA227461.JPG

Prof. Dr. LIU Qun แบ่งระดับการวิเคราะห์ที่ใช้ในการแปลเป็น 2 ระดับ คร่าวๆ คือ Phrase-based SMT และ Syntax-based SMT

Syntax-based SMT ยังแบ่งได้เป็น 2 ระดับย่อยๆ อีกคือ แบบที่ใช้ linguistic syntax กับ formal syntax แบบ linguistic syntax คือใช้ต้นไม้ที่อ้างอิงความรู้ทางภาษาศาสตร์ ส่วน formal syntax ก็ออกมาเป็น tree เหมือนกัน แต่ tree ที่สร้างไม่จำเป็นต้องเป็น tree ที่ถูกต้องตามหลักภาษาศาสตร์

SMT ที่แปลง tree แบบ linguistic syntax ไปเป็น อีกข้อความอีกภาษาเรียกว่า Tree-to-String SMT

ถ้าผมเข้าใจผิดก็ช่วยทักท้วงด้วยนะครับ

PA227463.JPG

ตามธรรมเนียมก็มอบของที่ระลึกกันไป ขอโทษที่ไม่ชัดนะครับ

Sunlong bus

เสร็จงานแล้วผมก็นั่งรถเมล์ ปอ. 29 กลับมาจากธรรมศาสตร์ ศูนย์รังสิต ครับ 20 บาท ถ้วน ถูกกว่า 510 ขาไป 4 บาท ขากลับรถเมล์ก็มาจากจีนครับยี่ห้อ Sunlong

นอกจากเรื่องวิชาการแล้วแนวการทำงานวิจัย CAS-ICT ก็ดูเน้นทางวิทยาการคอมพิวเตอร์มากกว่าภาษาศาสตร์ ถ้าผมจำไม่ผิดที่นั่นมีนักศึกษาปริญญาเอก ประมาณ 10 คน ปริญญาโทอีกประมาณ 10 คน software engineer อีก 3 คน ไม่มีนักภาษาศาสตร์เลย แม้แต่คนเดียว ผมคิดว่าที่ทำแบบนี้ได้น่าจะเป็นเพราะภาษาจีนมีทรัพยากรณ์ทางภาษาเช่น คลังต้นไม้ (Treebank) และ คลังข้อความขนาน (Parallel corpus) มากพอ งานที่นักภาษาศาสตร์ก็อยู่ในคลังต้นไม้อยู่แล้ว

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

c1 c2 c3 $X c4 $Y c5 c6
e1 $Y e2 $X e3 e4

โดยที่ e1, e2, e3 … เป็นคำภาษาอังกฤษ และ c1, c2, c3 … เป็นคำภาษาจีน ส่วน $X และ $Y ก็เป็นตัวแปรที่จะเปลี่ยนไปได้เรื่อยๆ (ผมเขียนแบบนี้เพราะจำตัวอย่างชัดๆ ไม่ได้)

ทุกภาพในบันทึกนี้สามารถคลิกดูภาพใหญ่ได้ครับ ทุกภาพใช้สัญญาอนุญาตแบบ Attribution-Noncommercial-No Derivative Works 2.0 Generic (คร่าวแล้วก็คือเอาไปใช้ได้นั่นเองครับ ส่วนรายละเอียดสามารถตามลิงค์ไปอ่านได้)