26 กุมภาพันธ์ 2560

Published กุมภาพันธ์ 26, 2560 by with 0 comment

ทำ Sentiment Analysis ภาษาไทยใน Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปทำ Sentiment Analysis ภาษาไทยใน Python กันครับ

[caption id="" align="aligncenter" width="960"]Sentiment Analysis สามารถบ่งบอกความรู้สึกที่มีได้ Sentiment Analysis สามารถบ่งบอกความรู้สึกที่มีได้[/caption]

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/wannaphongcom/lexicon-thai/tree/master/ข้อความ มาเก็บไว้
ช่วยกรอกข้อมูลคลังข้อมูลความรู้สึกดี (Positive) และความรู้สึกที่ไม่ดี (Negative) ภาษาไทยได้ที่ https://goo.gl/forms/7JccnQQ7cxefZRLs2

ต่อมาทำการสร้างไฟล์โค้ดไพทอนในโฟลเดอร์เดียวกันกับไฟล์ pos.txt และ neg.txt
เริ่มด้วยการ import

[python]
from nltk import NaiveBayesClassifier as nbc
from pythainlp.tokenize import word_tokenize
import codecs
from itertools import chain
[/python]

แล้วทำการดึงข้อมูลจากไฟล์ pos.txt และ neg.txt เข้ามาเก็บไว้ใน list

[python]
# pos.txt
with codecs.open('pos.txt', 'r', "utf-8") as f:
lines = f.readlines()
listpos=[e.strip() for e in lines]
del lines
f.close() # ปิดไฟล์
# neg.txt
with codecs.open('neg.txt', 'r', "utf-8") as f:
lines = f.readlines()
listneg=[e.strip() for e in lines]
del lines
f.close() # ปิดไฟล์
[/python]

แล้วจาก list ทำการแท็กทีละประโยคว่าเป็น pos หรือ neg ในรูปแบบ

[python][(ประโยค,pos หรือ neg)][/python]

ด้วยโค้ด

[python]pos1=['pos']*len(listpos)
neg1=['neg']*len(listneg)
training_data = list(zip(listpos,pos1)) + list(zip(listneg,neg1))
[/python]

แล้วทำการแบ่งคำออกจากประโยคโดยใช้ PyThaiNLP แล้วหาเวกเตอร์คำ

[python]
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]
[/python]

ทำการ train โมเดลด้วยอัลกอริทึม Naive Bayes โดยใช้ NLTK

[python]classifier = nbc.train(feature_set)[/python]

แล้วทำระบบรับข้อความแล้วประมวลผล Sentiment Analysis

[python]
while True:
test_sentence = input('\nข้อความ : ')
featurized_test_sentence = {i:(i in word_tokenize(test_sentence.lower())) for i in vocabulary}
print("test_sent:",test_sentence)
print("tag:",classifier.classify(featurized_test_sentence)) # ใช้โมเดลที่ train ประมวลผล
[/python]

ตัวอย่าง
ข้อความ : เขาเป็นคนดี ช่วยแมวที่กำลังจะตกจากอาคารสูง น่าชื่นชมนะ
test_sent: เขาเป็นคนดี ช่วยแมวที่กำลังจะตกจากอาคารสูง น่าชื่นชมนะ
tag: pos

ข้อความ : เขาทำงานบกพร่องจนทำให้มีคนเดือดร้อน
test_sent: เขาทำงานบกพร่องจนทำให้มีคนเดือดร้อน
tag: neg

โค้ดฉบับเต็ม


ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

บทความนี้เขียนโดย นาย วรรณพงษ์ ภัททิยไพบูลย์ ที่ https://python3.wannaphong.com/

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

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

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