การจำแนกอารมณ์ของข้อความ ด้วย Machine Learning โดยใช้ Python
Tags: ai, python, nlp
Published: 2024-04-15 12:00:48

**การจำแนกอารมณ์ของข้อความ (Text Emotions Classification)** เป็นปัญหาด้านการประมวลผลภาษาธรรมชาติหรือ Natural Language Processing (NLP) และการจำแนกข้อความหรือ Text Classification โดยเราจะต้องทำการฝึกโมเดล Text Classification เพื่อแบ่งแยกอารมณ์ของข้อความ

ในการแก้ปัญหานี้ เราจะต้องกำหนดข้อมูลของข้อความและอารมณ์ของข้อความนั้นๆ ก่อน โดยเราจะใช้**ชุดข้อมูล**จากเว็บไซต์ **Kaggle** ในการแก้ปัญหานี้ คุณสามารถไป**ดาวน์โหลด**ชุดข้อมูลได้จาก [ที่นี่](https://www.kaggle.com/datasets/praveengovi/emotions-dataset-for-nlp)

ในบทความนี้เราจะ**แสดงวิธีฝึกโมเดล** Text Classification สำหรับการจำแนกอารมณ์ของข้อความ โดยใช้ **Machine Learning** และ **Python**

---

## ขั้นตอนการเตรียมการ

> **ขั้นที่ 1**: เริ่มต้นจากการ import python libraries ต้องใช้ก่อน
```
import pandas as pd
import numpy as np
import keras
import tensorflow
from keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Embedding, Flatten, Dense
```

> **ขั้นที่ 2**: ทำการ Upload ชุดข้อมูลที่เราได้ดาวน์โหลดมาลงใน Google Colab โดย...

1. คลิ๊กที่รูป Folder บริเวณแถบซ้าย
2. คลิ๊กที่ปุ่ม Upload บริเวณด้ายซ้ายบนหลังจากที่ Folder เปิดขึ้นมาแล้ว
3. เลือกไฟล์ที่ต้องการอัพโหลด

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xbua1q6nllydyz7eyp0s.png)

> **ขั้นที่ 3**: ลองทดสอบว่าทำการ Upload ชุดข้อมูลสำเร็จหรือไม่โดยการลอง Print ชุดข้อมูล 5 ตัวแรก

```
data = pd.read_csv("train.txt", sep=';')
data.columns = ["Text", "Emotions"]
print(data.head())
```
ผลลัพธ์ที่ได้:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j6jwmwp7wckkoskt66nu.png)

> **ขั้นที่ 4**: เนื่องจากนี่เป็นปัญหาที่เกี่ยวข้องกับ Natural Language Processing (NLP) เราจึงต้องป้องกันข้อมูลส่วนบุคคล เช่น เลขบัญชี โดยใช้ Data Tokenization

```
texts = data["Text"].tolist()
labels = data["Emotions"].tolist()

# Tokenize the text data
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
```

> **ขั้นที่ 5**: จัดวางลำดับข้อความใหม่เพื่อให้มีความยาวเท่ากับข้อความต้นฉบับเพื่อป้อนข้อมูลให้ Neural Network

```
sequences = tokenizer.texts_to_sequences(texts)
max_length = max([len(seq) for seq in sequences])
padded_sequences = pad_sequences(sequences, maxlen=max_length)
```
> **ขั้นที่ 6**: ใช้ Label Encoder Method เพื่อเปลี่ยนข้อมูลตัวอักษรให้เป็นข้อมูลตัวเลข

```
# Encode the string labels to integers
label_encoder = LabelEncoder()
labels = label_encoder.fit_transform(labels)
```
> **ขั้นที่ 7**: เราจะทำการ One-Hot Encode หรือก็คือการเปลี่ยนข้อมูลที่ถูกเก็บในลักษณะเป็น Categorical ให้เป็นเลขฐาน 2 ขั้นตอนนี้เป็นขั้นตอนที่**จำเป็น**เพราะ Machine Learning Algorithms จะทำงานกับข้อมูลที่เป็นตัวเลข

```
# One-hot encode the labels
one_hot_labels = keras.utils.to_categorical(labels)
```

---

## ขั้นตอนการฝึกโมเดล Text Emotions Classification

> **ขั้นที่ 1**: ทำการแบ่งกลุ่มข้อมูลออกเป็น 2 กลุ่ม คือ...

- กลุ่มข้อมูลสำหรับการฝึก
- กลุ่มข้อมูลสำหรับการทดสอบ

```
# Split the data into training and testing sets
xtrain, xtest, ytrain, ytest = train_test_split(padded_sequences, 
                                                one_hot_labels, 
                                                test_size=0.2)
```
> **ขั้นที่ 2**: กำหนด Neural Network Architecture ของปัญหาที่เรายกมา และใช้มันในการฝึกโมเดลการจำแนกอารมณ์

```
# Define the model
model = Sequential()
model.add(Embedding(input_dim=len(tokenizer.word_index) + 1, 
                    output_dim=128, input_length=max_length))
model.add(Flatten())
model.add(Dense(units=128, activation="relu"))
model.add(Dense(units=len(one_hot_labels[0]), activation="softmax"))

model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
model.fit(xtrain, ytrain, epochs=10, batch_size=32, validation_data=(xtest, ytest))
```
ผลลัพธ์ที่ได้:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lf8b0hmiwyhu8tjoa140.png)

> **ขั้นที่ 3**: ทำการทดสอบโมเดลที่ฝึกมาโดยการลองพิมพ์ประโยคที่เราต้องการ เช่น

- ตัวอย่างที่ 1
```
input_text = "She didn't come today because she lost her dog yestertay!"

# Preprocess the input text
input_sequence = tokenizer.texts_to_sequences([input_text])
padded_input_sequence = pad_sequences(input_sequence, maxlen=max_length)
prediction = model.predict(padded_input_sequence)
predicted_label = label_encoder.inverse_transform([np.argmax(prediction[0])])
print(predicted_label)
```

- ตัวอย่างที่ 2
```
input_text = "I fear no man, but that thing... It scared me"

# Preprocess the input text
input_sequence = tokenizer.texts_to_sequences([input_text])
padded_input_sequence = pad_sequences(input_sequence, maxlen=max_length)
prediction = model.predict(padded_input_sequence)
predicted_label = label_encoder.inverse_transform([np.argmax(prediction[0])])
print(predicted_label)
```

- ตัวอย่างที่ 3
```
input_text = "Remember last vacation? It was the best time of my life!"

# Preprocess the input text
input_sequence = tokenizer.texts_to_sequences([input_text])
padded_input_sequence = pad_sequences(input_sequence, maxlen=max_length)
prediction = model.predict(padded_input_sequence)
predicted_label = label_encoder.inverse_transform([np.argmax(prediction[0])])
print(predicted_label)
```

ผลลัพธ์ที่ได้ :
- ตัวอย่างที่ 1
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3adw4agyf0wfmp18v604.png)

- ตัวอย่างที่ 2
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yrls8dpfzpz2jvsfbj5g.png)

- ตัวอย่างที่ 3
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x74v5mw73r9zrywesg9s.png)

---

## สรุปผล
**การจำแนกอารมณ์ของข้อความ (Text Emotions Classification)** เป็นปัญหาด้านการกำหนด**อารมณ์**ที่ข้อความสื่อออกมาผ่านเนื้อความนั้นๆ โดยหนึ่งตัวอย่างที่ที่ใช้โมเดลตัวนี้ในชีวิตประจำวันนั้นคือ การที่เราพิมพ์ข้อความลงบน**แป้นพิมพ์**ของ iPhone และจะมี **Emoji ที่เกี่ยวข้อง**กับเนื้อความแสดงขึ้นมาให้กดได้ ซึ่งทำให้เพิ่มความสะดวกให้กับผู้ใช้ได้โดยแทนที่จะต้องไปค้นหา Emoji นั้นๆ เอง การที่มี Emoji ขึ้นมาให้เลยจึงช่วย**ประหยัดเวลา**ของผู้ใช้เป็นอย่างมาก

ทั้งนี้ความแม่นยำของการฝึกโมเดลในบทความนี้ยังคงมี**ความคลาดเคลื่อน**และ**ผิดผลาด**อยู่ หากต้องการให้มีความแม่นยำมากกว่านี้ จะต้อง**ป้อนข้อมูล**ให้กับ AI มากกว่านี้เช่นกัน เพื่อที่ AI ตัวนี้จะสามารถทำงานได้อย่าง**สมบูรณ์**แบบมากขึ้น

---

## แหล่งอ้างอิง


- Text Emotions Classification using Python: https://thecleverprogrammer.com/2023/02/06/text-emotions-classification-using-python/
- การประมวลผลภาษาธรรมชาติ (Natural Language Processing): https://www.sas.com/th_th/insights/analytics/what-is-natural-language-processing-nlp.html
- Text Classification: What it is And Why it Matters: https://monkeylearn.com/text-classification/
- Tokenization: https://www.imperva.com/learn/data-security/tokenization/
- Neural Network Architecture: https://www.dremio.com/wiki/neural-network-architecture/
- One-Hot Encoding สร้างตัวแปร Dummies สำหรับ Classification model: https://lengyi.medium.com/one-hot-encoding-737c66e5b1bd