งานทาง NLP อีกงาน ที่เป็นเรื่องพื้นฐานสุด ๆ ที่เราต้องเรียนรู้ ก่อนที่จะเข้าใจ ภาษาใด ๆ คือ Part of Speech ส่วนของคำพูด หรือ คำไหนทำหน้าที่อะไรในประโยค เช่น คำนาม กริยา กรรม
เมื่อได้คำนามมาแล้ว เราจะมาเรียนรู้ Named-Entity Recognition ทำ Named-Entity Tagging ว่าคำ ๆ นี้ เป็น ชื่อสิ่งที่อยู่ในโลกความเป็นจริงหรือไม่ ประเภทอะไร เช่น ชื่อคน สถานที่ องค์กร
Part of Speech คืออะไร

Part of Speech ส่วนของคำพูด หรือ ประเภทของคำหรือชนิดของคำที่อยู่ในประโยค เช่น คำนาม คำสรรพนาม คำกริยา คำวิเศษณ์ คำบุพบท คำสันธาน noun, pronoun, verb, adjective, adverb, preposition, conjunction และ interjection
เนื่องจาก ประโยค วลี คำพูด ต่าง ๆ ที่เราใช้สื่อสารกันนั้น ล้วนเกิดขึ้นจากการนำคำต่าง ๆ มาประกอบกันเป็นส่วนต่าง ๆ ที่ทำหน้าที่ต่างกันในประโยค
Part of Speech Tagging คืออะไร
Part of Speech Tagging คือ การแปะป้ายว่า คำไหน เป็นส่วนไหนของประโยค เช่น Somchai loves you ( Somchai เป็น คำนาม Noun, loves เป็น คำกริยา Verb, you เป็นคำสรรพนาม Pronoun)
Named-Entity Recognition / Named-Entity Tagging คืออะไร

Named-Entity Recognition หรือ Named Entity Tagging คือ กระบวนการในการหาตำแหน่ง และ แปะป้ายชื่อเฉพาะของสิ่งต่าง ๆ ที่อยู่ในเอกสาร เช่น ชื่อคน ชื่อองค์กร สถานที่ ตัวเลข จำนวนเงิน วันเวลา persons, locations, organizations, products, medical codes, time expressions, quantities, monetary values, percentages
เรามาเริ่มกันเลยดีกว่า
งานทาง NLP อีกงาน ที่เป็นเรื่องพื้นฐานสุด ๆ ที่เราต้องเรียนรู้ ก่อนที่จะเข้าใจ ภาษาใด ๆ คือ Part of Speech ส่วนของคำพูด หรือ ประเภทของคำหรือชนิดของคำที่อยู่ในประโยค เช่น คำนาม คำสรรพนาม คำกริยา คำวิเศษณ์ เนื่องจาก ประโยค วลี คำพูด ต่าง ๆ ที่เราใช้สื่อสารกันนั้น ล้วนเกิดขึ้นจากการนำคำต่าง ๆ มาประกอบกันเป็นส่วนต่าง ๆ ที่ทำหน้าที่ต่างกันในประโยค
และต่อจากเรารู้ว่าคำไหนเป็น Part of Speech อะไร แล้วเราจะมาเรียนรู้ Named-Entity Recognition ทำ Named-Entity Tagging ว่าคำ ๆ นี้ เป็น ชื่อสิ่งที่อยู่ในโลกความเป็นจริงหรือไม่ ประเภทอะไร เช่น ชื่อคน ชื่อสถานที่ องค์กร สินค้า จำนวน หรือ วันเวลา เป็นต้น persons, locations, organizations, products, medical codes, time expressions, quantities, monetary values, percentages
0. Install¶
%reload_ext autoreload
%autoreload 2
%matplotlib inline
Install Library ที่จำเป็น แล้ว Restart Runtime
# dev version
# !pip install https://github.com/PyThaiNLP/pythainlp/archive/dev.zip
# release version
! pip install pythainlp -q
! pip install epitran -q
! pip install sklearn_crfsuite -q
Restart Runtime เพื่อให้ใช้ Library เวอร์ชัน ที่เพิ่ง Install ลงไป
ในเคสนี้ เราจะปิด Warning ไว้ก่อน จะได้อ่านผลลัพท์ง่าย
import warnings
warnings.filterwarnings('ignore')
1. Import¶
Import Library ที่จะใช้ ในที่นี้คือ PyThaiNLP
import pythainlp
pythainlp.__version__
เตรียมข้อความภาษาไทย ตัดคำด้วย PyThaiNLP Tokenizer ไว้ก่อน
from pythainlp import sent_tokenize, word_tokenize
text = "ชาวต่างชาติเรียกอาณาจักรอยุธยาว่าสยาม"
sent = word_tokenize(text)
sent
ตัดคำภาษาไทย โดยเพิ่มคำใน Custom Dict
texts = ["ไทยบางแก้วหรือนิยมเรียกสั้น ๆ ว่า บางแก้ว เป็นสุนัขประเภทสปิตซ์สายพันธุ์หนึ่งที่มีถิ่นกำเนิดในประเทศไทย ที่บ้านบางแก้ว ตำบลท่านางงาม และบ้านชุมแสงสงคราม ตำบลชุมแสงสงคราม อำเภอบางระกำ จังหวัดพิษณุโลก",
"ไทยบางแก้วถือเป็นสุนัขไทยสายพันธุ์เดียวที่มีขนยาวสองชั้นหางเป็นพวงมีขนขาหน้าคล้ายขนขาแข้งสิงห์แผงรอบคอคล้ายสิงโตมีความเฉลียวฉลาด"]
from pythainlp import Tokenizer
from pythainlp.tokenize import dict_trie
from pythainlp.corpus.common import thai_words
words = ["ไทยบางแก้ว", "บางแก้ว"]
custom_words_list = set(thai_words())
## add multiple words
custom_words_list.update(words)
trie = dict_trie(dict_source=custom_words_list)
custom_tokenizer = Tokenizer(custom_dict=trie, engine='newmm')
sents = [custom_tokenizer.word_tokenize(text) for text in texts]
sents
2. PyThaiNLP Part-of-Speech Tagging¶
Part of Speech Tagging คือ การแปะป้ายว่า คำไหน เป็นส่วนไหนของประโยค เช่น คำนาม คำสรรพนาม คำกริยา คำวิเศษณ์ คำบุพบท คำสันธาน noun, pronoun, verb, adjective, adverb, preposition, conjunction และ interjection
from pythainlp.tag import pos_tag, pos_tag_sents
2.1 pos_tag¶
Engine¶
มี Engine ให้เลือกหลายตัว ได้แก่
- perceptron (default) - perceptron tagger
- unigram - unigram tagger
# sent = ['ชาวต่างชาติ', 'เรียก', 'อาณาจักร', 'อยุธยา', 'ว่า', 'สยาม']
pos_tag(sent) # Default engine="perceptron"
pos_tag(sent, engine="unigram")
Corpus¶
เราสามารถเลือกใช้คำศัพท์ จาก Curpus ต่าง ๆ ได้แก่
- orchid (default) - annotated Thai academic articles namedly Orchid
- orchid_ud - annotated Thai academic articles Orchid but the POS tags are mapped to comply with Universal Dependencies POS Tags
- pud - Parallel Universal Dependencies (PUD)
pos_tag(sent) # (default) corpus="orchid"
pos_tag(sent, corpus="orchid_ud")
pos_tag(sent, corpus="pud")
Uncomment แล้วรัน Cell เพื่อดู help
# pos_tag??
# pos_tag_sents??
2.2 pos_tag_sents¶
POS Tagging ทีละหลายประโยค
sents = [['ไทยบางแก้ว', 'หรือ', 'นิยม', 'เรียก', 'สั้น', ' ', 'ๆ', ' ', 'ว่า', ' ', 'บางแก้ว', ' ', 'เป็น', 'สุนัข', 'ประเภท', 'สปิตซ์', 'สายพันธุ์', 'หนึ่ง', 'ที่', 'มี', 'ถิ่นกำเนิด', 'ในประเทศ', 'ไทย', ' ', 'ที่', 'บ้าน', 'บางแก้ว', ' ', 'ตำบล', 'ท่า', 'นางงาม', ' ', 'และ', 'บ้าน', 'ชุมแสง', 'สงคราม', ' ', 'ตำบล', 'ชุมแสง', 'สงคราม', ' ', 'อำเภอ', 'บาง', 'ระกำ', ' ', 'จังหวัด', 'พิษณุโลก'],
['ไทยบางแก้ว', 'ถือเป็น', 'สุนัข', 'ไทย', 'สายพันธุ์', 'เดียว', 'ที่', 'มี', 'ขน', 'ยาว', 'สองชั้น', 'หาง', 'เป็น', 'พวง', 'มี', 'ขน', 'ขา', 'หน้า', 'คล้าย', 'ขน', 'ขา', 'แข้งสิงห์', 'แผง', 'รอบ', 'คอ', 'คล้าย', 'สิงโต', 'มี', 'ความเฉลียวฉลาด']]
pos_tag_sents(sents)
pos_tag_sents(sents, engine="unigram")
pos_tag_sents(sents, corpus="orchid_ud")
pos_tag_sents(sents, corpus="pud")
3. PyThaiNLP Named-Entity Tagging¶
Named-Entity Recognition หรือ Named Entity Tagging คือ กระบวนการในการหาตำแหน่ง และ แปะป้ายชื่อเฉพาะของสิ่งต่าง ๆ ที่อยู่ในเอกสาร เช่น ชื่อคน ชื่อองค์กร สถานที่ ตัวเลข จำนวนเงิน วันเวลา persons, locations, organizations, products, medical codes, time expressions, quantities, monetary values, percentages
from pythainlp.tag.named_entity import ThaiNameTagger
ner = ThaiNameTagger()
# ner.get_ner??
3.1 POS Tag¶
text2 = "จังหวัดพะเยา เป็นจังหวัดในภาคเหนือตอนบน บริเวณที่ตั้งของตัวเมืองพะเยาในปัจจุบันอยู่ติดกับกว๊านพะเยา เดิมเป็นที่ตั้งของเมือง ภูกามยาว หรือ พะยาว ที่ก่อตั้งขึ้นเมื่อพุทธศตวรรษที่ 16 โดยกษัตริย์องค์แรกคือ พญาจอมธรรม"
ner.get_ner(text2)
text3 = "ในท้ายที่สุดก่อนที่พะเยาจะถูกยกฐานะขึ้นเป็นจังหวัดพะเยา พะเยาอยู่ใต้การปกครองของจังหวัดเชียงรายในฐานะ อำเภอพะเยา และเมื่อวันที่ 28 สิงหาคม พ.ศ. 2520 อำเภอพะเยาได้ยกฐานะขึ้นเป็น จังหวัดพะเยา นับเป็นจังหวัดที่ 72 ของประเทศไทย"
ner.get_ner(text3)
B = Beginning, I = Inside, O = Outside
3.2 Output like HTML Tag¶
เราสามารถกำหนดให้ Output เป็น tag แบบ HTML ได้ ด้วย tag=True
text4 = "จังหวัดพะเยา เป็นจังหวัดในภาคเหนือตอนบน บริเวณที่ตั้งของตัวเมืองพะเยาในปัจจุบันอยู่ติดกับกว๊านพะเยา เดิมเป็นที่ตั้งของเมือง ภูกามยาว หรือ พะยาว ที่ก่อตั้งขึ้นเมื่อพุทธศตวรรษที่ 16 โดยกษัตริย์องค์แรกคือ พญาจอมธรรม"
ner.get_ner(text4, tag=True)
Credit¶