1. Trang chủ
  2. » Luận Văn - Báo Cáo

nhập môn khoa học dữ liệu báo cáo cuối kì Đề tài phân tích bình luận Để Đánh giá chất lượng sách

15 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Phân Tích Bình Luận Để Đánh Giá Chất Lượng Sách
Tác giả Vũ Thành Luõn, Nguyễn Hoàng Nam, Phụng Bỏ Tựng
Người hướng dẫn Vũ Hoài Nam
Trường học Học Viện Công Nghệ Bưu Chính Viễn Thông
Chuyên ngành Khoa Học Dữ Liệu
Thể loại Báo Cáo Cuối Kỳ
Năm xuất bản 2024
Thành phố Hà Nội
Định dạng
Số trang 15
Dung lượng 1,91 MB

Nội dung

Nắm bắt được nhu cầu thiết yêu này của xã hội, chúng em đã ứng dụng thu thập đữ liệu và sử dụng học sâu phân tích và đưa ra kết quả nhằm đưa tới cho mọi người gợi ý chính xác nhất về từn

Trang 1

HQC VIEN CONG NGHE BUU CHINH VIEN THONG KHOA CONG NGHE THONG TIN 1

NHAP MON KHOA HOC DU LIEU BAO CAO CUOI Ki

ĐÈ TÀI: Phân tích bình luận để đánh giá chất lượng sách

Giảng viên hướng dẫn: Vũ Hoài Nam Nhóm môn học: 02

Nhóm bài tập lớn: 08 Sinh viên : Vũ Thành Luân —- B21DCCN502

Nguyễn Hoàng Nam — B2IDCCN551

Phùng Bá Tùng - B21DCCN776

Hà Nội 11/2024

Trang 2

Phan 1: Phan tich tong quan

1.1 Giới thiệu chung

Sách đóng vai trò quan trọng trong cuộc sống, và đọc sách là thói quen tốt cần duy trì Tuy

nhiên, không phải sách nào cũng phù hợp đề đọc Việc lựa chọn sách cân được thực hiện can

thận

Đọc sách giúp bố sung kiến thức vả phát triên tình cảm Tuy nhiên, kiến thức và cảm xúc đó can phải phù hợp với lứa tuổi của người đọc Đối với học sinh cấp một, việc học toán và văn cần tập trung vào những kiến thức cơ bản Còn học sinh cấp hai, với tư duy phức tạp hơn, có thể nâng cao khả năng giải toán đa thức và viết văn sâu sắc Chọn sách phải đồng điệu với khả năng và nhận thức của từng độ tuôi Việc đọc những tác phâm không phủ hợp có thê gây hiệu

ứng tiêu cực, làm mat hứng thú hoặc tạo ra tỉnh cảm tiêu cực

Nắm bắt được nhu cầu thiết yêu này của xã hội, chúng em đã ứng dụng thu thập đữ liệu và sử dụng học sâu phân tích và đưa ra kết quả nhằm đưa tới cho mọi người gợi ý chính xác nhất về từng quyền sách thông qua những đữ liệu được cung cấp từ nhiều độc giả Từ đó có thê đưa ra

lựa chọn chính xác trong việc lựa chọn trị thức

1.2 Phân tích bài toán

- Tên bải toán: Phân tích bình luận đề đánh giá chất lượng sách

- _ Mục tiêu: Dựa vảo các thông tin có trong bình luận về một quyên sách bất kì về phong

cách viết; cốt truyện; độ dài; nhân vật, đê đưa ra đánh giá về sản phẩm sách đó

- - Phương pháp:

- Output

- Cac bude tiến hành

Xử lý đữ liệu thô Giản nhãn đữ liệu

Trích xuất đặc trưng:

Phân loại dữ liệu

Đánh giá mô hình:

Phan 2: Thu thập dữ liệu

2.1 Công cụ hỗ trợ

2.1.1 BeautifulSoup

- Là một thư viện Python phô biến được sử dụng trong việc web scraping (thu thap dir liệu từ trang web) và parsing HTML/XML (phan tích cú pháp HTML/XML) No giup

dễ dàng làm việc với các tải liệu HTML hoặc XML phức tạp, cho phép trích xuất thông tin hữu ích từ chúng một cách nhanh chóng và hiệu quả

-Tinh nang:

+) Dễ sử dụng:BeautifulSoup cung cấp một API đơn giản và đễ hiểu, giúp nhanh chóng truy xuất các phần tử trong trang HTML hoặc XML mà không cần phải hiệu sâu về cú pháp phức tạp của các tai liệu nay

Trang 3

+) Xử lý dữ liệu HTML/XML:Nó hỗ trợ phân tích cú pháp các tài liệu HTML

và XML không hợp lệ (broken HTML), và tự động sửa chữa các lỗi cầu trúc trong các tài liệu này

+) Duyệt qua cây DOM: BeautifilSoup giúp duyệt qua cấu trúc cây DOM (Document Object Model) của tải liệu HTML, tìm kiếm va trích xuất các phan

tir can thiết như thẻ HTML, thuộc tính của thẻ, văn bản, v.v

+) Hỗ trợ nhiều parser: BeautifulSoup có thể sử dụng nhiều parser (trình phân tích cú pháp), bao gôm html.parser (mặc định trong Python), Ixml, và html5lib, giúp bạn lựa chọn parser phù hợp với yêu cầu và môi trường của bạn +)Kết hợp với các công cụ khác: BeautifulSoup thường được sử dụng kết hợp với requests (hoặc urllib) đề tải các trang web và trích xuất dữ liệu

2.1.2 API tir Tiki

- Ngoài việc thu thập đữ liệu bằng cách scraping, c6 thé Tiki cung cap API cho phép truy xuất các bình luận hoặc thông tin sản phẩm, giúp dễ dàng và chính xác hơn trong

việc thu thập dữ liệu

2.2 Thu thập đữ liệu

- Nguồn dữ liệu: Dữ liệu được thu thập từ website TIkI, cụ thể là các bình luận của

người dùng về các sách Đây là một dạng dữ liệu văn bản (text data) liên quan đến đánh giá và cảm nhận của người dùng về các sản phẩm sách

- Thu thập các file như eđề chuẩn bị cho quá trình xử lý đữ liệu thô ở phần 3 2.3 Lưu trữ:

- Sau khi thu thập các bình luận, dữ liệu sẽ được lưu trữ dưới dạng CSV Dữ liệu này

có thê chứa các trường như username, rating, comment_ text, và có thê là các thông tin khác liên quan đến đánh giá của người dùng

Phân 3: Xử lý dữ liệu thô

3.1 Công cụ hỗ trợ

3.1.1 PyVi

- Là một thư viện Python được sử dụng đê nhận dạng và phân tích văn bản tiếng Việt, bao gồm việc tách từ, gán nhãn từ loại (POS tagging), phân tích cú pháp và phân tích ngữ nghĩa Thư viện này sử dụng các mô hình học máy và quy tắc ngữ pháp đề xử lý tiếng Việt, nhằm giúp các ứng dụng NLP (Xử lý ngôn ngữ tự nhiên) hoạt động hiệu quả hơn với ngữ liệu tiếng Việt

- Tính năng:

+}Tách từ (Word sepgmentation): Phân chia một câu hoặc đoạn văn thành các từ

riêng biệt

+)Gan nhan tr loai (POS tagøing): Phân loại từ trong câu vào các nhóm như

danh từ, động từ, tính từ, v.v

+)Phân tích cú pháp (Syntax parsing): Xây dựng cấu trúc cú pháp của câu đề hiệu cách các thành phần trong câu liên kết với nhau

Trang 4

3.2 Xử lý đữ liệu

*) Chuẩn hóa văn bản:

- Hàm concat_word_iđiom: Chuyên đối một danh sách các câu thành định dạng mà mỗi từ trong câu được nói bằng ký tự gạch dưới (_), đồng thời loại bỏ các ký tự không phải chữ cái hoặc khoảng trắng

def concat_word_idiom(text_1ist) :

corpus = []

for i in range(len(text_11st)) :

review = re.sub('[*\w\s*]', ' ',text_list[i]).lower().split() review = ‘_' join(review)

corpus append( review)

return corpus +) Loại bỏ ký tự đặc biệt khỏi mỗi câu trong danh sách

+) Chuyên toàn bộ chữ cái thành chữ thường

+) Ghép các từ trong mỗi câu bằng ký tự _

+) Kết quả: Một danh sách các câu đã chuyên đôi

- Ham pre_progcessing idiom_ data: Tiền xử lý một danh sách van ban, bao g6m lam sạch dữ liệu và chuân hóa băng cách tách từ với công cụ Vĩ lokenIzer

def pre_progcessing idiom data(text_list):

corpus = []

for i in range(len(text_list)):

review = re.sub("[^\w,\s]', ' ', text _1ist[i]) review = review lower()

review = ViTokenizer.tokenize(review) review = review.split()

review = ° ‘.join(review) corpus append(review)

return corpus

+) Loại bỏ các ký tự không phải chữ cái, dấu phây hoặc khoảng trắng +) Chuyên toàn bộ chữ thành chữ thường

+) Sử dụng ViTokenizer đề tách từ

Trang 5

+) Kết quả: Danh sách các câu đã được token hóa

- Hàm translate_text: Dịch một đoạn văn bản từ ngôn ngữ gốc sang một ngôn ngữ đích

(mặc định là tiếng Việt)

def translate text(text, target_language='"vi'):

translator = Translator()

translation = translator.translate(text, dest=target_language)

return translation.text

+) Sử dụng thư viện googletrans đề thực hiện dịch tự động

+) Kết quả: Văn bản dịch sang ngôn ngữ đích

- Ham pre _progcessing_text_data: Tiền xử lý danh sách văn bản (Loại bỏ ký tự không

can thiet, Chuan hóa các từ viết tắt, Thay thê các thành ngữ, Dịch các từ tiếng Anh) def pre_progcessing text_data(text_list):

en_word list = wordnet.words() corpus = []

for i in range(len(text_list)):

review = re.sub(r'(.)\1+', r'\1', review) review = review lower()

review = ViTokenizer.tokenize(review) for j in range(viet_tat.shape[9]):

1f viet tat['VietTat'][7J] in review:

review = review.split(viet_tat[ 'VietTat" ][7])

1f thanh_ngu[ 'thanh_ ngu" ][J] in review:

review = review.split(thanh_ngu[ 'thanh_ngu' ][7])

corpus append(review) return corpus

+) Làm sạch văn bản: Loại bỏ ký tự không cần thiết, giảm ký tự lặp lại (ví dụ: kooooo thành ko)

+) Chuan hoa: Tach từ bằng VĩTokenizer, Thay thế từ viết tắt bằng cụm từ đầy

du tir bang viet_tat Thay thế thành ngữ bằng cụm từ tương ứng từ bảng thanh ngu

+) Kết quả: Trả về danh sách câu đã xử lý

Trang 6

Phần 4: Gán nhãn đữ liệu

4.1 Gán nhãn dữ liệu

- Dựa trên sô sao của bình luận Nêu bình luận có đánh giá sao là 1-2 sao, nó sẽ được gan nhãn là tiêu cực, còn 4-5 sao sẽ được gản nhãn là tích cực

4.2 Sử dụng GPT để gán nhãn:

- Có thê sử dụng mô hình GPT (hoặc các mô hỉnh học sâu khác) dé phân tích nội dung bình luận và tự động gan nhãn tích cực hoặc tiêu cực, mặc dù một cách đơn giản hơn

70394

70395

70396

là dựa vào sô sao

3 Mét chiéc bj bep/gap lai và thậm chí sau khi 0 2 8

Phần 5: Trích xuất đặc trưng

5.1 RNN

- Mang no-ron hồi quy (RNN) là một mô hình học sâu được đào tạo để xử ly và

process len_content

giao nhanh lâm lai dung lịch nữa tiki đã cai_t

truyện rất dễ_thương đọc tử nhiều nam truéc_na

truyện thỉ quá quen_thuộc phổ biến nên đánh gi

câu_ chuyện thú_vị chứa_đựng nhiều bải_học quý

thi khả ưng_ÿ nhưng phản bia ngoải lại rất nhi

chiếc bị bẹp gập lại thậm_ chí sau khi mở ra nó

sản phẩm đóng gõi kĩ cảng dây hơn nghĩ rất hảo

theo ÿ_ kiến tôi the chosen câu_chuyện hay nhưn

nhìn bắt_mắt tem nhà xuất_bản chống giả lại gi

dong_goi can_than giao rat rat nhanh god job

chuyén đổi đầu vào đữ liệu tuần tự thành đầu ra đữ liệu tuần tự cụ thẻ

5.1.1.SimplerRNNCell

Dinh nghĩa một đơn vị RNN cơ bản

class SimpleRNNCell(tf.keras.layers.Layer):

self.rnn units = rnn units self.state size = [rnn units]

self.w xh = self.add_weight(shape-(input_dim, rnn_units),initializer-='glorot_uniform', trainable-=True) self.W_hh = self.add_weight(shape=(rnn_units, rnn_units),initializer=‘orthogonal’, trainable=True)

self.b_h = self.add_weight(shape=(rnn_units,), initializer='zeros', trainable=True)

def call(self, inputs, states):

prev state = states[9]

h = tf.tanh(tf.matmul(inputs, self.W xh) + tf.matmul(prev_state, self.wW hh) + self.b h) return h, [h]

+) W_xh: Trọng số từ đầu vào đến hidden state

+) W_hh: Trọng số giữa các hidden state

+) b_h: Bias khởi tạo bằng 0

43

54

Trang 7

+) Hàm call thực hiện việc tính toán trạng thái ấn mới (h) tại mỗi bước thời gian (time step) dua trén dau vao (inputs) và trạng thái ân trước đó (prev_state)

+) Công thức tính toán trạng thái ân mới:

h = tf.tanh(tf:matmul(inputs, self.W_xh) + tfmatmul(prev_state, self W_hh) + self.b h

5.12_ Mô hình RNN

rnn_model = Sequential()

rnn_model.add(Embedding(input_ dim=len(dictionary)+1, output_din=128))

rnn_model.add(RNN(SimpleRNNCell(32, 128)))

rnn_model.add(Dense(12, activation='softmax" ))

rnn_mode1.compi 1e(optimizer='"adam", 1oss="categorical_crossentropy", metrics=[ "accuracy ' ])

*)Embedding:

- Chuyên đổi các token (số nguyên) thành vector nhúng (embedding vector) có chiều

128

- input_dim=len(dictionary)+1: Số lượng từ trong từ điền

- output_dim=128: Kích thước vector nhúng

*)RNN(SimpleRNNCell(32, 128)):

- Áp dụng một lớp RNN với SimpleRNNCell ty định nghĩa

- 32: Sé lugng don vi RNN (units)

- 128: Kich thước đầu vào

*)Dense(12, activatlon='softmax'):

- Lớp đầu ra với 12 lớp (ứng với 12 nhãn trong bai toán)

- Sử dụng hàm kích hoạt softmax đề dự đoán xác suất

5.13 Huấn luyện mô hình

rmn_model.compie(optimizer='adam", loss='categorical crossentropy", metrics=[ "accuracy' ])

callback = myCallback()

rnn_history = rnn_model.fit(x_train, y train, batch_size=256, epochs=300, validation _data=(x_test, y test), callbacks=callback)

- optimizer=adam': Sử dụng thuật toán tôi ưu Adam

- loss='categorical_crossentropy': Ham mat mat phu hop voi bai toán phân loại đa nhãn

- metrics=['accuracy']: Theo dõi độ chính xác trong quá trình huấn luyện

Trang 8

- callback=[myCallback()]: Sw dung callback dé dimg s6m hoac kiém tra độ chính xác toi da

5.1.4 Đánh giả mô hình

conf_matrix = confusion matrix(y_test_, y_pred_rnn)

sns.heatmap(conf_matrix, annot=True, cmap='Greens', fmt='g', cbar=False)

- confusion_matrix: Ma tran thể hiện sự dự đoán chính xác hoặc sai giữa các nhãn

- sns.heatmap: Vẽ biêu đồ trực quan cho ma trận

o wo oO

5.2 LSTM

- LSTM là một loại mạng nơ-ron hỏi quy (RNN) được thiết kế đặc biệt đê giải quyết vấn

dé vanishing gradient mà các mạng RNN truyền thống gặp phải khi xử lý dữ liệu chuỗi dài LSTM có khả năng duy trì thông tin lâu đài và kiểm soát cách thông tin được lưu trữ

và truyền qua các bước thời gian, nhờ vảo cơ chế gọi là các công (gates)

5.2.1 LSTMCell

Trang 9

def _init_ (self, lstm_units, input_dim):

self.1stm units = 1stm units

# Cống quên

self.W_f = self.add_weight(shape=(input_dim + 1stm units, 1stm units),initializer='glorot_uniform' ,trainable=True) self.b_f = self.add_weight(shape=(1stm_units,), initializer='zeros'„trainable=True)

# Cống nhập

self.W_i = self.add_weight(shape=(input_dim + 1stm units, 1stm units), initializer='glorot_uniform' ,trainable=True) self.b_i = self.add_weight(shape=(lstm_units,), initializer='zeros',trainable=True)

# Cống cập nhật

self.W_c = self.add_weight(shape=(input_dim + 1stm units, 1stm units),initializer='glonot_uniform' ,trainable=True) self.b_c = self.add_weight (shape=(lstm_units,), initializer="zeros' ,trainable=True)

# Cống đầu ra

self.W_o = self.add_weight(shape=(input_dim + lstm_units, 1lstm_units) ,initializer='glorot_uniform' , trainable=True) self.b_o = self.add_weight (shape=(1stm_units,),initializer='zeros', trainable=True)

def call(self, inputs, states):

h_prev, c_prev = states

# Kết hợp đầu vào và trạng thai ẩn trước đó

x_h = tf.concat([inputs, h prev], axis=-1)

# Cổng quên

f = tf.sigmoid(tf.matmul(x_h, self.W f) + self.b f)

# Cổng nhập

1 = tf.sigmoid(tf.matmul(x h, self.W 1) + self.b 1)

# Cổng cập nhật

c_ = tf.tanh(tf.matmul(x h, self.W c) + self.b c)

# Cap nhật 0 trang thai

=f * c prev+i * c_

# Cổng dau ra

= tf.sigmoid(tf.matmul(x_h, self.W_o) + self.b 0)

# Trang thai an tiép theo

h = o * tf.tanh(c)

return h, [h, c]

- W_f, W_i, W_c, W_o: Cac trọng s số này dùng dé tính toán các công quên, nhập, cập nhật và đầu ra Kích thước của mỗi trọng so nay la (input_ dim + Istm _units, Istm_units), voi input_dim 1a số lượng đặc trưng đầu vào và lstm_units là số lượng đơn vị LSTM (hay số chiều của trạng thái an)

- bfbibc,bo: Các bias được khởi tạo với giá trị bằng 0

- add_weight: phương thức đề tạo ra trọng số và bias, và tham số trainable=True cho phép các trọng số này được huấn luyện trong quá trình huấn luyện mô hình

thực hiện công việc "nhớ" và "quên" thông qua các công:

Trang 10

đầu vào tại bước thời gian hiện tại inputs va trạng thái ân của bước thời gian trước đó h_prev được kết hợp lại (nối lại theo chiều đọc) Điều này cho phép LSTM sử dụng thông tin từ cả đầu vào hiện tại và trạng thái ân trước đó:

x_h=tf.concat([inputs, h_prev], axis=-1)

- Céng quén (f): Céng nay quyet dinh phan nao cua trang thai 6 (cell state) trước đó sẽ

bị loại bỏ Đầu vào của công quên là sự kết hợp giữa đầu vào và trạng thái ân trước đó, qua một phép nhân với trọng số W_fvà cộng với bias b_£ Hàm kích hoạt của công nay la ham sigmoid, đưa ra một giá tri trong khoang [0, 1]

f = tf.sigmoid(tf:matmul(x_h, self.W_f) + self.b_f)

- Céng nhap (i): Quyết định phân nảo của trạng thải ô mới sẽ được ghi vào trạng thái ô Tương tự như công quên, đầu vào của công nhập cũng là sự kết hợp của đầu vào và trạng thái ân, nhưng trọng số và bias khác nhau

1=tfsigmoid(tfimatmul(x_h, self.W_1i) + self.b_1)

- Céng cap nhat (c_): Công cập nhật giúp tính toán giá trị mới của trạng thái ô (cell state) Dau vào của công này là sự kết hợp giữa đầu vào và trang thai an, và giá trị được tính thông qua một phép nhân với trọng số W_c và cộng với bias b_c Hàm kích hoạt của công này là tanh

c_=tftanh(t£matmul(x h, self.W_c) + self.b_c)

- _ Công đầu ra (o): Công đầu ra quyết định phân nào của trạng thái 6 sé ảnh hưởng đến trạng thái ân hiện tại Tính toán tương tự như các công trên, với trong so W_o va bias b_o, sử dụng ham kich hoat sigmoid

o = tf.sigmoid(tfmatmul(x_h, self.W_o) + self.b_o)

- Cap nhật trạng thai 6 (c): Trang thai 6 mới c được tính bằng cách kết hợp công quên

và công nhập, cho phép mạng LSTM "quên" một phần thông tin cũ và "ghi" thông tin

mới vảo trạng thải ô

c=f*c prev +1*

- Tinh trang thai an (h): Trạng thái ân mới h được tính bằng cách nhân công đầu ra với tanh(c), tức là áp dụng hàm tanh lên trạng thái 6 mới c và sau đó nhân với công đầu ra

h=o * tftanh(c)

5.2.2 Xây dựng mô hình

1stm_model.add(Embedding(input_dim=len(dictionary)+1, output_dim=128)) 1stm_model.add(RNN(LSTMCell(32, 128)))

lstm_model.add(Dense(12, activation='softmax' ))

M6 hinh LSTM duoc xay dung sử dụng lớp 1sTMce11 đã được định nghĩa ở trên

- Embedding: Lop nay chuyên đối các từ thành vector nhúng, với input_dim là số lượng

từ trong từ điển và output_dim=128 là chiêu của không gian nhúng

Ngày đăng: 16/02/2025, 15:07

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN