Tải bản đầy đủ (.pdf) (22 trang)

Phân tích xu hướng hành vi mua sắm dựa vào bộ dữ liệu tweet trên twitter

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (413.85 KB, 22 trang )

lOMoARcPSD|17343589

BỘ GIÁO DỤC VÀ ĐÀO TẠO

ĐẠI HỌC KINH TẾ TP HỒ CHÍ MINH
TRƯỜNG CƠNG NGHỆ VÀ THIẾT KẾ


ĐỒ ÁN MƠN HỌC
ĐỀ TÀI:

PHÂN TÍCH XU HƯỚNG HÀNH VI MUA SẮM DỰA VÀO BỘ DỮ
LIỆU TWEET TRÊN TWITTER
Học phần: XỬ LÝ NGÔN NGỮ TỰ NHIÊN
Nhóm Sinh Viên:
1.
2.
3.
4.

BÙI THÀNH CƠNG
LÊ ĐỨC DŨNG
LÊ TRUNG NGUYÊN
TRẦN MẠNH TƯỜNG

Chuyên Ngành: KHOA HỌC DỮ LIỆU
Khóa: K46

Giảng Viên: TS. Đặng Ngọc Hồng Thành

TP. Hồ Chí Minh, Ngày 15 tháng 12 năm 2022




lOMoARcPSD|17343589

MỤC LỤC
MỤC LỤC .......................................................................................................................... 1
CHƯƠNG 1. TỔNG QUAN ............................................................................................. 3
1.1. Tổng quan về bài tốn phân tích xu hướng khách hàng dựa vào bộ dữ liệu tweet
trên twitter ........................................................................................................................ 3
1.2.

Lý do chọn đề tài :.................................................................................................. 3

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT ................................................................................. 4
2.1. Các phương pháp tiền xử lý dữ liệu .......................................................................... 4
2.2. SVM cho bài toán Text Classfication ....................................................................... 5
Từ văn bản đến vectơ .................................................................................................... 5
2.3. Adaboost cho bài toán Text Classfication................................................................. 7
Bag of Words .............................................................................................................. 10
Term Frequency x Inverse Document Frequency ...................................................... 11
CHƯƠNG 3. CÁC KẾT QUẢ THỰC NGHIỆM ......................................................... 12
3.1. Bộ Dữ Liệu .............................................................................................................. 12
3.1.1. Nguồn dữ liệu ................................................................................................... 12
3.1.2. Cào dữ liệu ........................................................................................................ 12
3.1.3. Tiền xử lý dữ liệu.............................................................................................. 13
3.1.4. Gắn nhẵn dữ liệu bằng mô hình LDA .............................................................. 15
Bộ dữ liệu dùng để xây dựng mơ hình........................................................................ 16
3.2. Phân chia dữ liệu ..................................................................................................... 16
3.3. Huấn luyện dữ liệu .................................................................................................. 17
Mơ hình SVM ............................................................................................................. 17

Mơ hình AdaBoost ...................................................................................................... 17
3.4. Các kết quả .............................................................................................................. 18
Dữ liệu sau khi cào ..................................................................................................... 18
Dữ liệu sau khi tiền xử lý............................................................................................ 18
Dữ liệu sau khi gắn nhãn ............................................................................................ 19
Mơ hình SVM ............................................................................................................. 19
1


lOMoARcPSD|17343589

Mơ hình Adaboost ...................................................................................................... 19
3.5. Phân tích và đánh giá .............................................................................................. 19
CHƯƠNG 4. KẾT LUẬN ............................................................................................... 20
4.1. Các Kết Quả Đạt Được ........................................................................................... 20
4.2. Những Hạn Chế và Hướng Phát Triển .................................................................... 20
TÀI LIỆU THAM KHẢO............................................................................................... 21
PHỤ LỤC ......................................................................................................................... 21

2


lOMoARcPSD|17343589

CHƯƠNG 1. TỔNG QUAN
1.1.

Tổng quan về bài tốn phân tích xu hướng khách hàng dựa vào bộ dữ liệu
tweet trên twitter


Với sự phát triền của công nghệ thông tin, và đặc biệt là Big Data, việc phân tích dữ liệu
để tìm ra các xu hướng từ quá khứ cũng như phần nào dự đoán tương lai đang ngày càng
được các doanh nghiệp tin dùng. Bên cạnh những bài toán dự đoán trên những con số, dữ
liệu được thu thập sẵn ở dạng bảng, database,… hay thường được gọi là dữ liệu có cấu
trúc, các dạng dữ liệu phi cấu trúc như text( các bài đăng), hình ảnh, giọng nói,… cũng
đang rất được quan tâm. Bởi dữ liệu phi cấu trúc có ở khắp mọi nơi, ít tốn chi phí thu
thập dữ liệu. Bài toán phân loại văn bản (Text Classification) ra đời nhằm đáp ứng nhu
cầu dự đoán từ những bộ dữ liệu phức tạp trên.
Text Classification là việc xây dựng mơ hình để dự đốn loại của văn bản thuộc các mơ
hình học có giám sát, các ứng dụng thực tế của mơ hình này có thể kể đến như: xác định
mail spam, xác định cảm xúc của các bài đăng (sentiment analysis),… Ở đề tài này, nhóm
em sẽ tiếp cận bài toán theo hướng dựa vào bài tweet để tìm ra những món hàng phù hợp
với nhu cầu của khách hàng.
1.2.

Lý do chọn đề tài :

Văn bản có thể là một nguồn thông tin vô cùng phong phú, nhưng việc trích xuất những
hiểu biết sâu sắc từ nó có thể khó khăn và tốn thời gian do bản chất của nó. Tuy nhiên,
nhờ những tiến bộ trong máy học (Machine Learning) và học sâu (Deep Learning), việc
xử lý văn bản lớn để xây dựng các mơ hình trở nên khả thi hơn.
Mục tiêu nhóm đặt ra cho bài toán này, là từ bộ dữ liệu của mọi người được tweet trên
twitter trong q này, tìm ra nhóm hàng mà từng bài tweet đề cập đến và xây dựng các
mơ hình để dự đốn cho các bài tweet sau này. Ứng dụng vào thực tế, bài toán này giúp
các doanh nghiệp/ người bán hàng dự đoán được sự quan tâm của khách hàng đến các
mặt hàng nào, từ đó đáp ứng nhu cầu và tăng doanh thu.

3



lOMoARcPSD|17343589

CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
2.1. Các phương pháp tiền xử lý dữ liệu
Có rất nhiều cách khác nhau để "làm sạch" và tiền xử lý dữ liệu dạng văn bản. Dưới
đây,nhóm em xin phép đề xuất một số điểm quan trọng nhất được sử dụng nhiều trong giai
đoạn tiền xử lý ngơn ngữ tự nhiên (NLP).


Xóa các ký tự đặc biệt: Trong các bài tweet, thường xuất hiện các kí tự như emoji,
icon, các dấu tags @, các hashtags #,… các kí tự này hầu như khơng giúp ích gì
trong việc xây dựng mơ hình nên ta có thể tìm và loại bỏ nó để việc xây dựng mơ
hình được tinh gọn.



Xóa đường dẫn HTML: Tương tự như các ký tự đặc biệt, chúng ta khơng có nhu
cầu click vào các đường link để xem thông tin nên việc loại bỏ là cần thiết để giảm
thiểu dữ liệu đầu vào.



Biến đổi các từ viết tắt: Trong tiếng Anh, các từ viết tắt về cơ bản là phiên bản rút
gọn của các từ hoặc âm tiết. Những từ viết tắt của các từ hoặc cụm từ thường được
tạo ra bằng cách loại bỏ các chữ cái và âm tiết. Ví dụ như: do not => don't, I
would => I'd. Chuyển đổi từ dạng viết tắt thành dạng đầy đủ cũng là một bước cần
thiết để chuẩn hóa văn bản.




Thay thế các slang thành từ: Trong ngôn ngữ trên các nền tảng mạng xã hội, mọi
người thường sử dụng các từ viết tắt cho ngắn gọn, từ viết tắt này mang tính tự
phát và nhiều người dùng hơn là tính đúng đắn về mặt ngữ pháp như các từ viết tắt
trên. Ví dụ như: pls => please, g9: goodnight. Chuyển đổi các từ này về dạng gốc
giúp dễ hiểu cũng như tiện cho việc xử lý.



Từ gốc và ngữ pháp: Trong các ngữ cảnh khác nhau, các từ gốc thường được gắn
thêm các tiền tố và hậu tố vào để đúng với ngữ pháp. Ví dụ các
từ: WATCHES, WATCHING, and WATCHED. Chúng ta có thể thấy rằng chúng
đều có chung từ gốc là WATCH



Xóa các stopwords: stopwords là các từ có ít hoặc khơng có ý nghĩa gì đặc biệt khi
xây dựng các đặc trưng. Đây thường là những từ giới từ, trợ từ có tần suất xuất
hiện tương đối cao trong một văn bản thơng thường ví dụ như: a, an, the... Chúng
ta khơng có một danh sách chung tác stopwords tuy nhiên bạn có thể sử dụng thư
viện nltk. Hoặc bạn cũng có thể tự xây dựng được các thư viện stopwords cho
riêng ngôn ngữ bạn đang xử lý. Việc này cũng có ý nghĩa tương đối quan trọng
trong xử lý ngơn ngữ tự nhiên.



Trích xuất danh từ: Mục tiêu của bài tốn là tìm ra topic của bài tweet/ category
của món hàng được tweet nên phần lớn những từ ta quan tâm đều là danh từ. Nên
sử dụng một số hàm được cung cấp sẵn bởi thư viện nltk để xác định và giữ lại chỉ
danh từ.




Xóa một số từ không cần thiết: Một số từ không cần thiết hoặc khơng có ý nghĩa
vẫn sẽ xuất hiện sau khi sử dụng các hàm được cấp sẵn bởi các thư viện. Để loại
4


lOMoARcPSD|17343589

bỏ các từ này hoàn toàn, ta cần sử dụng các biện pháp thủ công để xác định và xử
lý.
2.2. SVM cho bài toán Text Classfication
Phân loại văn bản bằng máy vectơ hỗ trợ (SVM).Có nhiều thuật tốn học máy khác nhau
mà chúng ta có thể chọn khi thực hiện phân loại văn bản với học máy . Một trong số đó là
Support Vector Machines (hoặc SVM) .
Từ văn bản đến vectơ
Máy vectơ hỗ trợ là một thuật toán xác định ranh giới quyết định tốt nhất giữa các vectơ
thuộc về một nhóm (hoặc danh mục) nhất định và các vectơ khơng thuộc về nó.
Nó có thể được áp dụng cho bất kỳ loại vectơ nào mã hóa bất kỳ loại dữ liệu nào. Điều
này có nghĩa là để tận dụng sức mạnh của phân loại văn bản svm, văn bản phải được
chuyển đổi thành vectơ.
Bây giờ, vectơ là gì?
Các vectơ là (đôi khi rất lớn) danh sách các số đại diện cho một tập hợp tọa độ trong một
số khơng gian.
Vì vậy, khi SVM xác định ranh giới quyết định mà chúng ta đã đề cập ở trên, SVM sẽ
quyết định nơi vẽ “đường thẳng” tốt nhất (hoặc siêu phẳng tốt nhất) để chia không gian
thành hai không gian con: một dành cho các vectơ thuộc loại đã cho và một dành cho các
vectơ thuộc loại đã cho. các vectơ khơng thuộc nó.
Vì vậy, miễn là chúng ta có thể tìm thấy các biểu diễn véc-tơ mã hóa càng nhiều thông tin
từ văn bản càng tốt, chúng ta sẽ có thể áp dụng thuật tốn SVM cho các bài toán phân

loại văn bản và thu được kết quả rất tốt.
Ví dụ: các vịng trịn màu xanh lam trong biểu đồ bên dưới là phần trình bày của các văn
bản đào tạo nói về Giá của Sản phẩm SaaS và các hình tam giác màu đỏ là phần trình bày
của các văn bản đào tạo khơng nói về điều đó. Ranh giới quyết định cho danh mục Định
giá sẽ như thế nào?

5


lOMoARcPSD|17343589

Ranh giới quyết định tốt nhất sẽ trông như thế này:

Bây giờ thuật toán đã xác định ranh giới quyết định cho danh mục mà bạn muốn phân
tích, bạn chỉ cần lấy các biểu diễn của tất cả các văn bản mà bạn muốn phân loại và kiểm
tra xem các biểu diễn đó nằm ở phía nào của ranh giới.
Có rất nhiều cách mã hóa văn bản trong vectơ. Nếu bạn muốn tìm hiểu thêm về một số
trong số họ, hãy đọc phần này . Bạn cũng có thể tìm hiểu thêm về các máy vectơ hỗ trợ
và các chức năng hạt nhân tại đây .

6

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

2.3. Adaboost cho bài toán Text Classfication
Về mặt lý thuyết, nhóm em sẽ đề cập về cách mà tụi này hoạt động
Giải thích đơn giản: Trình phân loại Adaboost Adaboost là thuật tốn thúc đẩy thành

cơng đầu tiên được phát minh vào năm 1996 bởi Robert Schapire và Yoav Freund. Có lẽ
bạn hỏi, thật tuyệt nhưng thuật tốn tăng tốc là gì? Các trình phân loại dựa trên tăng
cường độ dốc là các trình phân loại để tạo ra một trình phân loại mạnh bằng cách sử dụng
nhiều người học yếu. Tơi biết đây là một câu khó hiểu. Để tơi chỉ cho bạn cách nó hoạt
động với biểu đồ 2-D.

• Đây là tập dữ liệu của chúng tơi gồm hai lớp, lớp màu xanh là lớp A và lớp còn lại là
lớp B.

7

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

• Chúng tơi muốn phân loại chúng chỉ bằng cách sử dụng các đường dọc và ngang đơn
giản, chẳng hạn như:

Nhưng đây là một dòng xấu, hãy bắt đầu. Như chúng ta có thể thấy, hầu hết phía bên trái
của biểu đồ chứa các chấm loại B, vì vậy chúng ta có thể vẽ một đường thẳng đứng để
phân chia hầu hết các chấm loại B.

• Ừ, khái niệm người học yếu chỉ có vậy thơi, chắc bạn cũng biết chúng ta có thể làm
điều đó với cây quyết định. • Nhưng chúng ta vẫn cần nhiều học sinh yếu hơn, như bạn

8

Downloaded by v? ngoc ()



lOMoARcPSD|17343589

có thể thấy hầu hết các điểm ở trên là B, vì vậy chúng ta có thể kéo một học sinh yếu đến

đó.
Gần như sẵn sàng, bây giờ chúng ta chỉ cần giải cứu điểm xanh ở trên.

• Cuối cùng, chúng tơi đã hồn thành việc đào tạo bộ phân loại của mình với ba bộ ước
lượng cây quyết định (người học tuần). Nếu chấm ở khu A hay khu B thì phải hạng B
• Và nếu một dấu chấm nằm trong vùng C, D hoặc E, lớp của nó phải là A
Mọi thứ bạn cần để bắt đầu với Adaboost đã kết thúc, bạn có thể (nên) tìm hiểu chi tiết từ
Bài viết, hãy chuyển sang các phương pháp trích xuất tính năng văn bản.
9

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

Bag of Words
Để hiểu tại sao trích xuất tính năng TF-IDF lại quan trọng, tơi phải giải thích trích xuất
tính năng Bag of Words (BOW) là gì.
Trong phương pháp Bag of Words, chúng ta sẽ tạo một ma trận thưa thớt (một ma trận
trong đó hầu hết các phần tử đều bằng 0) bằng cách sử dụng các câu. Mỗi tương lai sẽ là
một từ, hãy cùng xem ví dụ dưới đây:
Chúng tơi có một tập dữ liệu chứa 6 câu:








Today I am going to study data science
Tomorrow you will go
I am interested in data science
You was a good man
I just wanted to be a good man
Are you interested in statistics?

Tơi đã nói mỗi từ sẽ là một tính năng, vì vậy các tính năng của chúng tơi sẽ là:
TODAY I AM GO STUDY DATA SCIENCE TOMORROW YOU WILL INTERESTED IN
WAS GOOD MAN JUST WANT BE ARE STATISTICS
Nếu câu đã cho có chứa đặc điểm này, giá trị của nó sẽ là 1 và nếu khơng, giá trị của nó
sẽ là 0. Hãy tạo các vectơ Bag of Word của chúng ta
TODAY I AM GO STUDY DATA SCIENCE TOMORROW YOU WILL INTERESTED IN
WAS GOOD MAN JUST WANT BE ARE STATISTICS
1

1 1 1 1 1

1

1

0

0 0


0

0 0 0

0 0

0 0 0

0

2

0 0 0 1 0

0

0

1

1 1

0

0 0 0

0 0

0 0 0


0

3

0 1 1 0 0

1

1

0

0 0

1

1 0 0

0 0

0 0 0

0

4

0 0 0 0 0

0


0

0

1 0

0

0 1 1

1 0

0 0 0

0

5

0 1 0 0 0

0

0

0

0 0

0


0 0 1

1 1

1 1 0

0

6

0 0 0 0 0

0

0

0

1 0

0

1 0 0

0 0

0 0 1

1


Câu đầu tiền là Today I am going to study data science, theo ma trận câu này
chứa today,I,am,go,study,data,science.
Bag of Words tất cả chỉ là về điều này, hãy chuyển sang trích xuất tính năng TF-IDF.

10

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

Term Frequency x Inverse Document Frequency
Trong phần trước, chúng ta đã học Bag of Words. Trong bag of Words, chúng tơi đã sử
dụng các tính năng nhị phân (các tính năng cho biết câu có chứa từ đó hay khơng) nhưng
đơi khi như bạn có thể dự đốn, nó có thể gây ra sự cố thực sự.
Trong TFxIDF, mỗi tương lai cũng sẽ là một từ, nhưng chúng tôi sẽ không sử dụng hệ
nhị phân. Chúng tôi sẽ sử dụng công thức để xác định điểm số TF-IDF của đối tượng địa
lý.
=> Giá trị đặc trưng i của câu j
Điểm TF-IDF: TF(i,j) * IDF(i)
Tần suất thuật ngữ(i,j) = Số lần tơi xuất hiện trong j / có bao nhiêu từ trong j
Tần số tài liệu nghịch đảo(i) = log2(số câu trong tập dữ liệu/số câu chứa i từ)
Đó là tất cả về điều này, hãy làm một ví dụ.
• Chúng ta có một tập dữ liệu gồm 500 câu và tất cả các câu đều chứa từ I. (Thật là một
bộ dữ liệu ích kỷ ha!)
• Hãy tính điểm TF-IDF của đặc điểm I trong câu dưới đây:
Tôi thực sự quan tâm đến việc tăng cường độ dốc
• Điểm TF sẽ là = 1/6
• Tài liệu nghịch đảo sẽ là = log2(500/500) = 0
• Vì vậy, điểm TF-IDF của nó sẽ là 0, có nghĩa là tơi khơng có ý nghĩa đặc biệt.


11

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

CHƯƠNG 3. CÁC KẾT QUẢ THỰC NGHIỆM
3.1. Bộ Dữ Liệu
3.1.1. Nguồn dữ liệu
Dữ liệu được lấy từ các bài tweet trên twitter từ ngày 13/12/2022 đến một quý trước đó
(90 ngày)
Dữ liệu được lấy theo 2 keywords:
• Want to buy
• Need to buy
Mọi bài tweet đáp ứng điều kiện của query (tơi sẽ nói ở phần sau) và chứa keywords đều
được cào về.
3.1.2. Cào dữ liệu
Sử dụng thư viện snscrape để cào dữ liệu từ twitter về. Ưu điểm của thư viện này là
không yêu cầu API hay Twitter DEV (phải đăng kí và chờ twitter xác thực).
Cài đặt thư viện:
!pip install snscrape

Gọi module cào dữ liệu twitter:
import snscrape.modules.twitter as sntwitter

Twitter query:
Giống như SQL, Twitter cũng có ngơn ngữ riêng để truy vấn/ tìm kiếm dữ liệu. Ở đây
nhóm em sẽ dùng một câu truy vấn đơn giản để tìm kiếm dữ liệu.

(keyword) lang:{language}

until:{endtime} since:{starttime}

Với:
• Keyword là dữ liệu cần tìm kiếm, tất cả bài tweet xuất hiện đều đảm bảo sẽ chứa
keyword.
• Lang: chỉ định ngơn ngữ của bài đăng.
• Until: chỉ định thời gian gần nhất bài đăng xuất hiện.
• Since: chỉ định thời gian bắt đầu (xa nhất) của bài đăng.
Ngồi ra vẫn cịn nhiều cách để truy vấn dữ liệu từ Twitter (nguồn tham khảo:
/>Source code cào dữ liệu:
import snscrape.modules.twitter as sntwitter
import pandas as pd
import datetime as dt

12

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

keywords = ['"want to buy"', '"need to buy"']
x = dt.date.today()
tweets = []
for i in keywords:
query = f"({i}) lang:en
limit = 25000
tweets_keyword = []


until:{x} since:{x- dt.timedelta(days = 90)}"

for tweet in sntwitter.TwitterSearchScraper(query).get_items():
if len(tweets_keyword) < limit:
tweets_keyword.append([tweet.date, tweet.username, tweet.content])
else:
for k in tweets_keyword:
tweets.append(k)
break
df = pd.DataFrame(tweets, columns=['Date', 'User', 'Tweet'])
df.to_csv('/content/twitter_tweet.csv')

Đầu tiên gọi các thư viện cần thiết và dùng datetime để chỉ định ngày. Sau đó tạo ra list
keyword và cho lặp qua các phần tử của list để lấy ra keyword thay vào query. Query sẽ
trả về số lượng bài tweet mỗi keyword bằng với con số limit được ấn định sẵn (ở đây là
25000 mỗi keyword nghĩa là data cào về sẽ bao gồm 50000 bài tweet). Chỉ query những
thông tin cần thiết như Date, User (người tweet), Tweet (nội dung bài tweet). Cuối cùng
lưu vào dataframe và lưu thành file .csv để xử lý.
3.1.3. Tiền xử lý dữ liệu
Áp dụng các biện pháp đã nêu trên để tiền xử lý, làm sạch cột Tweet của dataframe:
• Dùng lemmatizing để xác định các gốc từ và chỉ giữ lại một từ nếu cùng gốc.
def lemmatizing(words):
lemmatizer =WordNetLemmatizer()
return ''.join([lemmatizer.lemmatize(word) for word in words])

• Thay thế các slang thành từ gốc: Ý tưởng thực hiện là đọc một file chứa các từ
slang (file này được tìm trên mạng chứa phần lớn những slang thường xuất hiện
trên các mạng xã hội) và giải nghĩa sau đó biên soạn (compile) thành một bộ regex
và thay thế.

with open('slang.txt') as file:
slang_map = dict(map(str.strip, line.partition('\t')[::2])
for line in file if line.strip())

13

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

slang_words = sorted(slang_map, key=len, reverse=True) # longest first
for regex
slang_regex = re.compile(r"\b({})\b".format("|".join(map(re.escape, sla
ng_words))))

• Loại bỏ Tags, Hashtags, Mentions, HTML,…: Dùng regex để loại bỏ các yếu tố
không cần thiết trong tweet.
tweet
tweet
tweet
tweet

=
=
=
=

re.sub(r'https?:\/\/.*[\r\n]*', '', tweet)
re.sub(r'#', '', tweet)

re.sub(r'[0-9]', '', tweet)
re.sub(r'@[^ ]+', '', tweet)

• Loại bỏ các emoji: Việc regex theo các mã emoji mất khá nhiều thời gian và
khơng thể bao qt được tồn bộ, nên tận dụng thư viện clean để xóa các emoji
một cách nhanh chóng.
!pip install clean-text
from cleantext import clean
tweet = clean(tweet, no_emoji=True)

• Loại bỏ một vài từ khơng cần thiết/ khơng có ý nghĩa: Các từ này sẽ được xác định
một cách thủ công và được thử nhiều đến khi việc phân chia topic thật sự tối ưu.
tweet = re.sub(r'(buy|sell|need|want)(to)*', '', tweet)
tweet = re.sub(r'(time|day|week|month|year)(s)*', '', tweet)
tweet = re.sub(r'(man|lot|people|shit|venus|ina|dm|family|sir|wtb|
mom|help|want|wts|season|merch|boss|thank|cause|hey|guess|andamp|one
|work|thing|way)(s)*', '', tweet)

• Trích xuất danh từ từ câu: Dùng pos_tag của nltk để gắn tag theo loại của từng từ
và chỉ giữ lại danh từ (N), đồng thời cũng loại bỏ các từ có ít hơn 2 kí tự (vì
thường là khơng có ý nghĩa trong tiếng Anh)
nouns = []
for word,pos in nltk.pos_tag(nltk.word_tokenize(str(tweet))):
if (pos == 'NN') and len(word) > 2:
nouns.append(word)
if len(nouns) > 0:
return ' '.join(nouns)
else:
return ''


• Xóa các dịng dữ liệu trống: Sau khi áp dụng các bước tiền xử lý, một vài bài tweet
không đáp ứng được điều kiện sẽ trả về giá trị trống, nên ta xóa các dịng này đi để
tinh gọn cho việc xây dựng mơ hình.
drop_row = df[df['Tweet_processed'] == ''].index
df.drop(drop_row, axis =0, inplace = True)

14

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

3.1.4. Gắn nhẵn dữ liệu bằng mơ hình LDA
Cả 2 mơ hình phân loại bằng SVM và Adaboost đều u cầu bộ dữ liệu đầu vào là dữ liệu
có nhãn (có biến target). Tuy nhiên dữ liệu được cào về từ Twitter là dữ liệu khơng có
nhãn. Vì vậy, trước khi xây dựng 2 mơ hình này, ta cần gắn nhãn cho dữ liệu. Cách nhóm
em đề ra đó là sử dụng mơ hình LDA để xác định các topic của từng bài tweet và gắn
chúng vào bộ dữ liệu.
Sơ nét về mơ hình LDA: LDA là lớp mơ hình cho phép xác định một tập hợp các chủ đề
tưởng tượng (imaginary topics) mà mỗi topic sẽ được biểu diễn bởi tập hợp các từ. Mục
tiêu của LDA là mapping toàn bộ các văn bản sang các topics tương ứng sao cho các từ
trong mỗi một văn bản sẽ thể hiện những topic tưởng tượng ấy.
Các bước xây dựng mô hình LDA và gắn nhãn dữ liệu:
• Đầu tiên, xây dựng một ma trận thuật ngữ bằng CountVectorizer từ dữ liệu đã xử
lý khi nãy. Với ngưỡng chọn là những từ xuất hiện trong cả bộ dữ liệu ít nhất là
100 lần (min_df = 100) và bỏ qua các stopwords bằng tiếng anh. Đồng thời lấy ra
tên của thuộc tính bằng hàm get_feature_names().
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(min_df=100, stop_words="english")

dtm = cv.fit_transform(df['Tweet_processed'])
feature_names = cv.get_feature_names()

• Sau đó, xây dựng mơ hình LDA từ ma trận đã tạo trên. Mơ hình LDA sẽ truy xuất
topic cho các bài tweet. Ở bài toán này, nhóm em quy định số topic sẽ là 5, thể
hiện ở tham số truyền vào lúc gọi mơ hình LDA.
from sklearn.decomposition import LatentDirichletAllocation
NB_TOPICS = 5
LDA_model = LatentDirichletAllocation(n_components = NB_TOPICS, max_
iter = 30, random_state = 0)
LDA_model.fit(dtm)

• Cuối cùng, in ra top 3 từ theo topic và gán topic vào bộ dữ liệu.
for i, topic in enumerate(LDA_model.components_):
print("THE TOP {} WORDS FOR TOPIC #{}".format(10, i))
print([cv.get_feature_names()[index] for index in topic.argsort()[
-3:]])
print("\n")

15

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

final_topics = LDA_model.transform(dtm)
print(final_topics.shape)
df["Topic"] = final_topics.argmax(axis=1)


Một khuyết điểm của phương pháp này là tuy phân loại được topic của bài tweet nhưng
chưa tìm được danh mục (category) của món hàng được nhắc đến trong bài tweet. Vì vậy,
nhóm em sẽ chỉ dùng topic để gắn nhãn dữ liệu.

Bộ dữ liệu dùng để xây dựng mơ hình

Sau khi tiền xử lý và gắn nhãn, ta thu được bộ dữ liệu bao gồm 44318 dòng (so với 50000
dòng ban đầu) và 5 cột (với 2 cột mới thêm vào là: Tweet_processed – dữ liệu tweet sau
khi tiền xử lý và Topic – chủ đề vừa tìm được từ mơ hình LDA.
3.2. Phân chia dữ liệu
Từ bộ dữ liệu trên chia thành các tập train test, với feature sử dụng là cột Tweet_processed
– Cột dữ liệu chứa các bài tweet đã xử lý và lưu lại ở phần trước và target là cột Topic –
được tìm ra từ mơ hình LDA ở phần trước.
Dùng hàm train_test_split của thư viện sklearn để chia tách dữ liệu thành 2 tập train test
với tỉ lệ tập test là 20% trên tổng bộ dữ liệu.
Ngồi ra mỗi mơ hình cũng yêu cầu một biến đầu vào khác nhau, vấn đề này sẽ được giải
thích rõ hơn ở phần sau.

16

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

3.3. Huấn luyện dữ liệu
Mơ hình SVM
Mơ hình SVM u cầu biến đầu vào là một ma trận thuật ngữ được tính bằng
CountVectorizer giống với mơ hình LDA. Tuy nhiên SVM là một mơ hình phân loại, cịn
LDA lại giống một mơ hình phân cụm hơn nên tốc độ xây dụng mơ hình SVM sẽ nhanh

hơn LDA.
• Đầu tiên cần khởi tạo biến đầu vào bằng CountVectorizer()
vectorizer = CountVectorizer(max_features=20000)
BOW = vectorizer.fit_transform(cleanedData)

• Sau khi tạo các thuộc tính đầu vào cho mơ hình, tiến hành xây dựng mơ hình phân
lớp SVM bằng module SVC() của thư viện sklearn.
model = SVC()
model.fit(x_train,y_train)

• Cuối cùng, dùng Accuracy_score để đánh giá mơ hình.
predictions = model.predict(x_test)
print("Accuracy of model is {}%".format(accuracy_score(y_test,predic
tions) * 100))

Mơ hình AdaBoost
Khác với SVM, mơ hình AdaBoost u cầu các thuộc tính đầu vào là một ma trận TFIDF (một ma trận ước tính mức độ quan trọng của từ trong câu).
• Đầu tiên, tạo một ma trận TF-IDF bằng TfidfVectorizer() và chuyển về dạng
mảng.
vectorizer = TfidfVectorizer(max_features=4000)
x = vectorizer.fit_transform(cleanedData).toarray()

• Sau đó, khởi tạo mơ hình phân loại AdaBoost bằng module AdaBoostClassifier()
của sklearn và fit vào tập dữ liệu train.
classifier = AdaBoostClassifier(base_estimator=DecisionTreeClassifie
r(),n_estimators=100)
classifier.fit(x_train,y_train)

• Cuối cùng, dùng tập test để đánh giá mơ hình.
y_pred = classifier.predict(x_test)

print("Test set accuracy of our Adaboost Classifier is {}".format(ro
und(accuracy_score(y_pred,y_test)*100,2)))

17

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

3.4. Các kết quả
Dữ liệu sau khi cào
Sau khi cào dữ liệu, thu được bộ dữ liệu các bài tweet gồm 50000 dòng (25000 theo
keyword “want to buy” và 25000 theo keyword “need to buy”) và 3 cột (Date, User,
Tweet).

Dữ liệu sau khi cào sẽ được lưu về file twitter_tweet.csv.
Dữ liệu sau khi tiền xử lý
Qua các bước xử lý (regex, lematizing, pos_tag…) dữ liệu thu về sạch hơn so với dữ liệu
ban đầu, có thể thấy ở cột Tweet_processed so với Tweet.

18

Downloaded by v? ngoc ()


lOMoARcPSD|17343589

Tuy nhiên sẽ chứa một vài dịng khơng có ý nghĩa đã bị xóa tồn bộ nội dung. Sau khi
xóa các dịng đó bộ dữ liệu thu được bao gồm 44318 dịng và 4 cột.


Dữ liệu sau khi gắn nhãn
Có 5 nhãn dữ liệu từ 0-4 được gắn cho từng bài tweet, bộ dữ liệu sau khi gắn nhãn sẽ
tăng lên một cột so với ban đầu.
Dữ liệu sau khi tiền xử lý và gắn nhãn sẽ được lưu vào file tweet_topic.csv.
Mơ hình SVM
Kết quả Accuracy_score của mơ hình SVM là khoảng 94.6%.
Mơ hình Adaboost
Kết quả Accuracy_score của mơ hình AdaBoost là khoảng 91.1%.
3.5. Phân tích và đánh giá
Từ kết quả đánh giá 2 mơ hình trên có thể thấy, độ chính xác của cả hai mơ hình có sự
chênh lệch, tuy nhiên, sự chênh lệch này lại không đáng kể 94.6% so với 91.1%. Việc kết
quả đánh giá khá cao một phần là do dữ liệu đã được gắn nhãn topic bằng mơ hình LDA
trước đó nên các dữ liệu giữa các topic đều có điểm chung.
Vì vậy, có thể kết luận rằng cả 2 mơ hình đều mang lại kết quả tốt và có thể đem vào sử
dụng để phân loại các bài tweet thay thế cho mô hình LDA chạy khá chậm, từ đó có thể tối
ưu cho bài toán xác định xu hướng mua hàng theo bài tweet trên Twitter.

19

Downloaded by v? ngoc ()



×