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

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

    1. ของเกษตรฯ มี dependency parser ครับ http://search.ieice.org/bin/summary.php?id=e92-d_10_2122&category=D&year=2009&lang=E&abst= ใช้ representation ต่างกันเช่น แทนที่จะบอกว่าเป็น VP ก็บอกว่า noun เป็น object ของ verb ตัวไหนแทน

      มากไปกว่านี้มีวิธีแปลง dependency structure ไปเป็น phrase sturcture http://portal.acm.org/citation.cfm?id=1072133.1072147

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

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

      1. รบกวนขอคำอธิบายหน่อยนะครับ
        ผมมีข้อมูลเป็นคำถาม-คำตอบในวิชาภาษาไทยผมกำลังจะทำเป็นเหมือน 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.

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

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

      3. ส่วนตัวแล้วผมคิดว่าน่าศึกษาพวก 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