Customer’s Negative Comments

DSEsGr.10 Week2–3

DSEs_G10
botnoi-classroom
4 min readSep 1, 2020

--

photo from https://www.michaelpage.co.th/advice/career-advice/productivity-and-performance/5-ways-use-negative-feedback-your-advantage “ผู้เขียนไม่มีเจตนาละเมิดลิขสิทธิ์”

Team member:
1. ake
2. Bank
3. Jui
4. oOhHhH
5. เต้ย พอๆๆ
6. ปาร์ตี้ จ้า
7. Sutthipas Y.
8. VIVI -ビビ
9. Aui Jampen
10. DingDoNG
11. iceberg
12. Nui
13. Mr. Vasan
14. Panuwat
15. ming
16. Peach
17. sumana
18. Thon
19. Emkrit
20. SmileyYui
21. Guide (Private)
22. Gopher_Sum’O~*
23. Yui Kitima

Objective: บทความนี้เป็นส่วนหนึ่งของ Data Science Essential ของ Botnoi Classroom หัวข้อ Machine Leaning (เบื้องต้น) และ Prediction Models

โปรเจคนี้เกี่ยวกับอะไร ทำไมเลือกหัวข้อนี้ ?

ปัจจุบันการซื้อของออนไลน์กลายเป็นวิถีปกติใหม่ของคนยุคนี้ไปแล้ว ประกอบกับมีตัวเร่งการระบาดของโรคโควิด-19 ก่อนหน้า ส่งผลให้คนหันมาซื้อของผ่านช่องทางนี้เพิ่มมากขึ้น เราจึงปฏิเสธไม่ได้เลยว่าการดำเนินชีวิตของคนกลุ่มหนึ่งเปลี่ยนไปแล้วโดยสิ้นเชิง ทำให้การจัดการข้อมูลเพื่อนำมาประยุกต์ใช้กับธุรกิจที่อาศัยแพลตฟอร์มการขายของออนไลน์ (E-commerce) เป็นสิ่งที่สร้างประโยชน์กับผู้ประกอบการหรือเจ้าของข้อมูลได้อย่างแน่นอน เพื่อปรับเปลี่ยนแนวทางการพัฒนาตัวสินค้าหรือบริการให้เป็นที่พึงพอใจของลูกค้ามากที่สุดและสามารถสร้างยอดขายที่สูงขึ้นได้

ในส่วนโปรเจคนี้ทีมงานจะมาวิเคราะห์ ไอเดีย อารมณ์และความรู้สึกที่มีต่อสินค้าและบริการว่าเป็น แง่บวกหรือแง่ลบผ่านการสร้างโมเดลการทำนายความพึงพอใจของลูกค้าจากข้อมูลการให้คะแนนสินค้าและข้อความคอมเม้นต์หรือรีวิวสินค้าหลังจากได้รับแล้ว ด้วยเทคนิค Text Classification เพื่อทำ Sentiment Analysis

ขั้นตอนการเลือก data

เป็นชุดข้อมูลที่มาจากแพลตฟอร์มขายของออนไลน์เจ้าหนึ่งซึ่งใหญ่เป็นอันดับต้นๆของเมืองไทย ซึ่งมีรายละเอียดของ timestamp, score, sku name (ชื่อ รายละเอียดสินค้า ยี่ห้อ), product catagoryแบบกว้าง, product catagoryแบบละเอียด และ original text (ข้อความคอมเม้นต์) โดยข้อมูลที่นำมาใช้อยู่ในระหว่างช่วงเดือนกุมภาพันธ์- มิถุนายน 2563 (ทางทีมไม่เปิดเผยที่มาของข้อมูลและ sku name เนื่องจากทีมงานไม่มีเจตนาละเมิดลิขสิทธิ์)

การสร้างโมเดล

ภาพรวมขั้นตอนทั้งหมดเป็นตามลำดับดังนี้

  1. Get Problem
  2. Get data
  3. Cleansing data
  4. Feature Extraction
  5. Train model and evaluation
  6. Export Model
  7. Business evaluation

โดยสามารถดู code ประกอบคำอธิบายได้จาก link colab ด้านล่าง https://colab.research.google.com/drive/1QJVBRqK7MUY4rQo_bj0Vpcpllt7ktFoo?authuser=2#scrollTo=dJmwOw23Mri7

หลังจากเราได้หัวข้อปัญหาและชุดข้อมูลมาแล้ว (ขั้นตอนที่ 1) ขั้นตอนต่อไปเราจะเริ่มต้นด้วยการ import ข้อมูลเข้ามาก่อน (ขั้นตอนที่ 2) จากนั้นเลือกดึง column ข้อมูล original text และ score ออกมา (2.1) เพื่อนำไปใช้ในส่วนของการ cleansing data (ขั้นตอนที่ 3)โดยเราพบว่ามีข้อความคอมเม้นต์ที่ขาดหายไป 117 รายการ แต่เราละไว้เพราะเป็นสัดส่วนที่น้อยมากเทียบกับจำนวนคอมเม้นต์ทั้งหมด (403,379 คอมเม้นต์)

Import dataset to Colab

จากนั้นเริ่มเช็คว่ามีคอนเน้นต์ที่ซ้ำกันหรือไม่ (3.2) พบว่ามีส่วนข้อความคอนเม้นต์ที่ซ้ำกันบ้าง มีการเช็ค score ที่ได้ทั้งหมดเป็นอย่างไรบ้าง (3.3)

จากนั้นมีการสุ่มตัวอย่างคอมเม้นต์ช่วงที่ได้คะแนนดี และไม่ดี แล้วเปลี่ยน score 4&5 นั้นเป็น pos (positive) และ score 1&2 เป็น neg (negative) (3.4) และเช็คดูว่าในตัวอย่างที่สุ่มมานี้มีคอมเม้นต์ซ้ำกันบ้างหรือไม่ พบว่ามีเล็กน้อยบางส่วน

จากตัวอย่างที่สุ่มมาพบว่ามีบางคอมเม้นต์เป็นรูป emoji ซึ่งเราก็จะทำการเปลี่ยนตัวคอมเม้นต์ทั้งหมดให้เป็น string (3.5)
จากนั้นเป็นการเริ่มแบ่งชุดข้อมูลสำหรับการ train และ test (3.6) และ plot bar graph ดูพบว่าชุดข้อมูล train และ test มีจำนวน neg และ pos ใกล้เคียงกัน ก็เป็นอันใช้ได้ คาดว่า feature ที่ได้ออกมาน่าจะใช้ได้

ขั้นตอนที่ 4 เป็นการสกัด feature ออกมา โดยเนื่องจากชุดข้อมูลเป็นภาษาไทย เราจำเป็นต้องมีการ import libraly ที่ทำงานกับภาษาไทยได้มาด้วยในโปรเจคนี่เราใช้ pythainlp (https://thainlp.org/pythainlp/docs/2.0/index.html) ซึงจะสามารถสกัด token ที่เป็นภาษาไทยออกมาได้ จากนั้นเริ่มขั้นตอนการสกัด token จากคอมเม้นต์ลูกค้า (4.1)

token extraction from customer’s comments

หลังจากได้ token ออกมาแล้วเราจะทำการสร้าง bag of word เป็นการจัดกลุ่มจำแนกคำที่มีลักษณะคล้ายๆกันมาอยู่ด้วยกัน โดยจำแนกจาก score ซึ่งจะตั้งชื่อเรียก train_label (4.2)

จากนั้นเป็นการ clean รูปแบบ format ของคอมเม้นต์เพื่อให้ง่ายต่อการ extract feature โดยการตัดการขึ้นบรรทัดใหม่มาเป็นการเว้นวรรคแทน (4.3)

ทำการ Fit model (4.4) ทำการแปลง feature ที่ได้ให้อยู่มนรูปตัวเลข array

และทำการ normalize feature matrix เพื่อปรับ scale ข้อมูลให้อยู่ในช่วงที่เราต้องการ(4.5)

ขั้นตอนที่ 5 เป็นการ Train model and evaluation เรา import libraly Linear SVC เพื่อจะให้ model เรา train กับ libraly Support Vector Machine (SVM) โดยจะมี parameter 2 ตัวที่ใช้คือ feature token ที่แปลงเป็น array แล้ว และ train_label
โดยหลังจาก train แล้ว เราลอง plot heat map เพื่อทำการทดสอบผลลัพธ์ที่ได้จากสร้างโมเดล เพื่อเปรียบเทียบความถูกต้อง ตำแหน่งเลขแรกคือค่าที่ทำนาย ตำแหน่งเลขที่สองคือผลลัพธ์ที่แท้จริง โดย 0 = คำติ 1 = คำชม เราจะทราบสัดส่วนของผลลัพธ์ที่แท้จริงจากโมเดล เทียบกับผลลัพธ์จริง (5.1–5.3)

Heat map

จากนั้นดูค่า Accuracy ของ โมเดล precision, recall, f1-score, support โดยเราจะให้ความสำคัญกับ precision มากที่สุด
และทำการสั่งใช้งานโดยให้ model แสดงค่าการทำนาย (SVM_predict) และโชว์ผลลัพธ์ของการทำนายเทียบกับ score ที่ถูกจำแนกแล้ว (label pos or neg) พบว่ามีส่วนที่ทำนายผิดจำนวน 256 คอมเม้นต์จากจำนวน test_data 3,200 คอมเม้นต์

Predict_result ว่า model ทายถูกตรงกับ label จริงมากน้อยแค่ไหน

ขั้นตอนที่ 6 เป็นการ export model และ ลอง test กับคำคอมเม้นต์จริงดูว่า model อ่านค่าออกมาเป็น pos หรือ neg (6.1–6.2)

Export model และทดลองให้ model ทำงานอ่านค่าคอมเม้นต์ที่ใส่เข้าไป

ขั้นตอนที่ 7 เป็นการ apply model ที่ได้ กับคอมเม้นต์จริงทั้งหมดแล้วแสดงค่า comment ออกมาใน comment_type และจัดกลุ่ม comment_type ที่เป็น neg ออกมาว่าไปตกอยู่ในสินค้ากลุ่ม product category ใดบ้าง (7.1–7.2) ก็จะพบ Top 5 ของกลุ่ม product category เป็นกลุ่ม Small home appliances มากที่สุด รองลงมาเป็น Food & Beverage, Home & Living, Consumer Electronics และอันดับ 5 เป็น Mobiles & Tablets

การ Deploy API

จากนั้นทางทีมก็ทำการ Deploy API ของโมเดลที่สร้างขึ้นผ่าน heroku เพื่อให้ง่ายต่อการที่บุคคลทั่วไปสามารถเรียกใช้งานโดยผ่าน url ได้ โดยโมเดลสามารถทำนายใจความกว้างๆ (sentiment) ของ comment ได้ ตางlink ด่านล่าง

https://customer-nlp-api.herokuapp.com/get_result?keyword=%E0%B8%81%E0%B9%87%E0%B8%9E%E0%B8%AD%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B9%84%E0%B8%94%E0%B9%89

เพื่อนๆสามารถลองเล่นได้โดยเปลี่ยนข้อความหลังที่ต้องการทำนายหลังเครื่องหมายเท่ากับ (=) โดยเราสามารถพิมพ์ข้อความเข้าไปโมเดลก็จะสามารถทำนายได้ว่าไอเดียหรือใจความของ comment นั้นเป็น negative(neg) หรือ positive (pos) เช่น “แพ็กไม่ไดี”, “ก็พอใช้ได้” โมเดลสามารถทำนายได้ว่าเป็น pos, ส่วนตัวอย่างของ sentiment ในแนวลบเช่น “แม่ค้าตอบดี”, “ได้รับของเรียบร้อย”

บทสรุป

สรุปที่เราทำมาเป็นอย่างไร อธิบายจะพัฒนาต่อยอดได้อย่างไร นำไปใช้ประโยชน์อะไรได้อย่างไร
สรุปที่ทีมงานทำมาคือการลองทำแบบฝึกหัดสร้างโมเดลของการทำนาย sentiment ของ comment ที่ลูกค้ามีต่อสินค้าที่ซื้อผ่านแพลตฟอร์ม E-commerce และสามารถเรียกใช้งานผ่าน API ได้ โดยสามารถนำโมเดลมาประยุกต์ใช้ในการประเมินความรู้สึกโดยรวมที่ลูกค้ามีต่อตัวสินค้า หรือบริการของร้านค้าได้ว่าเป็นในแง่บวกหรือลบ และถ้ารู้แนวทางว่าเป็นลบก็จะได้สามารถปรับเปลี่ยนให้ทันถ่วงทีได้ เช่น แจ้งเตือนให้ปรับปรุงบริการของร้านค้าที่อยู่ในแพลตฟอร์ม หรือหากมีญหาที่การขนส่งสินค้าล้าช้า หรือสินค้าชำรุดจากการขนส่งก็สามารถแจ้งร้องเรียนปัญหาไปที่บริษัทขนส่งเพื่อที่จะรักษาฐานลูกค้าของแพลตฟอร์ม สร้างความประทับใจให้กับลูกค้า และสร้างความสามารถในการแข่งขันโดยรวมกับแพลตฟอร์มอื่นๆได้

ส่วนแนวทางการพัฒนาต่อยอดในอนาคตสำหรับโมเดลนี้คือจะให้สามารถวิเคราะห์ลงไปในรายละเอียดของ product category แบบละเอียดได้ ก็จะสามารถมีข้อมูลระบุได้ชัดเจนมากขึ้นหากลูกค้าไม่พอใจในสินค้าหนึ่งๆ ด้วยสาเหตุอะไร เพื่อหาทางปรับปรุงแก้ไขได้

--

--