Bài nghiên cứu này đi sâu vào lĩnh vực phân tích cảm xúc về phim, tận dụng dữ liệu từ các nguồn khác nhau để có cái nhìn sâu sắc về cảm nhận và cảm xúc của khán giả đối với các bộ phim..
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ - ĐẠI HỌC QUỐC GIA HÀ NỘI
===================
BÁO CÁO CHUYÊN ĐỀ CÔNG NGHỆ
Đề tài:
Comment Sentiment Analysis
NHÓM 6
-Nguyễn Đức Thành Nguyễn Hoàng Thọ Lại Đức Thắng Phạm Đức Trung
Trang 21 Giới thiệu
Phim ảnh là một loại hình nghệ thuật tổng hợp, được thể hiện bằng hình ảnh kết hợp với âm thanh, đôi khi là một số hình thức kích thích giác quan khác; được lưu trữ trên một số dạng thiết bị ghi hình để phổ biến tới công chúng qua các phương tiện kỹ thuật khác nhau Từ lâu, phim nói chung đã trở thành một ngành công nghiệp giải trí quan trọng, là một công cụ hữu ích, gần gũi để từ đó gửi đi những ý kiến, thông điệp, tạo ra tác động lớn tới người xem cũng như xã hội Có nhiều yếu tố để quyết đinh một bộ phim có thành công hay không Một trong số đó là những ý kiến, phản ứng của khán giả Bài nghiên cứu này đi sâu vào lĩnh vực phân tích cảm xúc về phim, tận dụng dữ liệu từ các nguồn khác nhau
để có cái nhìn sâu sắc về cảm nhận và cảm xúc của khán giả đối với các bộ phim
1.1 Động lực
Trang 3Động lực chính của bài ngiên cứu này bắt nguồn từ vai trò của cảm xúc khản giả đối với một bộ phim Bằng việc phân tích cảm xúc được thể hiện trên các bài đánh giá, bình luận, v.v của người xem, các nhà làm phim, nhà phân phối, v.v có thể rút ra được những thông tin hữu ích, quý giá, hỗ trợ việc ra các quyết định, từ chiến lược sản xuất cho tới tiếp thị
1.2 Đặt vấn đề
Mặc dù dữ liệu về cảm xúc của khán giả đối với các bộ phim là rất phong phú, tuy nhiên đúc rút ra những thông tin hữu ích vẫn gặp nhiều khó khăn Việc có nhiều nguồn dữ liệu khác nhau có thể khiến cho những thông tin rút ra được trở nên không nhất quán, thiếu chính xác Không những vậy, các bình luận, đánh giá của người xem về một bộ phim hay các trailer của bộ phim đó có thể chứa nhiều sự phức tạp, đòi hỏi phải có các kỹ thuật phát triển mới có thể xử lý được
1.3 Câu hỏi nghiên cứu
Trang 4Từ dữ liệu cảm xúc của người xem đối với trailer của các bộ phim, câu hỏi nghiên cứu chính được đặt ra đó là: Có thể sử dụng các thông tin rút ra được từ những dữ liệu trên để dự đoán xem một bộ phim có thành công trong việc thu hút khán giả và đạt doanh thu cao so với các chi phí
đã bỏ ra hay không Từ câu trả lời cho câu hỏi trên, các bên liên quan của các bộ phim có thể đưa ra những quyết định, chiến lược đúng đắn, góp phần tạo nên sự thành công của các bộ phim
2 Materials and Methods
2.1 Python
Python là một ngôn ngữ lập trình được sử dụng rộng rãi trong các ứng dụng web, phát triển phần mềm, khoa học dữ liệu và máy học (ML) Các nhà phát triển sử dụng Python vì nó hiệu quả, dễ học và có thể chạy
Trang 5trên nhiều nền tảng khác nhau Phần mềm Python được tải xuống miễn phí, tích hợp tốt với tất cả các loại hệ thống và tăng tốc độ phát triển
2.2 NLTK
Tiền xử lí dữ liệu là giai đoạn rất quan trọng, hay nói cách khác đây
là công đoạn làm sạch văn bản Việc văn bản được làm sạch giúp cách thuật toán có thể trích xuất được những đặc trưng tốt nhất từ đó nâng cao hiệu quả, chất lượng của các mô hình, thuật toán
Thư viện NLTK - Natural Language Toolkit là một trong những thư viện open-source xử lí ngôn ngữ tự nhiên Được viết bằng Python và với ưu điểm là dễ dàng sử dụng nên thư viện này ngày càng trở nên phổ biến và có được một cộng đồng lớn mạnh Thư viện cung cấp hơn 50 kho dữ liệu văn bản khác nhau (corpora) và nhiều chức năng để xử lí dữ liệu văn bản để phục vụ cho nhiều mục đích khác nhau
Trang 63 Experiments and Results
3.1 Experiment setup
Việc đầu tiên là chuẩn bị Dataset cho phấn tích dữ liệu Vì chủ đề phân tích phản hồi của người xem về một bộ phim sắp ra mắt nguồn dữ liệu được nhóm lựa chọn là phần bình luận của trailer các video trailer cho
một bộ phim Từ những phản hồi của người xem về trailer, chúng ta sẽ biết được nhiều thông tin về cảm nghĩ, mong đợi của viewer
Trang 7Dùng Python, nhóm đã quét và thu thập được 860 bình luận từ phần bình luận của video trailer cho phim “Nimona” trên Youtube
(https://www.youtube.com/watch?v=f_fuHRyQbOc)
Trang 83.2 Cleaning and Analysing
A, Xử lý dữ liệu nâng cao
Xử lý dữ liệu bao gồm những công việc như loại bỏ từ dừng, loại bỏ những ký tự đặc biệt hay đường link để có thể phân tích chính xác hơn Sau
đó văn bản được chuyển về dạng viết thường, Tokenization, Stemming và Lemmatization để phân tích dữ liệu rõ hơn
Khai báo package Python
import re
import numpy as np
import pandas as pd
import nltk
Đọc file và tạo cột dữ liệu detail để xử lý
df = pd.read_csv( 'FLAT.csv' , encoding_errors = 'ignore' )
df[ 'detail' ] = df[ 'comment' ]
Trang 9df[ 'detail' ] = df[ 'detail' ].str.lower()
df.tail()
Tạo set chứa từ dừng trong tiếng Anh
clean_word = [ 'a' , 'about' , 'above' , 'after' , 'again' , 'ain' , 'all' , 'am' , 'an' , 'and' , 'any' , 'are' , 'as' , 'at' , 'be' , 'because' , 'been' , 'before' , 'being' , 'below' , 'between' , 'both' , 'by' , 'can' , 'd' , 'did' , 'do' , 'does' , 'doing' , 'down' , 'during' , 'each' , 'few' , 'for' , 'from' ,
'further' , 'had' , 'has' , 'have' , 'having' , 'he' , 'her' , 'here' ,
'hers' , 'herself' , 'him' , 'himself' , 'his' , 'how' , 'i' , 'if' , 'in' , 'into' , 'is' , 'it' , 'its' , 'itself' , 'just' , 'll' , 'm' , 'ma' ,
'me' , 'more' , 'most' , 'my' , 'myself' , 'now' , 'o' , 'of' , 'on' , 'once' , 'only' , 'or' , 'other' , 'our' , 'ours' , 'ourselves' , 'out' , 'own' ,
're' , 's' , 'same' , 'she' , "shes" , 'should' , "shouldve" , 'so' , 'some' , 'such' ,
't' , 'than' , 'that' , "thatll" , 'the' , 'their' , 'theirs' , 'them' , 'themselves' , 'then' , 'there' , 'these' , 'they' , 'this' , 'those' , 'through' , 'to' , 'too' , 'under' , 'until' , 'up' , 've' , 'very' , 'was' , 'we' , 'were' , 'what' , 'when' , 'where' , 'which' , 'while' , 'who' , 'whom' , 'why' , 'will' , 'with' , 'won' , 'y' , 'you' , "youd" , "youll" , "youre" , "youve" , 'your' , 'yours' , 'yourself' , 'yourselves' ]
cleaner = set (clean_word)
Trang 10Loại bỏ từ dừng
def cleaning(text):
return " " join([word for word in str (text).split() if word not in cleaner])
df[ 'detail' ] = df[ 'detail' ].apply( lambda text: cleaning(text))
df.head()
Loại bỏ dấu câu
import string
english_punctuations = string.punctuation
punctuations_list = english_punctuations
def cleaning_punctuations(text):
translator = str maketrans( '' , '' , punctuations_list)
return text.translate(translator)
df[ 'detail' ]= df[ 'detail' ].apply( lambda x: cleaning_punctuations(x))
df.tail()
Loai bỏ từ lặp
def cleaning_repeating_char(text):
return re.sub( r'(.)1+' , r'1' , text)
Trang 11df[ 'detail' ] = df[ 'detail' ].apply( lambda x: cleaning_repeating_char(x)) df.tail()
Loại bỏ đường link
def cleaning_URLs(data):
return re.sub( '((www.[^s]+)|(https?://[^s]+))' , ' ' , data)
df[ 'detail' ] = df[ 'detail' ].apply( lambda x: cleaning_URLs(x))
df.tail()
Loại bỏ số
def cleaning_numbers(data):
return re.sub( '[0-9]+' , '' , data)
df[ 'detail' ] = df[ 'detail' ].apply( lambda x: cleaning_numbers(x))
df.tail()
Tokenize
from nltk.tokenize import word_tokenize
df[ 'detail' ] = df[ 'detail' ].apply( lambda x: word_tokenize(x))
df.head()
Trang 12Đưa tử về dạng gốc trước khi được chia
st = nltk.PorterStemmer()
def stemming_on_text(data):
text = [st.stem(word) for word in data]
return data
df[ 'detail' ] = df[ 'detail' ].apply( lambda x: stemming_on_text(x)) df.head()
Lemmatization
Đưa từ về gốc từ của nó
lm = nltk.WordNetLemmatizer()
def lemmatizer_on_text(data):
text = [lm.lemmatize(word) for word in data]
return data
df[ 'detail' ] = df[ 'detail' ].apply( lambda x: lemmatizer_on_text(x)) df.head()
B, Đánh giá quan cảm của bình luận
Trang 13Việc khai thác dữ liệu ý kiến (Opinion Mining) là kỹ thuật được sử dụng để xác định quan cảm, cảm xúc trong một dữ liệu văn bản Bình luận trên Youtube là nơi người xem thể hiện đánh giá của mình với nội dung video đó
Khai báo package Python
Trong đó:
- nltk.sentiment.vader là package công cụ phân tích quan cảm
import numpy as np
import pandas as pd
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import matplotlib.pyplot as plt
Tạo object SentimentIntensityAnalyzer
sia = SentimentIntensityAnalyzer()
Đọc file dữ liệu
df = pd.read_csv( 'FLAT.csv' , encoding_errors = 'ignore' )
Trang 14Thêm dữ liệu điểm đánh giá
Tạo các cột dữ liệu liên quan đến điểm tổng thể, điểm tích cực, điểm tiêu cực
df[ 'scores' ] = df[ 'comment' ].apply( lambda body: sia.polarity_scores( str (body))) df.head()
df[ 'compound' ] = df[ 'scores' ].apply( lambda score_dict:score_dict[ 'compound' ]) df.head()
df[ 'pos' ] = df[ 'scores' ].apply( lambda pos_dict:pos_dict[ 'pos' ])
df.head()
df[ 'neg' ] = df[ 'scores' ].apply( lambda neg_dict:neg_dict[ 'neg' ])
df.head()
Phân loại tính chất bình luận
Tạo cột dữ liệu tên “type”, dùng để phân loại tính chất của binh luận:
- POS: Tích cực
- NEG: Tiêu cực
- NEUTRAL: Trung tính df[ 'type' ]= ''
df.loc[df.compound> 0 'type' ]= 'POS'
df.loc[df.compound== 0 'type' ]= 'NEUTRAL'
Trang 15df.loc[df.compound< 0 'type' ]= 'NEG'
df.head()
Đếm số lượng bình luận theo tính chất
len=df.shape
(rows , cols)=len
pos= 0
neg= 0
neutral= 0
for i in range ( , rows):
if df.loc[i][ 5 ]== "POS" :
pos=pos+ 1
if df.loc[i][ 5 ]== "NEG" :
neg=neg+ 1
if df.loc[i][ 5 ]== "NEUTRAL" :
neutral=neutral+ 1
print ( "Positive :" + str (pos) + " Negative :" + str (neg) + " Neutral :" +
str (neutral))
Tạo biểu đồ
Trang 16plt.hist(df[ 'compound' ])
plt.title( "Histogram" )
plt.show()
print ( "Average Positive: " , df[ 'pos' ].mean() , " \n "
print ( "Average Negative: " , df[ 'neg' ].mean() , " \n "
print ( "Average Compound: " , df[ 'compound' ].mean() , " \n "
Trang 173.3 Results
Sau khi đã làm sạch dữ liệu và tiến hành phân tích, chúng ta thu được
bảng kết quả và biểu đồ sau:
Trang 184 Discussion
Chúng ta sẽ đánh giá sentiment của một bình luận bằng giá trị của bình luận sau khi phân tích Giá trị này bắt đầu từ -1 đến 1, trong đó giá trị -1 đại diện cho vô cùng tiêu cực, 0 cho trung tính và 1 cho vô cùng tích cực Biểu
đồ kết quả trên cho ta một cái nhìn tổng quan và rõ ràng về số lượng bình luận từ giá trị -1 đến 1 Từ biểu đồ ta hoàn toàn có thể tạo một công cụ đánh giá phản hồi của người xem theo hệ thống star rating (từ 1 đến 5 sao)
Nhìn vào kết quả của phân tích dữ liệu, ta thấy rằng 64% các bình luận
là tích cực, 21% trung tính và 15% tiêu cực Sau khi tính giá trị trung bình
Trang 19của toàn bộ 860 bình luận, ta thu được giá trị cho toàn bộ phần comment trailer của bộ phim (0.354-Tích cực) Từ đó ta đánh giá rằng bộ phim nhận được nhiều phản hồi tốt từ người xem, dự đoán được rằng bộ phim sẽ thành công và nhận được sự yêu thích khi ra mắt Ngược lại, những bộ phim có phản hồi tiêu cực nhiều thể hiện rằng bộ phim không có chất lượng tốt, không nhận được sự ủng hộ nhiều từ người xem khiến bộ phim thất bại và
sẽ không đạt đủ doanh thu Ngoài ra, những bộ phim có đa số bình luận trung tính không chỉ báo động sự không thành công mà còn cho ta thấy rằng bộ phim không có ấn tượng gì với khán giả và sẽ dễ bị lãng quên trong làn giải trí