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

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

Part of Speech คืออะไร

A visual depiction of the various grammatical categories in English under the analysis adopted by the Cambridge Grammar of the English Language. Credit https://en.wikipedia.org/wiki/File:EnglishGrammarCategories.png
A visual depiction of the various grammatical categories in English under the analysis adopted by the Cambridge Grammar of the English Language. Credit https://en.wikipedia.org/wiki/File:EnglishGrammarCategories.png

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 คืออะไร

Stanford CoreNLP integrates many of Stanford’s NLP tools, including the part-of-speech (POS) tagger, the named entity recognizer (NER), the parser, the coreference resolution system, sentiment analysis, bootstrapped pattern learning, and the open information extraction tools.   Credit https://stanfordnlp.github.io/CoreNLP/
Stanford CoreNLP integrates many of Stanford’s NLP tools, including the part-of-speech (POS) tagger, the named entity recognizer (NER). Credit https://stanfordnlp.github.io/CoreNLP/

Named-Entity Recognition หรือ Named Entity Tagging คือ กระบวนการในการหาตำแหน่ง และ แปะป้ายชื่อเฉพาะของสิ่งต่าง ๆ ที่อยู่ในเอกสาร เช่น ชื่อคน ชื่อองค์กร สถานที่ ตัวเลข จำนวนเงิน วันเวลา persons, locations, organizations, products, medical codes, time expressions, quantities, monetary values, percentages

เรามาเริ่มกันเลยดีกว่า

Open In Colab

งานทาง 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

In [0]:
%reload_ext autoreload
%autoreload 2
%matplotlib inline

Install Library ที่จำเป็น แล้ว Restart Runtime

In [0]:
# 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 ไว้ก่อน จะได้อ่านผลลัพท์ง่าย

In [0]:
import warnings
warnings.filterwarnings('ignore')

1. Import

Import Library ที่จะใช้ ในที่นี้คือ PyThaiNLP

In [0]:
import pythainlp

pythainlp.__version__
Out[0]:
'2.1.4'

เตรียมข้อความภาษาไทย ตัดคำด้วย PyThaiNLP Tokenizer ไว้ก่อน

In [0]:
from pythainlp import sent_tokenize, word_tokenize
In [0]:
text = "ชาวต่างชาติเรียกอาณาจักรอยุธยาว่าสยาม"
In [0]:
sent = word_tokenize(text)
sent
Out[0]:
['ชาวต่างชาติ', 'เรียก', 'อาณาจักร', 'อยุธยา', 'ว่า', 'สยาม']

ตัดคำภาษาไทย โดยเพิ่มคำใน Custom Dict

In [0]:
texts = ["ไทยบางแก้วหรือนิยมเรียกสั้น ๆ ว่า บางแก้ว เป็นสุนัขประเภทสปิตซ์สายพันธุ์หนึ่งที่มีถิ่นกำเนิดในประเทศไทย ที่บ้านบางแก้ว ตำบลท่านางงาม และบ้านชุมแสงสงคราม ตำบลชุมแสงสงคราม อำเภอบางระกำ จังหวัดพิษณุโลก",
         "ไทยบางแก้วถือเป็นสุนัขไทยสายพันธุ์เดียวที่มีขนยาวสองชั้นหางเป็นพวงมีขนขาหน้าคล้ายขนขาแข้งสิงห์แผงรอบคอคล้ายสิงโตมีความเฉลียวฉลาด"]
In [0]:
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
Out[0]:
[['ไทยบางแก้ว',
  'หรือ',
  'นิยม',
  'เรียก',
  'สั้น',
  ' ',
  'ๆ',
  ' ',
  'ว่า',
  ' ',
  'บางแก้ว',
  ' ',
  'เป็น',
  'สุนัข',
  'ประเภท',
  'สปิตซ์',
  'สายพันธุ์',
  'หนึ่ง',
  'ที่',
  'มี',
  'ถิ่นกำเนิด',
  'ในประเทศ',
  'ไทย',
  ' ',
  'ที่',
  'บ้าน',
  'บางแก้ว',
  ' ',
  'ตำบล',
  'ท่า',
  'นางงาม',
  ' ',
  'และ',
  'บ้าน',
  'ชุมแสง',
  'สงคราม',
  ' ',
  'ตำบล',
  'ชุมแสง',
  'สงคราม',
  ' ',
  'อำเภอ',
  'บาง',
  'ระกำ',
  ' ',
  'จังหวัด',
  'พิษณุโลก'],
 ['ไทยบางแก้ว',
  'ถือเป็น',
  'สุนัข',
  'ไทย',
  'สายพันธุ์',
  'เดียว',
  'ที่',
  'มี',
  'ขน',
  'ยาว',
  'สองชั้น',
  'หาง',
  'เป็น',
  'พวง',
  'มี',
  'ขน',
  'ขา',
  'หน้า',
  'คล้าย',
  'ขน',
  'ขา',
  'แข้งสิงห์',
  'แผง',
  'รอบ',
  'คอ',
  'คล้าย',
  'สิงโต',
  'มี',
  'ความเฉลียวฉลาด']]

2. PyThaiNLP Part-of-Speech Tagging

Part of Speech Tagging คือ การแปะป้ายว่า คำไหน เป็นส่วนไหนของประโยค เช่น คำนาม คำสรรพนาม คำกริยา คำวิเศษณ์ คำบุพบท คำสันธาน noun, pronoun, verb, adjective, adverb, preposition, conjunction และ interjection

In [0]:
from pythainlp.tag import pos_tag, pos_tag_sents

2.1 pos_tag

Engine

มี Engine ให้เลือกหลายตัว ได้แก่

  • perceptron (default) - perceptron tagger
  • unigram - unigram tagger
In [0]:
# sent = ['ชาวต่างชาติ', 'เรียก', 'อาณาจักร', 'อยุธยา', 'ว่า', 'สยาม']
In [0]:
pos_tag(sent) # Default engine="perceptron"
Out[0]:
[('ชาวต่างชาติ', 'NCMN'),
 ('เรียก', 'VACT'),
 ('อาณาจักร', 'NCMN'),
 ('อยุธยา', 'VACT'),
 ('ว่า', 'JSBR'),
 ('สยาม', 'NCMN')]
In [0]:
pos_tag(sent, engine="unigram")
Out[0]:
[('ชาวต่างชาติ', 'NCMN'),
 ('เรียก', 'VACT'),
 ('อาณาจักร', None),
 ('อยุธยา', None),
 ('ว่า', 'JSBR'),
 ('สยาม', None)]

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)
In [0]:
pos_tag(sent)  # (default) corpus="orchid"
Out[0]:
[('ชาวต่างชาติ', 'NCMN'),
 ('เรียก', 'VACT'),
 ('อาณาจักร', 'NCMN'),
 ('อยุธยา', 'VACT'),
 ('ว่า', 'JSBR'),
 ('สยาม', 'NCMN')]
In [0]:
pos_tag(sent, corpus="orchid_ud")
Out[0]:
[('ชาวต่างชาติ', 'NOUN'),
 ('เรียก', 'VERB'),
 ('อาณาจักร', 'NOUN'),
 ('อยุธยา', 'VERB'),
 ('ว่า', 'SCONJ'),
 ('สยาม', 'NOUN')]
In [0]:
pos_tag(sent, corpus="pud")
Out[0]:
[('ชาวต่างชาติ', 'NOUN'),
 ('เรียก', 'VERB'),
 ('อาณาจักร', 'VERB'),
 ('อยุธยา', 'PROPN'),
 ('ว่า', 'ADP'),
 ('สยาม', 'NOUN')]

Uncomment แล้วรัน Cell เพื่อดู help

In [0]:
# pos_tag??
# pos_tag_sents??

2.2 pos_tag_sents

POS Tagging ทีละหลายประโยค

In [0]:
sents = [['ไทยบางแก้ว', 'หรือ', 'นิยม', 'เรียก', 'สั้น', ' ', 'ๆ', ' ', 'ว่า', ' ', 'บางแก้ว', ' ', 'เป็น', 'สุนัข', 'ประเภท', 'สปิตซ์', 'สายพันธุ์', 'หนึ่ง', 'ที่', 'มี', 'ถิ่นกำเนิด', 'ในประเทศ', 'ไทย', ' ', 'ที่', 'บ้าน', 'บางแก้ว', ' ', 'ตำบล', 'ท่า', 'นางงาม', ' ', 'และ', 'บ้าน', 'ชุมแสง', 'สงคราม', ' ', 'ตำบล', 'ชุมแสง', 'สงคราม', ' ', 'อำเภอ', 'บาง', 'ระกำ', ' ', 'จังหวัด', 'พิษณุโลก'],
         ['ไทยบางแก้ว', 'ถือเป็น', 'สุนัข', 'ไทย', 'สายพันธุ์', 'เดียว', 'ที่', 'มี', 'ขน', 'ยาว', 'สองชั้น', 'หาง', 'เป็น', 'พวง', 'มี', 'ขน', 'ขา', 'หน้า', 'คล้าย', 'ขน', 'ขา', 'แข้งสิงห์', 'แผง', 'รอบ', 'คอ', 'คล้าย', 'สิงโต', 'มี', 'ความเฉลียวฉลาด']]
In [0]:
pos_tag_sents(sents)
Out[0]:
[[('ไทยบางแก้ว', 'NCMN'),
  ('หรือ', 'JCRG'),
  ('นิยม', 'VSTA'),
  ('เรียก', 'VACT'),
  ('สั้น', 'VATT'),
  (' ', 'PUNC'),
  ('ๆ', 'NCMN'),
  (' ', 'PUNC'),
  ('ว่า', 'JSBR'),
  (' ', 'PUNC'),
  ('บางแก้ว', 'NCMN'),
  (' ', 'PUNC'),
  ('เป็น', 'VSTA'),
  ('สุนัข', 'NCMN'),
  ('ประเภท', 'CLTV'),
  ('สปิตซ์', 'NCMN'),
  ('สายพันธุ์', 'NCMN'),
  ('หนึ่ง', 'DCNM'),
  ('ที่', 'PREL'),
  ('มี', 'VSTA'),
  ('ถิ่นกำเนิด', 'NCMN'),
  ('ในประเทศ', 'NCMN'),
  ('ไทย', 'NPRP'),
  (' ', 'PUNC'),
  ('ที่', 'RPRE'),
  ('บ้าน', 'NCMN'),
  ('บางแก้ว', 'NCMN'),
  (' ', 'PUNC'),
  ('ตำบล', 'NCMN'),
  ('ท่า', 'NCMN'),
  ('นางงาม', 'VATT'),
  (' ', 'PUNC'),
  ('และ', 'JCRG'),
  ('บ้าน', 'NCMN'),
  ('ชุมแสง', 'NCMN'),
  ('สงคราม', 'NCMN'),
  (' ', 'PUNC'),
  ('ตำบล', 'NCMN'),
  ('ชุมแสง', 'NCMN'),
  ('สงคราม', 'NCMN'),
  (' ', 'PUNC'),
  ('อำเภอ', 'NCMN'),
  ('บาง', 'DIBQ'),
  ('ระกำ', 'NCMN'),
  (' ', 'PUNC'),
  ('จังหวัด', 'NCMN'),
  ('พิษณุโลก', 'NCMN')],
 [('ไทยบางแก้ว', 'NCMN'),
  ('ถือเป็น', 'VSTA'),
  ('สุนัข', 'NCMN'),
  ('ไทย', 'NPRP'),
  ('สายพันธุ์', 'CNIT'),
  ('เดียว', 'DIAC'),
  ('ที่', 'PREL'),
  ('มี', 'VSTA'),
  ('ขน', 'NCMN'),
  ('ยาว', 'VATT'),
  ('สองชั้น', 'ADVN'),
  ('หาง', 'NCMN'),
  ('เป็น', 'VSTA'),
  ('พวง', 'NCMN'),
  ('มี', 'VSTA'),
  ('ขน', 'NCMN'),
  ('ขา', 'NCMN'),
  ('หน้า', 'VATT'),
  ('คล้าย', 'VSTA'),
  ('ขน', 'NCMN'),
  ('ขา', 'NCMN'),
  ('แข้งสิงห์', 'NCMN'),
  ('แผง', 'NCMN'),
  ('รอบ', 'CFQC'),
  ('คอ', 'NCMN'),
  ('คล้าย', 'VSTA'),
  ('สิงโต', 'NCMN'),
  ('มี', 'VSTA'),
  ('ความเฉลียวฉลาด', 'NCMN')]]
In [0]:
pos_tag_sents(sents, engine="unigram")
Out[0]:
[[('ไทยบางแก้ว', None),
  ('หรือ', 'JCRG'),
  ('นิยม', 'VSTA'),
  ('เรียก', 'VACT'),
  ('สั้น', 'VATT'),
  (' ', 'PUNC'),
  ('ๆ', 'NCMN'),
  (' ', 'PUNC'),
  ('ว่า', 'JSBR'),
  (' ', 'PUNC'),
  ('บางแก้ว', None),
  (' ', 'PUNC'),
  ('เป็น', 'VSTA'),
  ('สุนัข', None),
  ('ประเภท', 'CLTV'),
  ('สปิตซ์', None),
  ('สายพันธุ์', None),
  ('หนึ่ง', 'DCNM'),
  ('ที่', 'PREL'),
  ('มี', 'VSTA'),
  ('ถิ่นกำเนิด', None),
  ('ในประเทศ', None),
  ('ไทย', 'NPRP'),
  (' ', 'PUNC'),
  ('ที่', 'PREL'),
  ('บ้าน', 'NCMN'),
  ('บางแก้ว', None),
  (' ', 'PUNC'),
  ('ตำบล', 'NCMN'),
  ('ท่า', None),
  ('นางงาม', None),
  (' ', 'PUNC'),
  ('และ', 'JCRG'),
  ('บ้าน', 'NCMN'),
  ('ชุมแสง', None),
  ('สงคราม', None),
  (' ', 'PUNC'),
  ('ตำบล', 'NCMN'),
  ('ชุมแสง', None),
  ('สงคราม', None),
  (' ', 'PUNC'),
  ('อำเภอ', 'NCMN'),
  ('บาง', 'DIBQ'),
  ('ระกำ', None),
  (' ', 'PUNC'),
  ('จังหวัด', 'NCMN'),
  ('พิษณุโลก', None)],
 [('ไทยบางแก้ว', None),
  ('ถือเป็น', 'VSTA'),
  ('สุนัข', None),
  ('ไทย', 'NPRP'),
  ('สายพันธุ์', None),
  ('เดียว', 'DIAC'),
  ('ที่', 'PREL'),
  ('มี', 'VSTA'),
  ('ขน', None),
  ('ยาว', 'VATT'),
  ('สองชั้น', None),
  ('หาง', 'NCMN'),
  ('เป็น', 'VSTA'),
  ('พวง', None),
  ('มี', 'VSTA'),
  ('ขน', None),
  ('ขา', 'NCMN'),
  ('หน้า', 'NCMN'),
  ('คล้าย', 'VSTA'),
  ('ขน', None),
  ('ขา', 'NCMN'),
  ('แข้งสิงห์', None),
  ('แผง', 'NCMN'),
  ('รอบ', 'NCMN'),
  ('คอ', 'NCMN'),
  ('คล้าย', 'VSTA'),
  ('สิงโต', None),
  ('มี', 'VSTA'),
  ('ความเฉลียวฉลาด', None)]]
In [0]:
pos_tag_sents(sents, corpus="orchid_ud")
Out[0]:
[[('ไทยบางแก้ว', 'NOUN'),
  ('หรือ', 'CCONJ'),
  ('นิยม', 'VERB'),
  ('เรียก', 'VERB'),
  ('สั้น', 'ADJ'),
  (' ', 'PUNCT'),
  ('ๆ', 'NOUN'),
  (' ', 'PUNCT'),
  ('ว่า', 'SCONJ'),
  (' ', 'PUNCT'),
  ('บางแก้ว', 'NOUN'),
  (' ', 'PUNCT'),
  ('เป็น', 'VERB'),
  ('สุนัข', 'NOUN'),
  ('ประเภท', 'NOUN'),
  ('สปิตซ์', 'NOUN'),
  ('สายพันธุ์', 'NOUN'),
  ('หนึ่ง', 'NUM'),
  ('ที่', 'SCONJ'),
  ('มี', 'VERB'),
  ('ถิ่นกำเนิด', 'NOUN'),
  ('ในประเทศ', 'NOUN'),
  ('ไทย', 'PROPN'),
  (' ', 'PUNCT'),
  ('ที่', 'ADP'),
  ('บ้าน', 'NOUN'),
  ('บางแก้ว', 'NOUN'),
  (' ', 'PUNCT'),
  ('ตำบล', 'NOUN'),
  ('ท่า', 'NOUN'),
  ('นางงาม', 'ADJ'),
  (' ', 'PUNCT'),
  ('และ', 'CCONJ'),
  ('บ้าน', 'NOUN'),
  ('ชุมแสง', 'NOUN'),
  ('สงคราม', 'NOUN'),
  (' ', 'PUNCT'),
  ('ตำบล', 'NOUN'),
  ('ชุมแสง', 'NOUN'),
  ('สงคราม', 'NOUN'),
  (' ', 'PUNCT'),
  ('อำเภอ', 'NOUN'),
  ('บาง', 'DET'),
  ('ระกำ', 'NOUN'),
  (' ', 'PUNCT'),
  ('จังหวัด', 'NOUN'),
  ('พิษณุโลก', 'NOUN')],
 [('ไทยบางแก้ว', 'NOUN'),
  ('ถือเป็น', 'VERB'),
  ('สุนัข', 'NOUN'),
  ('ไทย', 'PROPN'),
  ('สายพันธุ์', 'NOUN'),
  ('เดียว', 'DET'),
  ('ที่', 'SCONJ'),
  ('มี', 'VERB'),
  ('ขน', 'NOUN'),
  ('ยาว', 'ADJ'),
  ('สองชั้น', 'ADV'),
  ('หาง', 'NOUN'),
  ('เป็น', 'VERB'),
  ('พวง', 'NOUN'),
  ('มี', 'VERB'),
  ('ขน', 'NOUN'),
  ('ขา', 'NOUN'),
  ('หน้า', 'ADJ'),
  ('คล้าย', 'VERB'),
  ('ขน', 'NOUN'),
  ('ขา', 'NOUN'),
  ('แข้งสิงห์', 'NOUN'),
  ('แผง', 'NOUN'),
  ('รอบ', 'NOUN'),
  ('คอ', 'NOUN'),
  ('คล้าย', 'VERB'),
  ('สิงโต', 'NOUN'),
  ('มี', 'VERB'),
  ('ความเฉลียวฉลาด', 'NOUN')]]
In [0]:
pos_tag_sents(sents, corpus="pud")
Out[0]:
[[('ไทยบางแก้ว', 'NOUN'),
  ('หรือ', 'CCONJ'),
  ('นิยม', 'NOUN'),
  ('เรียก', 'NOUN'),
  ('สั้น', 'VERB'),
  ('<space>', 'ADJ'),
  ('ๆ', 'SYM'),
  ('<space>', 'VERB'),
  ('ว่า', 'ADP'),
  ('<space>', 'NOUN'),
  ('บางแก้ว', 'PROPN'),
  ('<space>', 'PROPN'),
  ('เป็น', 'AUX'),
  ('สุนัข', 'NOUN'),
  ('ประเภท', 'NOUN'),
  ('สปิตซ์', 'NOUN'),
  ('สายพันธุ์', 'NOUN'),
  ('หนึ่ง', 'NUM'),
  ('ที่', 'DET'),
  ('มี', 'VERB'),
  ('ถิ่นกำเนิด', 'NOUN'),
  ('ในประเทศ', 'VERB'),
  ('ไทย', 'PROPN'),
  ('<space>', 'NOUN'),
  ('ที่', 'ADP'),
  ('บ้าน', 'NOUN'),
  ('บางแก้ว', 'NOUN'),
  ('<space>', 'NOUN'),
  ('ตำบล', 'NOUN'),
  ('ท่า', 'NOUN'),
  ('นางงาม', 'NOUN'),
  ('<space>', 'NOUN'),
  ('และ', 'CCONJ'),
  ('บ้าน', 'NOUN'),
  ('ชุมแสง', 'NOUN'),
  ('สงคราม', 'NOUN'),
  ('<space>', 'NOUN'),
  ('ตำบล', 'VERB'),
  ('ชุมแสง', 'NOUN'),
  ('สงคราม', 'NOUN'),
  ('<space>', 'NOUN'),
  ('อำเภอ', 'PROPN'),
  ('บาง', 'DET'),
  ('ระกำ', 'NOUN'),
  ('<space>', 'NOUN'),
  ('จังหวัด', 'VERB'),
  ('พิษณุโลก', 'NOUN')],
 [('ไทยบางแก้ว', 'PROPN'),
  ('ถือเป็น', 'AUX'),
  ('สุนัข', 'NOUN'),
  ('ไทย', 'PROPN'),
  ('สายพันธุ์', 'NOUN'),
  ('เดียว', 'ADJ'),
  ('ที่', 'DET'),
  ('มี', 'VERB'),
  ('ขน', 'NOUN'),
  ('ยาว', 'ADJ'),
  ('สองชั้น', 'CCONJ'),
  ('หาง', 'NOUN'),
  ('เป็น', 'AUX'),
  ('พวง', 'NOUN'),
  ('มี', 'VERB'),
  ('ขน', 'NOUN'),
  ('ขา', 'VERB'),
  ('หน้า', 'NOUN'),
  ('คล้าย', 'ADJ'),
  ('ขน', 'NOUN'),
  ('ขา', 'NOUN'),
  ('แข้งสิงห์', 'NOUN'),
  ('แผง', 'NOUN'),
  ('รอบ', 'ADP'),
  ('คอ', 'NOUN'),
  ('คล้าย', 'VERB'),
  ('สิงโต', 'NOUN'),
  ('มี', 'VERB'),
  ('ความเฉลียวฉลาด', 'NOUN')]]

3. PyThaiNLP Named-Entity Tagging

Named-Entity Recognition หรือ Named Entity Tagging คือ กระบวนการในการหาตำแหน่ง และ แปะป้ายชื่อเฉพาะของสิ่งต่าง ๆ ที่อยู่ในเอกสาร เช่น ชื่อคน ชื่อองค์กร สถานที่ ตัวเลข จำนวนเงิน วันเวลา persons, locations, organizations, products, medical codes, time expressions, quantities, monetary values, percentages

In [0]:
from pythainlp.tag.named_entity import ThaiNameTagger

ner = ThaiNameTagger()
# ner.get_ner??

3.1 POS Tag

In [0]:
text2 = "จังหวัดพะเยา เป็นจังหวัดในภาคเหนือตอนบน บริเวณที่ตั้งของตัวเมืองพะเยาในปัจจุบันอยู่ติดกับกว๊านพะเยา เดิมเป็นที่ตั้งของเมือง ภูกามยาว หรือ พะยาว ที่ก่อตั้งขึ้นเมื่อพุทธศตวรรษที่ 16 โดยกษัตริย์องค์แรกคือ พญาจอมธรรม"
In [0]:
ner.get_ner(text2)
Out[0]:
[('จังหวัด', 'NOUN', 'B-LOCATION'),
 ('พะเยา', 'NOUN', 'I-LOCATION'),
 (' ', 'PUNCT', 'O'),
 ('เป็น', 'VERB', 'O'),
 ('จังหวัด', 'NOUN', 'O'),
 ('ใน', 'ADP', 'O'),
 ('ภาคเหนือ', 'NOUN', 'B-LOCATION'),
 ('ตอน', 'NOUN', 'I-LOCATION'),
 ('บน', 'ADP', 'I-LOCATION'),
 (' ', 'PUNCT', 'O'),
 ('บริเวณ', 'NOUN', 'O'),
 ('ที่ตั้ง', 'NOUN', 'O'),
 ('ของ', 'ADP', 'O'),
 ('ตัวเมือง', 'NOUN', 'O'),
 ('พะเยา', 'NOUN', 'B-LOCATION'),
 ('ใน', 'ADP', 'O'),
 ('ปัจจุบัน', 'NOUN', 'O'),
 ('อยู่', 'AUX', 'O'),
 ('ติดกับ', 'ADP', 'O'),
 ('กว๊าน', 'NOUN', 'O'),
 ('พะเยา', 'NOUN', 'O'),
 (' ', 'PUNCT', 'O'),
 ('เดิม', 'ADJ', 'O'),
 ('เป็นที่ตั้ง', 'NOUN', 'O'),
 ('ของ', 'ADP', 'O'),
 ('เมือง', 'NOUN', 'O'),
 (' ', 'PUNCT', 'O'),
 ('ภู', 'NOUN', 'B-LOCATION'),
 ('กาม', 'NOUN', 'I-LOCATION'),
 ('ยาว', 'ADJ', 'I-LOCATION'),
 (' ', 'PUNCT', 'O'),
 ('หรือ', 'CCONJ', 'O'),
 (' ', 'PUNCT', 'O'),
 ('พะ', 'NOUN', 'O'),
 ('ยาว', 'ADJ', 'O'),
 (' ', 'PUNCT', 'O'),
 ('ที่', 'SCONJ', 'O'),
 ('ก่อ', 'VERB', 'O'),
 ('ตั้งขึ้น', 'VERB', 'O'),
 ('เมื่อ', 'SCONJ', 'O'),
 ('พุทธศตวรรษ', 'NOUN', 'O'),
 ('ที่', 'SCONJ', 'O'),
 (' ', 'PUNCT', 'O'),
 ('16', 'NUM', 'O'),
 (' ', 'PUNCT', 'O'),
 ('โดย', 'SCONJ', 'O'),
 ('กษัตริย์', 'VERB', 'O'),
 ('องค์', 'NOUN', 'O'),
 ('แรก', 'ADJ', 'O'),
 ('คือ', 'VERB', 'O'),
 (' ', 'PUNCT', 'O'),
 ('พญา', 'NOUN', 'B-PERSON'),
 ('จอม', 'VERB', 'I-PERSON'),
 ('ธรรม', 'NOUN', 'I-PERSON')]
In [0]:
text3 = "ในท้ายที่สุดก่อนที่พะเยาจะถูกยกฐานะขึ้นเป็นจังหวัดพะเยา พะเยาอยู่ใต้การปกครองของจังหวัดเชียงรายในฐานะ อำเภอพะเยา และเมื่อวันที่ 28 สิงหาคม พ.ศ. 2520 อำเภอพะเยาได้ยกฐานะขึ้นเป็น จังหวัดพะเยา นับเป็นจังหวัดที่ 72 ของประเทศไทย"
In [0]:
ner.get_ner(text3)
Out[0]:
[('ใน', 'ADP', 'O'),
 ('ท้ายที่สุด', 'ADV', 'O'),
 ('ก่อนที่', 'SCONJ', 'O'),
 ('พะเยา', 'NOUN', 'O'),
 ('จะ', 'AUX', 'O'),
 ('ถูก', 'AUX', 'O'),
 ('ยกฐานะ', 'VERB', 'O'),
 ('ขึ้น', 'AUX', 'O'),
 ('เป็น', 'VERB', 'O'),
 ('จังหวัด', 'NOUN', 'B-LOCATION'),
 ('พะเยา', 'NOUN', 'I-LOCATION'),
 (' ', 'PUNCT', 'O'),
 ('พะเยา', 'NOUN', 'O'),
 ('อยู่', 'AUX', 'O'),
 ('ใต้', 'ADP', 'O'),
 ('การปกครอง', 'NOUN', 'O'),
 ('ของ', 'ADP', 'O'),
 ('จังหวัด', 'NOUN', 'B-LOCATION'),
 ('เชียงราย', 'NOUN', 'I-LOCATION'),
 ('ใน', 'ADP', 'O'),
 ('ฐานะ', 'NOUN', 'O'),
 (' ', 'PUNCT', 'O'),
 ('อำเภอ', 'NOUN', 'B-LOCATION'),
 ('พะเยา', 'NOUN', 'I-LOCATION'),
 (' ', 'PUNCT', 'O'),
 ('และ', 'CCONJ', 'O'),
 ('เมื่อ', 'SCONJ', 'O'),
 ('วันที่', 'NOUN', 'O'),
 (' ', 'PUNCT', 'O'),
 ('28', 'NUM', 'B-DATE'),
 (' ', 'PUNCT', 'I-DATE'),
 ('สิงหาคม', 'PROPN', 'I-DATE'),
 (' ', 'PUNCT', 'I-DATE'),
 ('พ.ศ.', 'NOUN', 'I-DATE'),
 (' ', 'PUNCT', 'I-DATE'),
 ('2520', 'NUM', 'I-DATE'),
 (' ', 'PUNCT', 'O'),
 ('อำเภอ', 'NOUN', 'B-LOCATION'),
 ('พะเยา', 'NOUN', 'I-LOCATION'),
 ('ได้', 'AUX', 'O'),
 ('ยกฐานะ', 'VERB', 'O'),
 ('ขึ้น', 'AUX', 'O'),
 ('เป็น', 'VERB', 'O'),
 (' ', 'PUNCT', 'O'),
 ('จังหวัด', 'NOUN', 'B-LOCATION'),
 ('พะเยา', 'NOUN', 'I-LOCATION'),
 (' ', 'PUNCT', 'O'),
 ('นับ', 'VERB', 'O'),
 ('เป็น', 'VERB', 'O'),
 ('จังหวัด', 'NOUN', 'O'),
 ('ที่', 'SCONJ', 'O'),
 (' ', 'PUNCT', 'O'),
 ('72', 'NUM', 'O'),
 (' ', 'PUNCT', 'O'),
 ('ของ', 'ADP', 'O'),
 ('ประเทศ', 'NOUN', 'B-LOCATION'),
 ('ไทย', 'PROPN', 'I-LOCATION')]

B = Beginning, I = Inside, O = Outside

3.2 Output like HTML Tag

เราสามารถกำหนดให้ Output เป็น tag แบบ HTML ได้ ด้วย tag=True

In [0]:
text4 = "จังหวัดพะเยา เป็นจังหวัดในภาคเหนือตอนบน บริเวณที่ตั้งของตัวเมืองพะเยาในปัจจุบันอยู่ติดกับกว๊านพะเยา เดิมเป็นที่ตั้งของเมือง ภูกามยาว หรือ พะยาว ที่ก่อตั้งขึ้นเมื่อพุทธศตวรรษที่ 16 โดยกษัตริย์องค์แรกคือ พญาจอมธรรม"
In [0]:
ner.get_ner(text4, tag=True)
Out[0]:
'<LOCATION>จังหวัดพะเยา</LOCATION> เป็นจังหวัดใน<LOCATION>ภาคเหนือตอนบน</LOCATION> บริเวณที่ตั้งของตัวเมือง<LOCATION>พะเยา</LOCATION>ในปัจจุบันอยู่ติดกับกว๊านพะเยา เดิมเป็นที่ตั้งของเมือง <LOCATION>ภูกามยาว</LOCATION> หรือ พะยาว ที่ก่อตั้งขึ้นเมื่อพุทธศตวรรษที่ 16 โดยกษัตริย์องค์แรกคือ <PERSON>พญาจอมธรรม</PERSON>'

Credit

In [0]:
 

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Project Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.

Enable Notifications.    Ok No thanks