Ở phần trước mình đã giới thiệu các bạn về phương thức phân loại dễ dàng và đơn giản bằng Bayes (đọc lại trên đây).

Bạn đang xem: Sử dụng thuật toán Naive Bayes để phân loại email

Ở bài xích này chúng ta sẽ tiến hành thiết lập chương trình lọc thư rác rến bằng ngữ điệu Java dựa trên phương pháp phân loại dễ dàng bằng Bayes.

1. Dữ liệu ban đầu

Ban đầu bản thân sẽ sẵn sàng 1 tập huấn luyện gồm 10 tệp tin text lưu lại là spam và 10 tệp tin text ghi lại là ko spam (nếu bạn có càng những file càng tốt). Tỉ lệ thành phần ở đó là 50:50 có nghĩa là nhận 1 thư điện tử tới thì năng lực nó là spam là 50%.

*

Sau những lần kiểm tra được đó có phải là thư điện tử spam không ta lại thêm nó vào tập huấn luyện và tỉ lệ sẽ khác dần đi. Ví dụ nhận ra 10 email tiếp theo đều chưa phải là spam thì tỉ trọng spam/non-spam đã là khoảng tầm 30:70 như thế 1 thư điện tử mới sẽ có công dụng spam là 30%

*

2. Chạy tập huấn luyện.

Mình sẽ chuyên chú từng tệp tin spam và tách thành những túi tự (mỗi túi từ 1 Set những từ biệt lập nhau). Sau khi duyệt xong xuôi 10 file ta sẽ được một List tất cả 10 túi từ bỏ spam. Tương tự duyệt và tác những file non-spam ta cũng khá được 1 list có 10 túi từ non-spam.

Sau khi tách được 2 menu túi trường đoản cú ta ghi nó vào file result_training.dat nhằm lúc thực hiện kiểm tra mail spam thì chỉ bài toán đọc từ file này ra chứ không buộc phải chạy huấn luyên nữa.

public class kiểm tra { // mảng chứa những túi trường đoản cú của thư thường xuyên (non-spam) static Array
List> list
Bag
Of
Non
Spam = new Array
List(); // mảng chứa những túi từ bỏ của thư rác rưởi (spam) static Array
List> list
Bag
Of
Spam = new Array
List(); // tinh xac xuat P(xi=x|nhan= nonspam) public static double p
Non
Spam(String x) { double k = 0; for (int i = 0; i >) inp.read
Object(); list
Bag
Of
Non
Spam = (Array
List>) inp.read
Object(); inp.close(); System.out.println("Hoàn load tài liệu huấn luyện"); // đọc tài liệu từ mail đề xuất kiểm tra System.out.println("Đọc dữ liệu mail nên kiểm tra"); tệp tin mail
Testing = new File("data/test/test (1).txt"); // Tiền xử lý mail nên kiểm tra String mail
Data = File
Utils.read
File
To
String(mail
Testing, "UTF-16"); set bag
Of
Test = Run
Training
Data.to
Bag
Of
Word(mail
Data); System.out.println("Bắt đầu kiểm tra:"); // xác xuất là thư thường. P(xi|non-spam) double C_NB1 = list
Bag
Of
Non
Spam.size() / ((double) list
Bag
Of
Non
Spam.size() + list
Bag
Of
Spam.size()); // xác xuất là thư rác. P(xi|spam) double C_NB2 = list
Bag
Of
Spam.size() / ((double) list
Bag
Of
Non
Spam.size() + list
Bag
Of
Spam.size()); Array
List list
String
Test = new Array
List(bag
Of
Test); for (String str
Test : list
String
Test) p
Spam(str
Test) != ((double) 1 / (list
Bag
Of
Spam.size() + 1))) System.out.println("P(x_i=" + str
Test + " if (C_NB1 (Lưu ý, mình dùng tư viện Apache Common IO để đọc tệp tin cho cấp tốc gọn, các chúng ta có thể xem lại về Common IO trên đây)

3. Thực hiện kiểm tra mail spam

Mình cũng sẽ bóc tách mail bắt buộc kiểm tra thành 1 túi từ.

Áp dụng phương thức phân các loại bayes đối chọi giản, ta sẽ tính tỉ lệ của từng từ vào túi từ này còn có trong menu túi từ spam và non-spam là bao nhiêu kế tiếp lấy tích của chúng và nhân với tỉ trọng spam:non-spam và đối chiếu 2 kết quả.

Xem thêm: Những lời chúc tết hay nhất dành cho người yêu ngắn gọn và hay nhất

Ví dụ: mail bắt buộc kiểm tra có 100 từ, tỉ lệ thành phần của từng từ trong danh sách túi tự spam nhân với nhau là A; tỉ lệ của từng từ trong túi trường đoản cú non-spam là B. Tỉ lệ thành phần spam:non-spam là X:Y (ban đầu là 50:50 nhưng con số này chuyển đổi sau mỗi lần thêm mail kiểm soát vào tập huấn luyện)

Để biết mail mới có phải là spam hay không ta so sánh A.X cùng với B.Y. Nếu A.X > B.Y thì mail bắt đầu là spam cùng ta thêm túi từ bắt đầu vào các mục túi từ bỏ spam trái lại thì mail bắt đầu là non-spam, ta thêm túi từ new vào list túi tự non-spam và lưu lại.

Ví dụ:

public class chạy thử { // mảng chứa những túi tự của thư thường xuyên (non-spam) static Array
List> list
Bag
Of
Non
Spam = new Array
List(); // mảng chứa những túi tự của thư rác rưởi (spam) static Array
List> list
Bag
Of
Spam = new Array
List(); // tinh xac xuat P(xi=x|nhan= nonspam) public static double p
Non
Spam(String x) { double k = 0; for (int i = 0; i >) inp.read
Object(); list
Bag
Of
Non
Spam = (Array
List>) inp.read
Object(); inp.close(); System.out.println("Hoàn load tài liệu huấn luyện"); // đọc dữ liệu từ mail bắt buộc kiểm tra System.out.println("Đọc tài liệu mail phải kiểm tra"); file mail
Testing = new File("data/test/test (1).txt"); // Tiền xử trí mail đề nghị kiểm tra String mail
Data = File
Utils.read
File
To
String(mail
Testing, "UTF-16"); phối bag
Of
Test = Run
Training
Data.to
Bag
Of
Word(mail
Data); System.out.println("Bắt đầu kiểm tra:"); // xác xuất là thư thường. P(xi|non-spam) double C_NB1 = list
Bag
Of
Non
Spam.size() / ((double) list
Bag
Of
Non
Spam.size() + list
Bag
Of
Spam.size()); // xác xuất là thư rác. P(xi|spam) double C_NB2 = list
Bag
Of
Spam.size() / ((double) list
Bag
Of
Non
Spam.size() + list
Bag
Of
Spam.size()); Array
List list
String
Test = new Array
List(bag
Of
Test); for (String str
Test : list
String
Test) if (C_NB1

Kết quả:

Bắt đầu load dữ liệu huấn luyện
Hoàn load dữ liệu huấn luyện
Đọc tài liệu mail cần kiểm tra
Kết thúc

Như vậy mình đã hướng dẫn chúng ta hoàn thành lịch trình lọc thư rác bằng Java, sử dụng phân một số loại bayes. Các bạn có thể thêm giao diện để nó bài bản hơn