ลองใช้ 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
Advertisements

13 thoughts on “ลองใช้ XMLChid กับ UnigramTagger ของ NLTK

  1. เป็นความรู้ที่ดีมากเลยครับ … ผมขออนุญาตินำไปใช้ ในงานของผมได้ไหมครับ … พอดีกำลังหาวิธีการกำกับ POS ภาษาไทย ซึ่งเป็นในส่วนงานวิจัยอยู่พอดีเลย …

  2. สวัสดีครับคุณวี ผมกำลังทำวิจัยเรื่อง information extraction กับภาษาไทยอยู่ครับ ไม่ทราบว่าคุณวีพอจะรู้จัก Parser ของภาษาไทยที่ใช้วิเคราะห์ Phrase structure เพื่อวิเคราะห์ประโยคบ้างหรือเปล่าครับ? (ที่วิเคราะห์ประโยคเป็น NP VP PP ครับ)ผมหามานานยังไม่เคยพบเลยครับ

    ส่วนตัวไม่เป็น python เลยครับ (T_T) ผมทำ POS tag ด้วย Java ครับ ใช้ openNLP อันนี้ขออนุญาตนำมาแบ่งกันครับ เผื่อคนดู blog คนอื่นๆด้วย ^_^ (พยายามย่น จะได้ไม่เปลืองที่)

    —————————
    import opennlp.maxent.*;
    import opennlp.tools.lang.thai.*;
    import opennlp.tools.sentdetect.*;
    import opennlp.tools.*;
    import opennlp.tools.lang.*;
    //ส่วน class ตัดทิ้งเพราะยาว
    public static void main(String[] args) {
    String test = “การทำการบ้าน”;
    String S[] = new String[20];
    String T[] = new String[20];
    try {
    //ตัดส่วนประกาศตัวแปรออกนะครับ ให้ใส่ opennlp.tools.lang.thai.นำหน้าประเภทตัวแปรด้วยครับ
    Tokenizer tok = new Tokenizer(“thai.tok.bin.gz”);
    SentenceDetector Sent = new SentenceDetector(“thai.sent.bin.gz”);
    PosTagger pos = new PosTagger(“thai.tag.bin.gz”);
    int i = 0;
    System.out.println(“test = “.concat(test)); //Show test text
    S = tok.tokenize(test); //segment the text
    T = pos.tag(S); //tag the text
    i = 0; //counter
    do
    {
    System.out.print(S[i]);
    System.out.print(” “);
    i++;
    }while(i<S.length);
    } catch (IOException ex) {}
    }

    ผลออกมาดังนี้ครับ

    test = การทำการบ้าน
    การ ทำ การ บ้าน
    ปล. FIXN = norminal prefix, VACT = active verb, NCMN = common noun

  3. ขออภัยในความซืื่อบื้อครับ tag ของผลการรันไม่ขึ้น
    ผลที่ได้คือ การFIXN ทำVACT การFIXN บ้านNCMN

  4. รบกวนสอบถามครับ
    ตอนนี้ผมมีข้อมูลอยู่ชุดนึงต้องการทำ POS ผมต้องทำยังไงบ้างครับ
    สำหรับคนเริ่มเขียนโปรแกรมครับ (ผมต้องเริ่มจากเรียนภาษา Python หรือเปล่าครับ)
    ขอบคุณมากครับ

      • รบกวนขอคำอธิบายหน่อยนะครับ
        ผมมีข้อมูลเป็นคำถาม-คำตอบในวิชาภาษาไทยผมกำลังจะทำเป็นเหมือน Auto Tutor
        คือเมื่อเด็กนักเรียนถามคำถามเกี่ยวกับเนื้อเรื่องใน scope ที่กำหนดกับคอมพิวเตอร์แล้วให้คอมพิวเตอร์เป็นตัวช่วยตอบครับ
        ผมไปศึกษาตาม paper ต่างๆ (ที่อ่านเข้าใจบ้างไม่เข้าใจบ้าง)

        สรุปตามความเข้าใจตัวเองคือ
        1. ต้องเริ่มจากทำให้คอมพิวเตอร์เข้าใจความหมายของประโยคที่นักเรียนถาม
        2. เปรียบเทียบกับคำถามในข้อมูลที่เรามีอยู่ว่านักเรียนน่าจะถามเหมือนกับข้อใด
        3. ตอบคำถาม
        ตอนนี้แค่ข้อหนึ่งผมยังทำไม่ได้เลยครับ

        ขอนำเสนอส่วนที่ผมพยายามทำให้หมือนเค้านะครับที่อ่านในpaper {Sentence Similarity Measure Based on Events and Content Words}
        มันอยู่ในส่วนของ Event extraction
        – Mark sentence with POS tags and recognize named entities, such as ,,,,ect, by using Gate
        – Parse the sentence by using Stanford Parser
        – Analysis the results from the above steps, procuring event formal express of the sentence.

        ขอบคุณมากๆครับ
        ปล.ถ้ามีโอกาสคงต้องเชิญมาคุยกันบ้างนะครับ

      • POS tagger มีให้ download ไปใช้เลยครับ แต่ว่าจะติดที่ Stanford parser ยังใช้ภาษาไทยไม่ได้ครับ แต่ว่ามีงานนี้อยู่ครับ http://naist.cpe.ku.ac.th/~imm/iKnow2Publication/Proceeding/Parser_Sutee.pdf ส่วนข้อ 3 ผมอ่านแล้วก็ยังไม่ค่อยเข้าใจครับ

      • เพิ่มเติมอีกนิดนะครับผมเคยเขียนแต่ Matlab (ไม่ได้เก่งอะไรเลย)
        ต้องมาเริ่มศึกษา python หรือเปล่าครับ

      • ส่วนตัวแล้วผมคิดว่าน่าศึกษาพวก shell อะครับ เช่น Bash เป็นต้น เวลาลงโปรแกรมจะได้สะดวก

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s