Skip to content

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

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

Sentiment Analysis สามารถบ่งบอกความรู้สึกที่มีได้
Sentiment Analysis สามารถบ่งบอกความรู้สึกที่มีได้

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

from nltk import NaiveBayesClassifier as nbc
from pythainlp.tokenize import word_tokenize
import codecs
from itertools import chain

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

# 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() # ปิดไฟล์

แล้วจาก 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

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 ประมวลผล

ตัวอย่าง

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

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

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

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

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

11 thoughts on “ทำ Sentiment Analysis ภาษาไทยใน Python

  1. Kitipan

    ไม่แน่ใจว่า ถ้าเขียนบน R จะทำได้ไหมครับ เท่าที่ค้นดู ยังไม่เห็นครับ

    Reply
    1. wannaphong

      ผมไม่ค่อยรู้เรื่องอะไรเกี่ยวกับ R ครับ ทำ Sentiment Analysis ภาษาไทยแต่น่าจะได้ครับเพราะผมได้ทำ Dict ไว้แล้วครับ

      Reply
  2. Thanaphon

    ในไฟล์ pos กับ neg คำที่อยู่ข้างในน่าจะเป็นคำคำเดียวนะครับ เช่น ใน neg "ชั่ว", "เลว" คือถ้ามีคำว่า "เป็นไม่ดี" งี้คำว่า "เป็น" ก็จะกลายเป็น neg ด้วยครับ

    Reply
  3. มือใหม่หัดไพทอน

    ผมไม่เคยเขียนpythonมาก่อน(ปกติjava) แต่ต้องทำ Sentiment Analysis ภาษาไทย มาเจอบทความนี้จึงสนใจอยากลองเขียนดู แต่ install pythainlp ไม่ได้สักทีครับ ติดเรื่อง Microsoft Visual C++ 14.0 is required. พอโหลดมาลงก็ยังไม่หาย ไม่รู้จะแก้ยังไง น่าจะติดตอนลงตัว pyicu ช่วยทีครับ

    Reply
      1. มือใหม่หัดไพทอน

        เครื่อง64ครับแต่โหลดไพทอนมา 32 ตอนนี้ได้แล้วครับ ผมไปเจออีกบทความเรื่อง pythainlp https://python3.wannaphong.com/2017/05/pythainlp-%E0%B9%82%E0%B8%A1%E0%B8%94%E0%B8%B9%E0%B8%A5-nlp-%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B9%84%E0%B8%97%E0%B8%A2%E0%B9%83%E0%B8%99-python.html
        ก็เลยโหลด ไฟล์ whl มาลง แล้ว install ได้เลยครับ

        ที่นี้ผมลองรันไฟล์ thai-sentiment-analysis จะติดตรง
        feature_set = [({i:(i in word_tokenize(sentence.lower())) for i in vocabulary},tag) for sentence, tag in training_data]
        น่าจะเป็นเพราะคำศัพท์ใน pos neg เยอะ พอมีวิธีทำให้ลูปมันเร็วขึ้นไหมครับ เพราะลองลบคำออกให้เหลือ10ครั้งมันรันได้

        ขอบคุณมากครับ

        Reply
  4. Sine

    ทำขั้นตอนนี้
    vocabulary = set(chain(*[word_tokenize(i[0].lower()) for i in training_data]))
    แล้วขึ้น error ว่า

    ImportError: dlopen(/Users/mac/anaconda/lib/python3.6/site-packages/_icu.cpython-36m-darwin.so, 2): Library not loaded: libicui18n.54.dylib
    Referenced from: /Users/mac/anaconda/lib/python3.6/site-packages/_icu.cpython-36m-darwin.so
    Reason: image not found

    ต้องแก้ไขตรงไหนคะ

    Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *