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

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

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

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปทำ Sentiment Analysis ภาษาไทยใน Python กันครับ
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/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/

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

  1. ขอบคุณสำหรับความรู้ค่ะ

    ถ้าเราต้องการอ่านหลายๆประโยค (ส่งเข้าเป็น text file) สามารถทำได้หรือไม่คะ

    ตอบลบ
    คำตอบ
    1. ได้ครับ แต่ต้องอาศัยตัวตัดคำกับตัวตัดประโยคด้วยครับ

      ลบ
  2. เยี่ยมครับ ถ้าประโยคของเรามีภาษาอื่นด้วยนี่ ทำอย่างไรดีครับ? สร้างคำพิเศษขึ้นมา?

    ตอบลบ
    คำตอบ
    1. เพิ่มข้อความลงในคลังข้อความก่อน train ครับ

      ลบ
  3. ใช้เวลารันนานมากเลยนะครับ มีวิธีเพิ่มความเร็วมั้ยครับ

    ตอบลบ
  4. เราสามารถแยกเอาข้อมูลที่ได้จากการ train ไปเก็บไว้ที่อื่นก่อน เพื่อที่ทำให้เวลา test ไม่ต้องไป train ใหม่ได้ไหมคะ

    ตอบลบ
  5. ถ้านำไปใช้กับ งานบางอย่างเฉพาะทาง เช่นการบริการ ด้านต่างๆ เราแค่เทรนข้อมความที่เกี่ยวกับด้านนั้นลงไป ใช่ไหมครับ

    ตอบลบ
  6. อยากหาค่า accuracy ขอมันอะครับ ต้องทำอย่างไรต่อ

    ตอบลบ
  7. อยากหาค่า accuracy อะครับ ต้องทำไงต่ออะครับ

    ตอบลบ
  8. บทความนี้ถูกเขียนถูกใหม่
    สามารถอ่านบทความอันใหม่ ทำ Sentiment Analysis ภาษาไทยโดยใช้ NLTK ได้ที่ https://python3.wannaphong.com/2018/03/sentiment-analysis-nltk.html

    ตอบลบ
  9. ไม่ระบุชื่อ31 มีนาคม 2563 เวลา 11:44

    ถ้าต้องการเทรนข้อมูลใน model ต่อจากตัวเดิม โดยไม่ต้องเริ่มเทรนใหม่ มีวิธีไหมครับ ขอบคุณครับ

    ตอบลบ
  10. โหลดไฟล์ไม่ได้ค่า

    ตอบลบ
  11. สามารถทำออกมาเป็นกราฟได้ไหมครับว่ามี pos และ neg กี่ข้อความขอบคุณครับ (ผมมือใหม่)

    ตอบลบ

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