บันทึกของวีร์ | Vee(r)'s Blog

สิงหาคม 31, 2011

KUCut Web API

Filed under: NLP — ป้ายกำกับ: — वीर @ 4:25 pm

KU Cut Web API ผมอยากจะเรียกใช้ KU Cut จาก Java จึงสร้าง web api ง่ายๆ ขึ้นมาบน CherryPy สามารถดู code ได้จาก https://bitbucket.org/veer66/kucut/src/a54de79d39f9/kucut/webapi.py วางไฟล์นี้ไว้ใน folder เดียวกับ simple_kucut_wrapper.py หรือว่าจริงๆ แล้วก็ใช้ kucut ล่าสุดจาก Hg repository เลยก็ได้

จากนั้นก็ลง CherryPy ผมใช้รุ่น 3.2

จากนั้น run server ตรงๆ ได้เลย ใช้ตำสั่ง python webapi.py

เวลาเรียกใจงานก็เข้า URL ประมาณ http://localhost:8089/index?text=%E0%B8%81%E0%B8%B2%E0%B8%81%E0%B8%B2%E0%B8%81%E0%B8%B2%E0%B8%81%E0%B8%B2 (มันคือ กินกินกิน แบบ UTF8 แล้วเปลี่ยนมาเป็น URL)

ก็ได้ผลลัพธ์คืนมาเป็น [[["\u0e01\u0e32", "\u0e01\u0e32", "\u0e01\u0e32", "\u0e01\u0e32"]]] เป็น JSON ครับ เอาไป decode ได้เลย

ธันวาคม 12, 2010

ใช้ Swath จาก PHP

Filed under: NLP — ป้ายกำกับ:, , , , — वीर @ 2:20 pm

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

<!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 ให้หมดก็น่าจะใช้ได้เลย ฯ

กันยายน 20, 2010

Vauquois’s triangle

Filed under: NLP — ป้ายกำกับ:, , , , — वीर @ 3:31 pm

Vauquois’s triangle หรือ Translation triangle เอาไว้แสดง architecture ของ Machine translation system ต่างๆ จะใช้สถิติใช้กฎก็ใช้สามเหลี่ยมนี้ได้ ประมาณว่ามองคนละมิติกัน

สามเหลี่ยมที่ว่า [click]

เมษายน 23, 2010

ใช้ Tubsub API ผ่าน PHP

Filed under: NLP — ป้ายกำกับ:, , , , , — वीर @ 2:16 pm

ก็เขียน code แบบนี้เลยครับ

<?php
  function tubsub($txt) {
    $txt = urlencode($txt);
    $data = "input=$txt";
    $ch = curl_init("http://vivaldi.cpe.ku.ac.th/~vee/tubsube2t.php");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);      
    curl_close($ch);
    $ans = json_decode($output);
    return $ans[0];
  }

  print tubsub("toto") . "\n";
?>

เขียนแบบข้างบนโปรแกรมก็จะพิมพ์ออกมาว่าเขียน toto ภาษาไทยเขียนอย่างไร ถ้าจะใช้กับอย่างอื่นก็ copy function tubsub ไปใช้ได้เลยครับ

กุมภาพันธ์ 10, 2010

GIZA++ 1.0.3 บน Ubuntu 9.10

Filed under: NLP — ป้ายกำกับ:, , — वीर @ 3:53 pm

ผมพยายามจะลง 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 บรรยากาศก็เงียบๆ

พฤศจิกายน 23, 2009

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

Filed under: NLP — ป้ายกำกับ:, , , , , , — वीर @ 9:09 pm

ทีแรกผมก็เขียน 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

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

Filed under: NLP — ป้ายกำกับ:, , , , , , — वीर @ 1:42 pm

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 เดี๋ยวผมจะเขียนอีกทีครับ (ถ้าผมทำได้)

ตุลาคม 22, 2009

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

Filed under: NLP — ป้ายกำกับ:, , , , — वीर @ 4:31 pm

ตามที่ได้เมล์มาจาก 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 (คร่าวแล้วก็คือเอาไปใช้ได้นั่นเองครับ ส่วนรายละเอียดสามารถตามลิงค์ไปอ่านได้)

ตุลาคม 21, 2009

ไปฟังเรื่องเครื่องแปลภาษาแบบใช้สถิติ (statistical machine translation) กันไหม

Filed under: NLP — वीर @ 11:03 pm

บรรยายโดย Prof. Dr. LIU Qun จาก Institute of Computing Technology, Chinese Academy of Sciences หัวข้อ “Statistical Machine Translation Research in CAS-ICT” จัดโดย หน่วยปฏิบัติการวิจัยวิทยาการมนุษยภาษา (HLT) ศูนย์อิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ (เนคเทค) ดูรายละเอียดเพิ่มเติมได้ที่ http://groups.google.com/group/thlta/browse_thread/thread/633acafdd560b738

ตุลาคม 19, 2009

BasaAsa and Tree Editor

Filed under: NLP — वीर @ 10:53 am
  • BasaAsa is a web app for assisting collaborative manual translation.
  • KU Tree Editor is a tool for editing syntactic dependency trees.
เรื่องที่เก่ากว่า

Theme: Shocking Blue Green. บลอกที่ WordPress.com .

Follow

Get every new post delivered to your Inbox.

Join 632 other followers