Để xây dựng ứng dụng xác định dịch bệnh trên Twitter, bước đầu tiên chúng ta cần thu thập dữ liệu, sau đó chia thành hai tập: tập huấn luyện và tập kiểm thử. Do có rất nhiều người sử dụng twitter nên lượng thông tin vô cùng lớn, hỗn độn và phức tạp. Vì vậy khó để có một tập dữ liệu có sẵn nào có thể đáp ứng được yêu cầu cho ứng dụng.
Twitter cung cấp một loạt các giao diện lập trình ứng dụng cho phép truy vấn các thông tin về người dùng sau khi được cấp quyền, các truy vấn này có dữ liệu trả về dưới dạng JSON[4].
Ví dụ với truy vấn lấy tất cả các tweet của người dùng, kết quả trả về dưới dạng JSON như sau:
Bảng 3.1 Dữ liệu người dùng trong cơ sở dữ liệu
Để thuận tiện trong quá trình thu thập dữ liệu, lưu trữ và tiền xử lý dữ liệu, ứng dụng được viết bằng ngôn ngữ PHP[19], và sử dụng thư viện từ developer twitter[17] để thực hiện các truy vấn trên dữ liệu Twitter.
Thông qua các status được cung cấp bởi Twitter, chúng ta sẽ tiến hành thu thập một dữ liệu đủ lớn để xây dựng tập huấn luyện, với mục đích thử nghiệm các thuật toán, chúng ta sẽ lấy thông tin của 1000 status trực tiếp từ Twitter. Để có được thông tin của 1000 status này, ban đầu chúng ta lưu trữ dưới dạng cron job hằng ngày, mỗi ngày khoảng 50-70 tweet trên tất cả người dùng khác nhau. Dev Twitter hầu hết trả về location(địa chỉ)của người đăng tweet, chính vì vậy em phải làm thêm 1 bước chuyển đổi từ location sang tọa độ dựa vào thư viện developers.google.com, để phục vụ cho việc hiển thị trên google map sau này.
1. _[created_at] => Tue Nov 06 09:16:16 +0000 2018
2. [id] => 1059736211898728449
3. [id_str] => 1059736211898728449
4. [full_text] => Had crazy baby fever this weekend. Someone have my baby
and never talk to me again.
5. [source] => Twitter for iPhone
6. [in_reply_to_status_id] =>
7. [in_reply_to_status_id_str] =>
8. [in_reply_to_user_id] =>
9. [in_reply_to_user_id_str] =>
10. [in_reply_to_screen_name] =>
11. [user] => stdClass Object
12. (
13. [id] => 3357265553
14. [id_str] => 3357265553
15. [name] => reactionary girl utena
16. [screen_name] => femme_fatigue
17. [location] => Paris, France
18. [description] => i would like to be excluded from this narrative
19. [profile_background_image_url] => http://abs.twimg.com/images/themes/theme1/bg.png 20. [profile_background_image_url_https] => https://abs.twimg.com/images/themes/theme1/bg.png 21. ) 22. [coordinates] => 23. [place] => 24. [lang] => en
Chúng ta có tập dữ liệu về tweet như sau:
Bảng 3.2 Các tweet thu thập được trong cơ sở dữ liệu
Toàn bộ dữ liệu sẽ được chia thành 2 tập là tập huấn luyện và tập kiểm thử, tập lớn hơn sẽ là tập huấn luyện, bao gồm 5000 tweet, và tập nhỏ hơn sẽ là tập kiểm thử bao gồm 1000 tweet. Bảng dưới đây là thông tin về số lượng tweet bị cúm và không bị cúm trung bình trong 2 tập huấn luyện và kiểm thử.
Bảng 3.3 Phân chia tập huấn luyện và tâp kiểm thử
Tweet Cúm Không Bị Cúm
Huấn luyện 5000 2500 2500
Kiểm thử 1000 300 700
Để thu thập được các tweet của những người dùng, ứng dụng cần được cấp quyền truy cập yêu cầu người dùng đăng nhập để sử dụng hệ thống. Việc xác thực được thực hiện qua Twitter và trả về kết quả xác thực và quyền truy cập thông qua
cơ chế OAuth, khi có người dùng đăng status với nội dung có liên quan đến triệu chứng của cúm như: flu, cough, fever, headaches, fatigue… thông tin người dùng cũng như các tweet của người dùng đó sẽ được bổ sung vào tập kiểm thử để phân tích và xác định dịch bệnh sau này.
3.1 Biểu diễn dữ liệu
Một trong những nhiệm vụ đầu tiên trong việc xử lý bất kỳ bài toán phân lớp nào là chọn một mô hình biểu diễn dữ liệu văn bản thích hợp. Văn bản ở dạng text cần phải chuyển sang một mô hình dữ liệu khác phù hợp cho việc biểu diễn và tính toán. Tùy thuộc vào từng thuật toán phân loại sẽ có những mô hình biểu diễn riêng. Một trong những mô hình đơn giản nhất và được sử dụng nhiều nhất đó là mô hình không gian vector. Dữ liệu của hệ thống sẽ được biểu diễn dựa trên mô hình này. Sau khi lựa chọn đặc trưng cho dữ liệu xong, hệ thống sẽ tiến hành đưa dữ liệu về dưới dạng các vector. Mỗi một tweet sẽ được biểu diễn thành một vector là các trọng số của các đặc trưng trong câu. Việc xác định trọng số của các đặc trưng có nhiều các khác nhau. Như mô hình Boolean, là cách đơn giản nhất, là gán trọng số cho đặc trưng bằng một giá trị nhị phân chỉ ra đặc trưng đó có xuất hiện trong câu hay không, tức là giá trị trọng số wij bằng 1 nếu đặc trưng ti xuất hiện ít nhất một lần trong dữ liệu Dj và ngược lại bằng 0 nếu không xuất hiện
Để đơn giản hệ thống sử dụng cách Word frequency, tức là đếm số lần xuất hiện của từ. Ở đây ta xét đến 2 đại lượng là :
- Tf- term frequency : dùng để ước lượng tần xuất xuất hiện của từ trong văn bản. Tuy nhiên với mỗi văn bản thì có độ dài khác nhau, vì thế số lần xuất hiện của từ có thể nhiều hơn . Vì vậy số lần xuất hiện của từ sẽ được chia độ dài của văn bản (tổng số từ trong văn bản đó)
TF(t, d) = ( số lần từ t xuất hiện trong văn bản d) / (tổng số từ trong văn bản d) - IDF- Inverse Document Frequency: dùng để ước lượng mức độ quan trọng của từ đó như thế nào . Khi tính tần số xuất hiện tf thì các từ đều được coi là quan trọng như nhau. Tuy nhiên có một số từ thường được được sử dụng nhiều nhưng
không quan trọng để thể hiện ý nghĩa của đoạn văn , ví dụ : Từ nối: and, but, also, because, so, …
Giới từ: on, in, at …
Từ chỉ định: The, This, That, …
Vì vậy ta cần giảm đi mức độ quan trọng của những từ đó bằng cách sử dụng IDF: IDF(t, D) = log( Tổng số văn bản trong tập mẫu D/ Số văn bản có chứa từ t )
Hiện tại hệ thống sử dụng đại lượng df để biểu diễn dữ liệu.Tức là là xác định số lần xuất hiện của đặc trưng trong toàn bộ tập dữ liệu. Như vậy, tập dữ liệu sau khi được gán nhãn sẽ được đưa vào để vector hóa dưới dạng như sau:
<lable>:< >…..< >
Trong đó: lable là nhãn của câu, là đặc trưng thứ i trong câu, là số lần xuất hiện của đặc trưng trong tập dữ liệu.
Bộ dữ liệu huấn luyện theo hướng một số các triệu chứng của cúm được biểu diễn như sau:
Bảng 3.4. Thống kê tập dữ liệu huấn luyện
Từ Tính IDF (YES) Tính IDF (NO) Tổng số từ
Headaches 0.0021321961620469 0.0016414970453053 640 Fever 0.0017057569296375 0.0016414970453053 420 Cough 0.0046908315565032 0.0036112934996717 530 Runny 0.0008528784648187 0.0000000000000000 320 Muscle 0.0008528916972281 0.0006565988181221 321 Fatigue 0.0008557569296375 0.0009848982271831 323