แปลง Lexitron Dictionary เอาไว้ใช้งาน

23 Oct

เริ่มต้นงานวิจัยใหม่อีกครั้ง สำหรับครั้งนี้คงยังเป็นเรื่อง Text Analysis อยู่เหมือนเคย แต่จะเป็นไปลักษะของการวิเคราะห์ประโยค์ที่เป็นข้อคิดเห็น และข้อเสนอแนะ ซึ่งจะอยู่ในส่วนของ Opinion Mining

เริ่มรวบรวมความรู้ และข้อมูลพื้นฐานเหมือนเคย และส่ิงหนึ่งที่ต้องจัดการก่อนเลยคือ พจนานุกรมหรือคลังคำที่ใช้สำหรับการคัดคำภาษาไทย และคราวนี้จะต้องประกอบกับคำกำกับหน้าที่ของคำด้วย (Past of Speech) ซึ่งข้อมูลที่ดีที่สุดที่มีอยู่คือ ตัวพนานุกรมภาษาไทยของ Lexitron และ Ochid Corpus

เลยเริ่มต้นที่ Lexitron ก่อนซึ่งข้อมูลคำภาษาไทยทำไว้อย่างดี ประกอบไปด้วยคำทั้งหมด คำ 40,853 คำ พร้อมกับการกำกับ Past of Speech มาให้ คำแปลภาษาอังกฤษ ตัวอย่างของคำ ฯลฯ ให้เรียบร้อยเป็นอย่างดี

แต่ข้อเสียของ Lexitron ที่เจอตอนนี้คือมันเป็น XML ที่ไม่ได้อยู่ในรูปแบบมาตรฐาน ดังนั้นการเรียกใช้งานผ่าน XML Module มาตรฐานของ Python หรือ R ไม่สามารถทำได้เพราะจะมี error หรือไม่ผ่านในกระบวนการ Parsing

เลยคิดว่าเขียนโปรแกรมอ่านข้อมูลในพจนาจุกรมภาษาไทยของ Lexitron เองแล้วแปลงให้อยู่ในรูปแบบที่สะดวกใช้งานจะดีกว่า ซึ่งตอนนี้เลยเลือกแปลงให้อยู่ในรูปแบบ CSV จะง่ายที่สุดซึ่งสามารถนำไปใช้ต่อยอดได้หลาย ๆ ทาง

ทำหรับตัวพจนานุกรม Lexitron สามารถดาวน์โหลดได้ที่ Link
ซึ่งไฟล์พจนานุกรมภาษาไทยจะอยู่ในไฟล์ telex

สำหรับ Code ชุดนี้ก็คงใช้เครื่องมือที่เราคุ้นเคยคือ BeautifulSoup ของ Python ซึ่งช่วยให้การทำงานง่ายขึ้นมากครับ

สำหรับฟิลด์ที่เลือกขึ้นมาจะมี

  1. id
  2. tsearch
  3. tsyn
  4. tsample
  5. tentry
  6. eentry
  7. tcat
  8. tdef
  9. tant
  10. tnum
#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
# filename : convertLextironToCSV.py
# author : Phisan Sookkhe
# edited : 23 OCT 2016 : 11.00PM
# This program is used for read Lexitron Dictionary, telex-utf8
# and write data into CSV format
'''


from bs4 import BeautifulSoup

def getXMLElements(xml):
    # create soup object
    soup = BeautifulSoup(xml, 'html.parser')

    tsearch = ''
    tsyn = ''
    tsample = ''
    tentry = ''
    eentry = ''
    tcat = ''
    tdef = ''
    tant = ''
    tnum = ''

    lt = []

    lt.append(soup.find('id').get_text())

    if soup.find('tsearch'):
        lt.append('"'+soup.find('tsearch').get_text()+'"')

    if soup.find('tentry'):
        lt.append('"'+soup.find('tentry').get_text()+'"')

    if soup.find('eentry'):
        lt.append('"'+soup.find('eentry').get_text()+'"')

    if soup.find('tcat'):
        lt.append('"'+soup.find('tcat').get_text()+'"')

    if soup.find('tsyn'):
        lt.append('"'+soup.find('tsyn').get_text()+'"')

    if soup.find('tsample'):
        lt.append('"'+soup.find('tsample').get_text()+'"')

    if soup.find('tdef'):
        lt.append('"'+soup.find('tdef').get_text()+'"')

    if soup.find('tant'):
        lt.append('"'+soup.find('tant').get_text()+'"')

    if soup.find('tnum'):
        lt.append('"'+soup.find('tnum').get_text()+'"')


    line = ','.join(lt).encode('utf-8')
    line = line+'\n'

    return line

if __name__ == '__main__':
    fname = './dict/telex-utf8.txt'
    outfile_path = './csv/telex-utf8.csv'
    xml = ''

    # write CSV header
    header = ['id',
              'tsearch',
              'tentry',
              'eentry',
              'tcat',
              'tsyn',
              'tsample',
              'tdef',
              'tant',
              'tnum']

    header_str = ','.join(header).encode('utf-8')+'\n'
    with open(outfile_path, 'a') as outfile:
        outfile.write(header_str)

    with open(fname) as f:
        lines = f.readlines()
        for line in lines:
            if line.rstrip('\n') != '</Doc>':
                xml += line
            else:
                xml += line
                with open(outfile_path, 'a') as outfile:
                    outfile.write(getXMLElements(xml))
                xml = ''

จากจากนี้หากใครต้องการนำไปพัฒนาต่อยอดสามารถเข้าไป Clone โปรเจคได้ที่ github.com ได้เลยครับ

Social Comments

Loading Disqus Comments ...
Loading Facebook Comments ...