15 เมษายน 2561

Published เมษายน 15, 2561 by with 0 comment

สร้าง Treebank ภาษาไทยด้วย NLTK จากชุดข้อมูล PUD

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปทดลองและสร้าง Treebank ภาษาไทยด้วย NLTK จากชุดข้อมูล PUD กันครับ

Treebank คืออะไร ?

Treebank หรือ คลังต้นไม้ คือ คลังข้อความที่ในแต่ละประโยคได้กำกับโครงสร้างวากยสัมพันธ์
ที่มา : คลังต้นไม้ (ตอนที่ ๑) โดย ศ. ดร. ธนารักษ์ ธีระมั่นคง

สำหรับภาษาไทยปัจจุบันนี้ มีคลังข้อมูล Treebank ที่สามารถเข้าถึงได้สองแหล่ง นั้นคือ
  1. คลังข้อมูล Thai CG Bank - https://github.com/crishoj/thcg
  2. Parallel Universal Dependencies (PUD) treebanks - https://github.com/UniversalDependencies/UD_Thai-PUD
บทความนี้จะเลือกใช้คลังข้อมูลจาก Parallel Universal Dependencies

ก่อนอื่นให้ทำการโหลดไฟล์ th_pud-ud-test.conllu จาก https://github.com/UniversalDependencies/UD_Thai-PUD/blob/master/th_pud-ud-test.conllu?raw=true
และติดตั้ง NLTK,PyThaiNLP ด้วยคำสั่ง pip install nltk pythainlp
เราจะใช้ nltk.parse.DependencyGraph สำหรับดึงข้อมูลจาก PUD มาทำ Treebank โดย nltk.parse.DependencyGraph รองรับข้อมูลแบบ conll ที่ PUD แต่  nltk.parse.DependencyGraph  รองรับข้อมูลแบบ conll ที่ PUD เพียงทีละหนึ่งเท่านั้น
ตัวอย่างเช่น
1 ผม _ PRON PRP Person=1 5 nsubj _ SpaceAfter=No
2 ก็ _ ADV RB _ 5 advmod _ SpaceAfter=No
3 เป็น _ AUX VC _ 5 cop _ SpaceAfter=No
4 แค่ _ ADV RB _ 5 advmod _ SpaceAfter=No
5 เด็ก _ NOUN NN _ 0 root _ SpaceAfter=No
6 ผู้ชาย _ NOUN NN _ 5 compound _ SpaceAfter=No
7 รองเท้า _ NOUN NN _ 5 compound _ SpaceAfter=No
8 เปื้อน _ VERB VV _ 7 acl _ SpaceAfter=No
9 โคลน _ NOUN NN _ 8 obj _ _
แต่ข้อมูลใน PUD กลับมี
# sent_id = n01144041
# text = ผมก็เป็นแค่เด็กผู้ชายรองเท้าเปื้อนโคลน
# english_text = I was just a boy with muddy shoes.
1 ผม _ PRON PRP Person=1 5 nsubj _ SpaceAfter=No
2 ก็ _ ADV RB _ 5 advmod _ SpaceAfter=No
3 เป็น _ AUX VC _ 5 cop _ SpaceAfter=No
4 แค่ _ ADV RB _ 5 advmod _ SpaceAfter=No
5 เด็ก _ NOUN NN _ 0 root _ SpaceAfter=No
6 ผู้ชาย _ NOUN NN _ 5 compound _ SpaceAfter=No
7 รองเท้า _ NOUN NN _ 5 compound _ SpaceAfter=No
8 เปื้อน _ VERB VV _ 7 acl _ SpaceAfter=No
9 โคลน _ NOUN NN _ 8 obj _ _


# sent_id = n01145008
# text = ปกติไม่มีงานพาเหรด และก็ไม่เคยมีมาก่อนด้วย
...
เราจึงต้องใช้ regx โดยเอา \# (.*)\n ออกแล้วใช้ regex แยก \n\n ออกมาเป็นทีละ list
แล้วนำ nltk.parse.ProbabilisticProjectiveDependencyParser มาลองสร้าง tree จาก treebank ที่เราสร้าง

ลองเขียนโค้ดตามนี้


ผลลัพธ์
text : ทำอะไรอยู่
Parsing 'ทำ อะไร อยู่'...
Parse:
Tree('ทำ', ['อะไร', 'อยู่'])

อ่านรายละเอียดเพิ่มเติมได้ที่ www.nltk.org/api/nltk.parse.html

เขียนโดย นาย วรรณพงษ์  ภัททิยไพบูลย์
นักศึกษาชั้นปีที่ 1
สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ
คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์
มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)