JDK สามารถตัดคำภาษาไทยได้มานานแล้วแต่ไม่ค่อยมีคนรู้ บังเอิญไปอ่านเจอใน Blog ของคุณฮุ้ย
จากการทดสอบระบบตัดคำภาษาไทยใน JDK เทียบกับ ICU ให้ผลที่ต่างกัน จากสองตัวอย่างผลค่อนข้างสูสี
พระเอกของงานนี้คือตัว class BreakIterator ซึ่งมีให้ใช้ทั้งใน JDK เอง และ ICU ซึ่งเป็น library ของ IBM
ข้อความที่เอามาทดสอบคือ “ชั่วโมงอินเทอร์เน็ตต้อนรับปีจอ แถมมโหฬารนานสูงสุด 2 เท่า”
ผลการตัดคำภาษาไทยของ
JDK 1.4 BreakIterator
“ชั่วโมง-อิน-เทอร์เน็ต-ต้อนรับ-ปี-จอ- -แถม-มโหฬาร-นาน-สูง-สุด- -2- -เท่า-”
ICU BreakIterator
“ชั่วโมง-อินเทอร์เน็ต-ต้อน-รับ-ปี-จอ- -แถม-มโหฬาร-นาน-สูง-สุด- -2- -เท่า-”
DictionaryBasedBreakIterator
“ชั่วโมง-อินเทอร์เน็ต-ต้อน-รับ-ปี-จอ- -แถม-มโหฬาร-นาน-สูง-สุด- -2- -เท่า-”
อีกตัวอย่าง
source
ประธานาธิบดีสหรัฐฯ ยอมรับว่า เขาได้เซ็นคำสั่งลับเพื่ออนุญาตให้เจ้าหน้าที่ความมั่นคงแห่งชาติสามารถดัก ฟังโทรศัพท์ของประชาชนในสหรัฐฯจริง ขณะเดียวกันก็พยายามต่อสู้เพื่อให้มีการขยายเวลาการบังคับใช้กฎหมายแพทริออตเพื่อต่อต้านการก่อการร้ายออกไปอีก
ผลการตัดคำ
JDK 1.4 BreakIterator
ประธานาธิบดีสหรัฐฯ- -ยอม-รับ-ว่า- -เขา-ได้-เซ็น-คำสั่ง-ลับ-เพื่อ-อนุญาต-ให้-เจ้าหน้าที่-ความ-มั่นคง-แห่ง-ชาติ-สามารถ-ดัก- -ฟัง-โทรศัพท์-ของ-ประชาชน-ในสหรัฐฯ-จริง- -ขณะ-เดียวกัน-ก็-พยายาม-ต่อสู้-เพื่อให้-มี-การ-ขยาย-เวลา-การ-บังคับ-ใช้-กฎหมาย-แพ-ท-ริ-ออ-ต-เพื่อ-ต่อต้าน-การ-ก่อการ-ร้าย-ออก-ไป-อีก-
ICU BreakIterator
ประธานาธิบดี-สหรัฐฯ- -ยอม-รับ-ว่า- -เขา-ได้-เซ็น-คำ-สั่ง-ลับ-เพื่อ-อนุญาต-ให้-เจ้า-หน้าที่-ความ-มั่น-คง-แห่ง-ชาติ-สามารถ-ดัก- -ฟัง-โทรศัพท์-ของ-ประชาชน-ใน-สหรัฐฯ-จริง- -ขณะ-เดียว-กัน-ก็-พยายาม-ต่อ-สู้-เพื่อ-ให้-มี-การ-ขยาย-เวลา-การ-บังคับ-ใช้-กฎหมาย-แพ-ทริออ-ตเพื่อต่อต้านการก่อการร้ายอ-อก-ไป-อีก-
DictionaryBasedBreakIterator
ประธานาธิบดี-สหรัฐฯ- -ยอม-รับ-ว่า- -เขา-ได้-เซ็น-คำ-สั่ง-ลับ-เพื่อ-อนุญาต-ให้-เจ้า-หน้าที่-ความ-มั่น-คง-แห่ง-ชาติ-สามารถ-ดัก- -ฟัง-โทรศัพท์-ของ-ประชาชน-ใน-สหรัฐฯ-จริง- -ขณะ-เดียว-กัน-ก็-พยายาม-ต่อ-สู้-เพื่อ-ให้-มี-การ-ขยาย-เวลา-การ-บังคับ-ใช้-กฎหมาย-แพ-ทริออ-ตเพื่อต่อต้านการก่อการร้ายอ-อก-ไป-อีก-
code ที่ใช้
package com.wordbreak;
import java.text.BreakIterator;
import java.util.Locale;
//import com.ibm.icu.text.BreakIterator;
//import com.ibm.icu.text.DictionaryBasedBreakIterator;
/**
** @author Nont Banditwong
** TODO To change the template for this generated type comment go to
** Window - Preferences - Java - Code Style - Code Templates
*/
public class ThaiWordbreak {
public static void printEachForward(BreakIterator boundary, String source) {
StringBuffer strout = new StringBuffer();
int start = boundary.first();
for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) {
strout.append(source.substring(start, end) + “-”);
}
System.out.println(strout.toString());
}
public static void main(String[] args) {
Locale thaiLocale = new Locale(“th”);
String input = “ชั่วโมงอินเทอร์เน็ตต้อนรับปีจอ แถมมโหฬารนานสูงสุด 2 เท่า”;
BreakIterator boundary = BreakIterator.getWordInstance(thaiLocale);
//BreakIterator boundary = DictionaryBasedBreakIterator.getWordInstance(thaiLocale);
boundary.setText(input);
printEachForward(boundary, input);
}
}





ขอบคุณมากๆครับบ เป็นเรื่องที่ผมสนใจเพราะตอนนี้กำลังทำโครงงานอยู่ครับ ก็เป็นแหล่งศึกษาที่ดีมากแห่งหนึ่งเลยครับ
แล้วถ้าต้องการเปงพยางค์(จะเอามาทำคำอ่าน)ล่ะ ไม่เอาเปงคำ TT
>> แล้วถ้าต้องการเปงพยางค์(จะเอามาทำคำอ่าน)ล่ะ ไม่เอาเปงคำ TT
สงสัยจะเอาไปทำคำอ่าน เรื่องนี้ไม่ทราบครับแหะๆ แต่คิดว่าน่าจะทำได้นะ แทนที่จะตัดคำ ก็ตัดพยางค์ คงต้องทำ BreakIterator เอาเองมั้ง
ช่วยอธิบาย ICU BreakIterator กับ DictionaryBasedBreakIterator ว่าต่างจาก JDK 1.4 BreakIterator
ยังไง
ขอบคุณค่ะ
ไม่เชี่ยวชาญเรื่องนี้เท่าไหร่ครับ เลยไม่รู้ว่ามันต่างกันยังไง ตัวไหนดีที่สุดยังไม่แน่ใจเลยครับ อิอิ
GooddddGooddddใจมาก
แล้ว งง อะคับ โคดที่ได้ อะคับ พอเอามาแล้ว คอมไพล์ผ่า แต่รันไม่ได้ งง มาก เลย คับ
ช่วยทีนะคับ
ขอดู code ได้ไหมครับ และ run ใช้คำสั่งอะไร
ใช้ NetBean ก็ได้ครับ ตั้งชื่อคลาสให้เหมือนในโค๊ดอันนี้นะครับ