Sentiment Analysis คืออะไร ?
Sentiment Analysis หรือชื่อในภาษาไทย "การวิเคราะห์ความรู้สึก" เป็นการวิเคราะห์อารมณ์และความรู้สึกจากข้อความ เพื่อบ่งบอกความรู้สึกของผู้คนที่มีต่อบางสิ่งบางอย่าง เช่น ความรู้สึกดี (Positive) หรือ ความรู้สึกที่ไม่ดี (Negative)
ตัวอย่างเช่น
เขาเป็นคนดี ช่วยแมวที่กำลังจะตกจากอาคารสูง น่าชื่นชมนะ
อันนี้คือ ความรู้สึกดี (Positive)
เขาทำงานบกพร่องจนทำให้มีคนเดือดร้อน
อันนี้คือ ความรู้สึกที่ไม่ดี (Negative)
ปัจจุบันนี้ได้มีการนำ Sentiment Analysis มาใช้งานในด้านต่าง ๆ เช่น ด้านการตลาด ด้านการสื่อสาร เป็นต้น
ในประเทศไทยได้มีการทำ Sentiment Analysis ภาษาไทย ไม่ว่าจะเป็น POP จาก NECTEC หรือ S-Sense Tourism
ในภาษาไพทอน เราสามารถ Sentiment Analysis ภาษาไทยได้ด้วยโมดูล NLTK และ PyThaiNLP
สำหรับผู้ที่ยังไม่ได้ติดตั้งโมดูลเหล่านี้ ติดตั้งได้ด้วยคำสั่ง (PyThaiNLP รองรับ Python 3.4 ขึ้นไปเท่านั้น) ดังนี้
pip install nltk pythainlp
การทำงานของ Sentiment Analysis
อย่างแรกนำข้อความมาแบ่งคำ (ใช้ PyThaiNLP) แล้วหาความสัมพันธ์ระหว่าง "คำ" และ "เอกสาร" ที่มีอยู่ ในรูปแบบของเวกเตอร์ ต่อมาสร้างโมเดล Sentiment Analysis ด้วยอัลกอริทึม Naive Bayes (ใช้ NLTK) แล้วนำข้อความที่ต้องการ มาแบ่งคำแล้วใช้โมเดล Sentiment Analysis ที่สร้างแล้วส่งค่าออกมา
เรามาลงมือเขียน Sentiment Analysis ภาษาไทยในภาษา Python กันครับ
อย่างแรกที่ต้องมีคือ คลังข้อมูลความรู้สึกดี (Positive) และความรู้สึกที่ไม่ดี (Negative) ภาษาไทย (ซึ่งเป็นที่น่าเสียดายที่งานวิจัย Sentiment Analysis ภาษาไทยที่ออกมา แต่กลับไม่มีการเผยแพร่ไฟล์คลังข้อมูล Sentiment Analysis ภาษาไทย ออกมาเลย แม้แต่หน่วยงานในสำกัดของรัฐที่ทำงานด้าน NLP) ผมได้สร้างคลังข้อมูลไว้แล้ว ให้ทำการโหลดไฟล์
pos.txt
และ neg.txt
ได้ที่ https://github.com/pythainlp/lexicon-thai/tree/master/ข้อความ มาเก็บไว้ช่วยกรอกข้อมูลคลังข้อมูลความรู้สึกดี (Positive) และความรู้สึกที่ไม่ดี (Negative) ภาษาไทยได้ที่ https://goo.gl/forms/7JccnQQ7cxefZRLs2
ต่อมาทำการสร้างไฟล์โค้ดไพทอนในโฟลเดอร์เดียวกันกับไฟล์
pos.txt
และ neg.txt
เริ่มด้วยการ
import
from nltk import NaiveBayesClassifier as nbc
from pythainlp.tokenize import word_tokenize
import codecs
from itertools import chain
แล้วทำการดึงข้อมูลจากไฟล์
pos.txt
และ neg.txt
เข้ามาเก็บไว้ใน listแล้วจาก list ทำการแท็กทีละประโยคว่าเป็น
pos
หรือ neg
ในรูปแบบ[(ประโยค,pos หรือ neg)]
ด้วยโค้ด
pos1=['pos']*len(listpos)
neg1=['neg']*len(listneg)
training_data = list(zip(listpos,pos1)) + list(zip(listneg,neg1))
แล้วทำการแบ่งคำออกจากประโยคโดยใช้ PyThaiNLP แล้วหาเวกเตอร์คำ
vocabulary = set(chain(*[word_tokenize(i[0].lower()) for i in training_data]))
feature_set = [({i:(i in word_tokenize(sentence.lower())) for i in vocabulary},tag) for sentence, tag in training_data]
ทำการ train โมเดลด้วยอัลกอริทึม Naive Bayes โดยใช้ NLTK
classifier = nbc.train(feature_set)
แล้วทำระบบรับข้อความแล้วประมวลผล Sentiment Analysis
ตัวอย่าง
ข้อความ : เขาเป็นคนดี ช่วยแมวที่กำลังจะตกจากอาคารสูง น่าชื่นชมนะ test_sent: เขาเป็นคนดี ช่วยแมวที่กำลังจะตกจากอาคารสูง น่าชื่นชมนะ tag: pos ข้อความ : เขาทำงานบกพร่องจนทำให้มีคนเดือดร้อน test_sent: เขาทำงานบกพร่องจนทำให้มีคนเดือดร้อน tag: neg
โค้ดฉบับเต็ม
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ
บทความนี้เขียนโดย นาย วรรณพงษ์ ภัททิยไพบูลย์ ที่ https://python3.wannaphong.com/
ขอบคุณสำหรับความรู้ค่ะ
ตอบลบถ้าเราต้องการอ่านหลายๆประโยค (ส่งเข้าเป็น text file) สามารถทำได้หรือไม่คะ
ได้ครับ แต่ต้องอาศัยตัวตัดคำกับตัวตัดประโยคด้วยครับ
ลบเยี่ยมครับ ถ้าประโยคของเรามีภาษาอื่นด้วยนี่ ทำอย่างไรดีครับ? สร้างคำพิเศษขึ้นมา?
ตอบลบเพิ่มข้อความลงในคลังข้อความก่อน train ครับ
ลบใช้เวลารันนานมากเลยนะครับ มีวิธีเพิ่มความเร็วมั้ยครับ
ตอบลบเราสามารถแยกเอาข้อมูลที่ได้จากการ train ไปเก็บไว้ที่อื่นก่อน เพื่อที่ทำให้เวลา test ไม่ต้องไป train ใหม่ได้ไหมคะ
ตอบลบได้ครับ โดยใช้ pickle ครับ
ลบถ้านำไปใช้กับ งานบางอย่างเฉพาะทาง เช่นการบริการ ด้านต่างๆ เราแค่เทรนข้อมความที่เกี่ยวกับด้านนั้นลงไป ใช่ไหมครับ
ตอบลบใช่ครับ
ลบอยากหาค่า accuracy ขอมันอะครับ ต้องทำอย่างไรต่อ
ตอบลบใช้ nltk.classify.accuracy(classifier, testing_set) ครับ
ลบอยากหาค่า accuracy อะครับ ต้องทำไงต่ออะครับ
ตอบลบบทความนี้ถูกเขียนถูกใหม่
ตอบลบสามารถอ่านบทความอันใหม่ ทำ Sentiment Analysis ภาษาไทยโดยใช้ NLTK ได้ที่ https://python3.wannaphong.com/2018/03/sentiment-analysis-nltk.html
ถ้าต้องการเทรนข้อมูลใน model ต่อจากตัวเดิม โดยไม่ต้องเริ่มเทรนใหม่ มีวิธีไหมครับ ขอบคุณครับ
ตอบลบโหลดไฟล์ไม่ได้ค่า
ตอบลบแก้ไขแล้วครับ
ลบสามารถทำออกมาเป็นกราฟได้ไหมครับว่ามี pos และ neg กี่ข้อความขอบคุณครับ (ผมมือใหม่)
ตอบลบ