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

ตรวจความยาว string เวลาทำ UI (ของ Android)

เวลาแปล strings.xml ของ Android เป็นภาษาไทย บางทีมันยาวเกินแล้ว layout มันจะเละ ก็เลยเขียนโปรแกรมเล็ก ๆ มาตรวจดู โหลดได้จาก andthlen ต้องใช้ thailang4r ด้วยนะครับ มันพิเศษนิดนึง แต่ไม่รู้มีประโยชน์หรือเปล่าคือเวลาเปรียบเทียบ ผมตัดพวก สระอิ สระอู อะไรที่มันอยู่ข้างล่างข้างบนออกไป แล้วค่อยนับความยาว string … แต่เพื่อไม่ให้มันออกมามากเกินไป ผมเลือกเอาเฉพาะ string ที่ไทยยาวกว่าเกินอังกฤษ 20% เท่านั้น

สิ่งที่ควรทำก่อนใช้ LibreOffice กับภาษาไทย

ก่อนใช้ LibreOffice กับภาษาไทยทีแรกผมก็งง ๆ มันต้องเข้าไปที่ LibreOffice -> Preferences … แล้วก็เข้าไปทำตามรูปครับเลือก Enabled for complex text layout (CTL) ซะ เลือกภาษาไทยด้วย

LibreOffice preference

ทำแบบนี้แล้วสังเกตว่าอะไรจะราบรื่นขึ้น โดยเฉพาะเวลาที่ไปแก้ style

Extracting only Thai text using Python

import codecs
import re
import sys

for line in codecs.open(sys.argv[1], encoding="UTF8", errors='ignore'):
    for unit in re.split('([\u0E00-\u0EFF]+)', line):
        if re.match('[\u0E00-\u0EFF]+', unit):
            print(unit)

(I used Python 3.2.x)

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 คือ สามัญนาม

workaround สำหรับ jitar, ภาษาไทย และ UTF-8 บน Windows อาจจะ GNU/Linux ด้วย

ถ้าใช้ JRE บน Windows มันจะเลือก encoding เป็น MS874 ให้ ส่วนบน GNU/Linux ก็ซวยไป ถ้าเป็น Solaris ก็ไม่มีปัญหาอะไร เรื่องแบบนี้จะไปแก้ใน jitar ก็ใช่ที่ จะแก้ JRE ก็ไม่ไหว ก็เลย ทำ jitar ให้ใช้ UTF-8 แบบบังคับไปก่อน แต่ไม่ request pull นะ เพราะมันไม่น่าทำ น่าแก้ที่ JRE หรือไม่ก็เปลี่ยนไปใช้ MS874 มั้ง


http://www.oracle.com/technetwork/java/javase/locales-137662.html


https://github.com/veer66/jitar

ใช้ Miktex

ผมลง basic-miktex-2.9.3972 และ texmaker บน Windows 7 สิ่งเคยใช้ได้บน Fedora มันก็เจ๊ง ปัญหาก็เกิดจากขาด package บางอย่างไปเท่านั้นเอง สิ่งที่ต้องทำคือเรียก mpm ขึ้นมาลง thailatex ลง unicode และอะไรอื่นๆ ที่มันต้องการก็เสร็จแล้ว

ผมใช้ \usepackage[utf8x]{inputenc} และ \usepackage[thai,english]{babel} ด้วย มันอาจจะมีท่าดีกว่านี้แต่ก็ขี้เกียจแก้

เคยลองใช้ Word 2007 ก็ยังงงๆ อยู่ ก็เลยใช้ Latex ไปก่อนแล้วกัน

กรณีเจ๊งของ PHP และ regular expression เวลาเจอภาษไทย + UTF-8

ถ้ามี code แบบนี้ใช้ charset เป็น UTF-8

<?php
	print_r(preg_split("/\\s/", "ประเภท"));
?>

แบบนี้มันไม่น่าจะ split ได้เพราะว่า ไม่มี space ใน “ประเภท” เลยแต่มัน split ได้ซะงั้น

Array
(
    [0] => เธ›เธฃเธฐเน€เธ
    [1] => เธ—
)

แถวๆ “ภ” มันคงแปลงไปเป็นอะไรแล้ว code ไปเป็น space มั้ง

แต่ไม่ว่าจะเพราะว่าอะไร มีท่าแก้ง่ายๆ แบบนี้ใส่ u เข้าไป หายครับ

<?php
	print_r(preg_split("/\\s/u", "ประเภท"));
?>

ผมใช้ php 5.3.5 ที่มากับ xampp 1.7.4 และทดลองบน Windows 7 ครับ

จดไว้ X11 กับภาษาไทย

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "kbd"
    Option      "CoreKeyboard"
    Option      "XkbRules"  "xorg"
    Option      "XkbModel"  "pc104"
    Option      "XkbLayout" "us,th"
    Option      "XkbVariant"  "basic,tis"
    Option      "XKbOptions" "grp:alt_shift_toggle"
EndSection

ใช้ Tubsub API ผ่าน PHP

ก็เขียน 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 ไปใช้ได้เลยครับ