Tuesday, April 05, 2005

Classifier4J

Classifier4J เป็น opensource สำหรับทำ Text Classification
มองหามานานแล้ว พึงเจอ project นี้เป็นตัวแรกที่เป็น opensource
ก็เลย load มาทดลองดู

ใน core package จะมี Classifier ให้เราใช้ 2 แบบก็คือ
ผมทดลอง download ตัว source มา compile เอง
โดยใช้ maven เป็นตัว build
ลำดับการ build เท่าที่ลองมั่วดูก็คือ
ต้อง build core ก่อนโดย cd core แล้วสั่ง maven jar:install
กรณีที่ต้องการ build optional ด้วยนั้นจะติดปัญหาว่า
ในส่วน dependency file ชี้ไปยัง repository name ที่ไม่ถูกต้อง
ให้ทำการแก้ไข project.xml ใน optional directory เสียก่อน
โดยเปลี่ยนส่วน dependency จากของเดิมให้เป็นตามนี้
  <dependency>
<groupId>classifier4j</groupId>
<artifactId>Classifier4J</artifactId>
<version>0.6</version>
</dependency>

จากนั้นก็สั่ง maven jar:install เช่นเดียวกัน

จากการทดลองเล่นดู พบว่ามีปัญหากับภาษาไทย
ก็เลยไล่ code ดูพบว่า ตัว DefaultTokenizer ที่ให้มา
นั้น implment ง่ายๆโดยใช้ method split ของ String Class
ซึ่งไม่สามารถตัดคำไทยได้แน่นอน
ก็เลยเขียน Tokenizer ที่ใช้ BreakIterator ขึ้นมา
public class BreakTokenizer implements ITokenizer {
public String[] tokenize(String input) {
ArrayList list = new ArrayList();
BreakIterator bt = BreakIterator.getWordInstance();
bt.setText(input);
int start = bt. first ();
for (int end = bt. next (); end != BreakIterator. DONE; start = end, end = bt. next ()) {
String tmp = input.substring(start, end);
list.add(tmp);
}
return (String[]) list.toArray(new String[0]);
}
}


นอกจากนี้ยังพบว่า VectorClassifier
นั้นยังเขียนไม่เรียบร้อยนัก ขาด method หรือ constructor
สำหรับ set custom Tokenizer ไปก็เลย แก้ code
เพิ่ม method setTokenizer แล้วก็สั่ง build ใหม่

ตัว code ที่ทดลองใช้ง่ายๆ (ยังไม่มีเรื่อง stopword ไทย)
มีตัวอย่างดังนี้
 public static void main(String[] args) throws ClassifierException {
TermVectorStorage store = new HashMapTermVectorStorage();
VectorClassifier cs = new VectorClassifier(store);
BreakTokenizer tk = new BreakTokenizer();
cs.setTokenizer(tk);

cs.teachMatch("สวัสดีครับนี่คือภาษาไทย");
System.out.println(cs.classify("สวัสดี ภาษาไทย"));

IWordsDataSource ds = new SimpleWordsDataSource();
BayesianClassifier bcs = new BayesianClassifier(ds, tk);
bcs.teachMatch("สวัสดีครับนี่คือภาษาไทย");
System.out.println(bcs.classify("สวัสดี ภาษาไทย"));
}


ผลลัพท์ที่ได้จากการ run
0.7071067811865476
0.99

Related link from Roti

1 comment:

bact' said...

ตัวนี้ก็เป็น classifier ตัวนึงเหมือนกัน

http://maxent.sourceforge.net/

เป็น Java, open source ครับ

(แต่คงใช้งานไม่สะดวกเท่า -- ต้องเขียนอะไรเพิ่มอีกเยอะถ้าเทียบกับ Classifier4J)