Naive Bayes để phân loại văn bản nhiều nhãn


8

Cách sử dụng Naive Bayes để phân loại văn bản nhiều nhãn trong R.

Tôi đã thử sử dụng naiveBayes () từ thư viện e1071 nhưng có vẻ như trong khi đào tạo, nó không chấp nhận biến lớp đa nhãn.

Tôi đã tạo TermDocumentMatrix bằng văn bản tài liệu văn bản và cố gắng tạo mô hình bằng ma trận và biến lớp này (danh sách các chủ đề mà một tài liệu cụ thể thuộc về). Dưới đây là mã mà tôi đã sử dụng.

trainvector <- as.vector(traindata$bodyText)

trainsource <- VectorSource(trainvector)

traincorpus <- Corpus(trainsource)

trainmatrix <- t(TermDocumentMatrix(traincorpus))

model <- naiveBayes(as.matrix(trainmatrix), as.factor(traindata$topics))

Dòng cuối cùng đưa ra lỗi dưới đây:

Error in sort.list(y) : 'x' must be atomic for 'sort.list'

Bạn đã gọi 'sắp xếp' trong danh sách chưa?

Tôi đã thử sử dụng

model <- naiveBayes(as.matrix(trainmatrix), as.factor(unlist(traindata$topics)))

nhưng có lỗi:

Error in tapply(var, y, mean, na.rm = TRUE) : 
  arguments must have same length

1
Không phải Bayes là một phân loại nhị phân? Trong R theo mặc định?. Đó có thể là lý do tại sao bạn gặp lỗi
Rahul Aedula

Câu trả lời:


1

Vì nhìn chung, Naive bayes alogorithms được thực hiện bởi hầu hết các thư viện không hỗ trợ phân loại đa nhãn. Mặc dù Bạn có thể nghĩ ra thuật toán của riêng mình lấy cảm hứng từ phương pháp tiếp cận ngây thơ.

Đối với một lớp c cụ thể và tài liệu d (có 3 từ w1, w2, w3)

'/' là viết tắt của 'cho' p (a / b) = xác suất (a đã cho b)

Theo định lý vịnh.

p (c / d) = p (c, d) / p (d)

p (c / d) = (p (c) * p (d / c)) / p (d)

Ở đâu:

p (d / c) = p (w1 / c) * p (w2 / c) * p (w3 / c)

Vì các từ được coi là độc lập với nhau.

Và p (w1 / c) có thể thu được bằng cách sử dụng mã của bạn, tính toán số lượng w1 bên trong các tài liệu của lớp c chia cho tổng số w1 trong tất cả các tài liệu hoặc bạn có thể sử dụng logic của riêng mình

Nhưng nếu muốn tránh viết mã chi tiết

bạn có thể cơ cấu lại dữ liệu đầu vào của mình để đạt được phân loại đa nhãn. sao cho một tài liệu đã cho d với n nhãn / lớp (ví dụ d được dán nhãn c1, c2, c3) được mở rộng thành dữ liệu của n mẫu (3 ở đây) của cùng một tài liệu d với nhãn khác nhau mỗi lần ((d, c1), ( d, c2), (d, c3)). Bây giờ bạn có thể truyền dữ liệu này vào bất kỳ thư viện R / python nào hỗ trợ các vịnh ngây thơ đa chiều. Tương tự cần phải được thực hiện trong dữ liệu của bạn là tốt. Hiện tại, bạn đang chuyển các chủ đề traindata $ là biến y (nhãn đào tạo), không có sửa đổi.

Ngay cả sau khi bạn đào tạo dữ liệu của bạn bằng cách sử dụng phương pháp này. Bạn cần sử dụng ngưỡng xác suất, ví dụ 0,2, để các nhãn lớp có xác suất trên 0,2 sẽ được gán cho tài liệu kiểm tra đó.

Cách tiếp cận tốt hơn đòi hỏi phải cơ cấu lại đầu vào của bạn

Nếu bạn có nhãn lớp 'n' thì bạn có thể huấn luyện trình phân loại vịnh ngây thơ nhị phân khác nhau cho mỗi lớp. Ví dụ: để đào tạo trình phân loại cho lớp 'c1', bạn huấn luyện trình phân loại vịnh ngây thơ với biến phụ thuộc Y biểu thị sự hiện diện của lớp c1 trên tài liệu đó là '1' và vắng mặt là '0'.

Sau khi bạn huấn luyện trình phân loại vịnh ngây thơ nhị phân 'n' bằng cách sử dụng phương pháp này. Bây giờ bạn sẽ sử dụng đầu ra của các phân loại n này. ví dụ: nếu trong số này, n bộ phân loại, nếu một bộ phân loại cụ thể, tương ứng với lớp 'c1' có xác suất đầu ra trên 0,5, thì nhãn lớp 'c1' sẽ được gán cho tài liệu thử nghiệm này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.