AI
น้องๆ หลายคนอาจจะเคยได้ยินคำว่า Natural Language Processing (NLP) กันมาบ้างแล้ว แต่ NLP Thai นี่สิ คืออะไรกันแน่? สมัยพี่ทำร้านเน็ต SiamCafe.net เมื่อ 20 กว่าปีก่อนเนี่ย คำว่า AI ยังเป็นเรื่องในหนัง Sci-Fi อยู่เลย แต่เดี๋ยวนี้มันเข้ามาใกล้ตัวเรามากๆ NLP ก็เป็นหนึ่งในนั้นแหละ
ง่ายๆ เลย NLP คือศาสตร์ที่ทำให้คอมพิวเตอร์เข้าใจภาษาที่เราใช้พูดคุยกันทุกวัน ไม่ว่าจะเป็นภาษาไทย ภาษาอังกฤษ หรือภาษาอื่นๆ แล้วทำไมมันถึงสำคัญล่ะ? ลองคิดดูว่าถ้าคอมพิวเตอร์เข้าใจภาษาเราได้ มันจะช่วยเราทำงานได้เยอะขนาดไหน ตั้งแต่แปลภาษา สรุปข่าวสาร ตอบคำถามลูกค้า ไปจนถึงช่วยเขียนบทความ (แบบที่กำลังอ่านอยู่นี่ไง! แซวเล่นนะน้องๆ)
NLP Thai ก็คือการนำเอาศาสตร์ NLP มาประยุกต์ใช้กับภาษาไทยนั่นเอง ซึ่งมันมีความท้าทายหลายอย่าง เพราะภาษาไทยมีเอกลักษณ์เฉพาะตัว เช่น ไม่มี space คั่นคำ (ทำให้การตัดคำยาก) มีวรรณยุกต์ที่ทำให้ความหมายเปลี่ยน และมีคำที่เขียนเหมือนกันแต่ความหมายต่างกันเยอะแยะไปหมด
อย่างที่บอกไปว่าภาษาไทยไม่มี space คั่นคำ ทำให้การตัดคำเป็นขั้นตอนแรกที่สำคัญมากๆ ใน NLP Thai ลองนึกภาพว่าถ้าเราให้คอมพิวเตอร์อ่านประโยค "ฉันไปกินข้าว" คอมพิวเตอร์จะต้องรู้ว่า "ฉัน", "ไป", "กิน", "ข้าว" คือคำแต่ละคำ ไม่ใช่ "ฉันไปกิ" กับ "นข้าว"
สมัยก่อนตอนพี่เริ่มศึกษาเรื่องนี้ใหม่ๆ ต้องเขียน code เองหมดเลย เดี๋ยวนี้มี library สำเร็จรูปให้ใช้เยอะแยะ เช่น PyThaiNLP หรือ DeepCut ช่วยชีวิตไปเยอะมากๆ
# ตัวอย่างการใช้ PyThaiNLP ในการตัดคำ
from pythainlp.tokenize import word_tokenize
text = "ฉันไปกินข้าวที่ร้านอาหารอร่อยมาก"
tokens = word_tokenize(text, engine="newmm")
print(tokens) # Output: ['ฉัน', 'ไป', 'กิน', 'ข้าว', 'ที่', 'ร้านอาหาร', 'อร่อย', 'มาก']
พอตัดคำได้แล้ว ขั้นตอนต่อไปคือการระบุชนิดของคำ (Part-of-Speech) ว่าแต่ละคำเป็นคำนาม คำกริยา คำคุณศัพท์ หรือคำอะไร POS Tagging จะช่วยให้คอมพิวเตอร์เข้าใจโครงสร้างของประโยคและตีความหมายได้แม่นยำยิ่งขึ้น
ยกตัวอย่างเช่น ในประโยค "แมวกินปลา" คอมพิวเตอร์จะต้องรู้ว่า "แมว" เป็นคำนาม (Noun), "กิน" เป็นคำกริยา (Verb), และ "ปลา" เป็นคำนาม (Noun) อีกเช่นกัน
NER คือการระบุชื่อเฉพาะในข้อความ เช่น ชื่อคน ชื่อสถานที่ ชื่อองค์กร หรือวันที่ NER มีประโยชน์มากๆ ในการสรุปข่าวสาร วิเคราะห์ข้อมูลลูกค้า หรือสร้าง chatbot
เคยเจอเคสที่ลูกค้า SiamCafe.net อยากให้ระบบช่วยคัดกรองข่าวการเมืองที่มีชื่อนักการเมืองคนหนึ่งโดยเฉพาะ NER นี่แหละช่วยได้เยอะเลย
สำหรับน้องๆ ที่สนใจอยากลองเล่น NLP Thai ดูบ้าง ไม่ต้องกลัวว่าจะยากเกินไปนะ เดี๋ยวนี้มีเครื่องมือและ library ที่ใช้งานง่ายเยอะแยะเลย พี่จะแนะนำขั้นตอนง่ายๆ ให้ลองทำตามกันดู
อย่างที่บอกไปว่ามี library NLP Thai ให้เลือกใช้หลายตัว แต่ละตัวก็มีจุดเด่นจุดด้อยต่างกันไป พี่แนะนำให้ลอง PyThaiNLP ก่อน เพราะใช้งานง่าย มีฟังก์ชันพื้นฐานครบ และมีเอกสารให้อ่านเยอะ แต่ถ้าอยากได้ประสิทธิภาพที่สูงขึ้น อาจจะต้องลอง DeepCut หรือ Transformer-based models ดู
หลังจากเลือก library ได้แล้ว ก็ต้องติดตั้งลงในเครื่องคอมพิวเตอร์ของเราก่อน โดยส่วนใหญ่จะใช้ pip ในการติดตั้ง
# ติดตั้ง PyThaiNLP
pip install pythainlp
อย่าลืมตรวจสอบ dependencies อื่นๆ ที่ library นั้นต้องการด้วยนะ บางทีอาจจะต้องติดตั้ง packages เพิ่มเติม
หลังจากติดตั้ง library เรียบร้อยแล้ว ก็ถึงเวลาทดลองใช้งานฟังก์ชันพื้นฐานต่างๆ เช่น การตัดคำ การทำ POS Tagging และการทำ NER ลองเริ่มจากประโยคง่ายๆ ก่อน แล้วค่อยๆ เพิ่มความซับซ้อนขึ้นเรื่อยๆ
ถ้าติดขัดตรงไหน ลอง search หาข้อมูลใน Google หรือ Stack Overflow ดู รับรองว่ามีคนเคยเจอปัญหาเดียวกับเราแน่นอน
# ตัวอย่างการใช้ NER กับ PyThaiNLP
from pythainlp.tag import pos_tag
from pythainlp.tokenize import word_tokenize
text = "ประยุทธ์ จันทร์โอชา เป็นนายกรัฐมนตรีของประเทศไทย"
tokens = word_tokenize(text)
pos_tags = pos_tag(tokens)
print(pos_tags)
หลังจากที่คุ้นเคยกับการใช้งาน library แล้ว ลองคิดถึง use case ที่เราสนใจ แล้วนำเอา NLP Thai ไปประยุกต์ใช้ดู อาจจะเป็นการสร้าง chatbot ตอบคำถามลูกค้า การสรุปข่าวสารอัตโนมัติ หรือการวิเคราะห์ sentiment จากความคิดเห็นบนโซเชียลมีเดีย
สมัยพี่ทำ SiamCafe.net เคยลองทำระบบคัดกรอง comment ที่มีคำหยาบคายบน Facebook Page ของร้าน ปรากฏว่าช่วยลดภาระของ admin ไปได้เยอะเลย
NLP Thai ไม่ได้มีแค่ library ที่พี่แนะนำไปเท่านั้น ยังมีทางเลือกอื่นๆ อีกมากมาย แต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกันไป พี่จะสรุปให้เห็นภาพรวมในตารางนี้
| Library | ข้อดี | ข้อเสีย | เหมาะสำหรับ |
|---|---|---|---|
| PyThaiNLP | ใช้งานง่าย มีฟังก์ชันพื้นฐานครบ เอกสารเยอะ | ประสิทธิภาพอาจจะไม่สูงเท่าตัวอื่น | ผู้เริ่มต้น, งานที่ไม่ต้องการประสิทธิภาพสูงมาก |
| DeepCut | ประสิทธิภาพสูงในการตัดคำ | อาจจะใช้งานยากกว่า PyThaiNLP | งานที่ต้องการความแม่นยำในการตัดคำสูง |
| Transformer-based models (เช่น WangchanBERTa) | ประสิทธิภาพสูงมากในหลาย tasks | ต้องการทรัพยากรในการ train และ run สูง | งานที่ต้องการประสิทธิภาพสูงสุด, งานวิจัย |
นอกจาก library เหล่านี้แล้ว ยังมี Cloud-based NLP services เช่น Google Cloud Natural Language API หรือ Amazon Comprehend ที่ให้บริการ NLP Thai ด้วย แต่ก็ต้องเสียค่าใช้จ่ายในการใช้งาน
เลือกทางเลือกที่เหมาะสมกับความต้องการและงบประมาณของน้องๆ นะครับ SiamCafe Blog มีบทความอื่นๆ เกี่ยวกับ AI อีกเยอะ ลองเข้าไปอ่านดูได้
สุดท้ายนี้ อยากฝากไว้ว่า NLP Thai เป็นศาสตร์ที่กำลังพัฒนาอย่างต่อเนื่อง มีอะไรใหม่ๆ เกิดขึ้นอยู่เสมอ อย่าหยุดที่จะเรียนรู้และทดลองนะครับ SiamCafe Blog ยินดีต้อนรับเสมอ
น้องๆ หลายคนถามพี่ว่า "อ.บอม NLP ไทยมันยากจริงเหรอ?" พี่บอกเลยว่ายากไม่อยากอยู่ที่เราเริ่มตรงไหน สมัยพี่ทำร้านเน็ต (SiamCafe) ก็มีคนถามว่า "ต่อเน็ตยากไหม?" ตอนนั้นโมเด็ม 56k ยังต้องตั้งค่า AT command กันอยู่เลย! แต่พอมี Router, WiFi ทุกอย่างก็ง่ายขึ้นเยอะ NLP ก็เหมือนกันครับ
พี่จะเล่าจากประสบการณ์จริงที่เคยเจอมานะ ตอนนั้นมีน้องคนนึงอยากทำ Chatbot ขายของออนไลน์ แต่ไปเริ่มที่ Train Model เองเลย ผลคือเจ๊งไม่เป็นท่า เพราะ Data ไม่ดี, Label ไม่แม่น, Algorithm ไม่เหมาะ พี่เลยแนะนำน้องให้เริ่มจากง่ายๆ ก่อน ใช้ API สำเร็จรูปก่อน แล้วค่อยๆ เรียนรู้ไป
สมัยนี้มี API NLP ของไทยให้ใช้เยอะแยะครับ เช่น Wongnai Corpus, PyThaiNLP, Deep Thai เอามาลองเล่นดูก่อนเลย ไม่ต้องกลัวว่าจะเสียเงิน เพราะส่วนใหญ่มี Free Tier ให้ใช้ ลองเอามาวิเคราะห์ Sentiment ของ Comment ใน Facebook ดูก่อนก็ได้
# ตัวอย่างการใช้ PyThaiNLP วิเคราะห์ Sentiment
from pythainlp.sentiment import sentiment
text = "ร้านนี้อาหารอร่อยมาก บริการก็ดีสุดๆ"
result = sentiment(text)
print(result) # positive
Data is king! พี่พูดเสมอ Data ที่เราใช้ Train Model ต้องสะอาดและมีคุณภาพ ถ้า Data มี Noise เยอะ (เช่น คำผิด, สแลง, Emoji) ผลลัพธ์ก็จะแย่ตามไปด้วย พี่เคยเจอเคส Data ที่มีแต่คำว่า "5555" "555+" เต็มไปหมด Model ก็เลยเรียนรู้ว่า "555" คือ Positive Sentiment ไปซะงั้น!
ลองใช้ Regular Expression (Regex) ช่วยในการ Clean Data ดูครับ
import re
text = "สวัสดีคร้าบบบบบ😊😊😊 อาหารอร่อยจุงเบยยยย"
text = re.sub(r"[^a-zA-Z0-9\s]", "", text) # ลบ Emoji
text = re.sub(r"(.)\1+", r"\1", text) # ลดจำนวนตัวอักษรที่ซ้ำกัน
print(text) # สวัสดีครับ อาหารอร่อยจุงเบย
Word Embedding คือการแปลงคำให้เป็น Vector เพื่อให้ Model เข้าใจความหมายของคำได้ดีขึ้น เช่น คำว่า "หมา" กับ "สุนัข" จะมี Vector ที่ใกล้เคียงกัน ทำให้ Model รู้ว่ามันคือสิ่งเดียวกัน สมัยก่อนพี่ต้องมานั่งทำ Thesaurus เอง ตอนนี้มี Word Embedding สำเร็จรูปให้ใช้เยอะแยะ เช่น Word2Vec, FastText, GloVe
ถ้าเรามี Model Pre-trained อยู่แล้ว (เช่น BERT, RoBERTa) เราสามารถเอามา Fine-tune กับ Data ของเราได้เลย วิธีนี้จะช่วยให้เราได้ Model ที่แม่นยำมากขึ้น โดยที่ไม่ต้อง Train Model เองทั้งหมด แต่ต้องระวังเรื่อง Overfitting ด้วยนะ
ยากกว่าแน่นอนครับ เพราะภาษาไทยไม่มี Space แบ่งคำ เราต้องทำ Word Segmentation ก่อน แถมยังมีเรื่องวรรณยุกต์, คำซ้อน, คำพ้องรูป, คำพ้องเสียง อีกเยอะแยะไปหมด แต่ก็ไม่ได้ยากเกินความสามารถนะ!
Python เป็นภาษาที่นิยมใช้ในการทำ NLP ครับ เพราะมี Library ให้ใช้เยอะแยะ แต่ถ้าไม่เก่ง Python ก็ไม่ต้องกังวล เริ่มจาก Library สำเร็จรูปก่อนก็ได้ แล้วค่อยๆ เรียนรู้ Python ไป
แล้วแต่ความชอบเลยครับ Google Cloud, AWS, Azure มี NLP Service ให้ใช้หมด แต่ละตัวก็มีข้อดีข้อเสียต่างกัน ลองเปรียบเทียบราคาและ Feature ดูก่อนตัดสินใจ
มีครับ ลองดูที่ Wongnai Corpus, LST20, BEST Corpus, Thai National Corpus แต่ละ Data Set ก็มี License ที่แตกต่างกัน ต้องอ่านรายละเอียดให้ดีก่อนใช้งาน
NLP ไทยอาจจะดูยาก แต่ถ้าเราเริ่มจากง่ายๆ, Clean Data ให้ดี, เข้าใจ Word Embedding, และ Fine-tuning Model เราก็สามารถทำ NLP ไทยได้ไม่ยากครับ อย่าลืมลอง iCafeForex นะครับ เผื่อใครอยากพักผ่อนจากการเขียนโปรแกรม
พี่หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลยครับ แล้วอย่าลืมติดตาม SiamCafe Blog ด้วยนะครับ มีบทความดีๆ อีกเยอะเลย