Naive Bayes untuk klasifikasi teks Multi-label

8

Cara menggunakan Naive Bayes untuk klasifikasi teks multi-label dalam R.

Saya mencoba menggunakan naiveBayes () dari perpustakaan e1071 tetapi tampaknya saat pelatihan, ia tidak menerima variabel kelas multi-label.

Saya membuat TermDocumentMatrix menggunakan corpus dokumen teks dan mencoba membuat model menggunakan matriks ini dan variabel kelas (daftar topik milik dokumen tertentu). Di bawah ini adalah kode yang saya gunakan.

trainvector <- as.vector(traindata$bodyText)

trainsource <- VectorSource(trainvector)

traincorpus <- Corpus(trainsource)

trainmatrix <- t(TermDocumentMatrix(traincorpus))

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

Baris terakhir memberikan kesalahan di bawah ini:

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

Sudahkah Anda memanggil 'sortir' pada daftar?

Saya mencoba menggunakan

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

tapi ada kesalahan:

Error in tapply(var, y, mean, na.rm = TRUE) : 
  arguments must have same length
Gaurav Joshi
sumber
1
Bukankah Bayes adalah penggolong biner? Di R secara default ?. Mungkin itulah sebabnya Anda mendapatkan kesalahan
Rahul Aedula

Jawaban:

1

Karena secara umum, naif bayes alogorithms yang diterapkan oleh sebagian besar perpustakaan tidak mendukung klasifikasi multilabel. Meskipun Anda dapat merancang algoritma Anda sendiri mengambil inspirasi dari pendekatan bayes naif.

Untuk kelas c tertentu, dan dokumentasikan d (dengan 3 kata w1, w2, w3)

'/' adalah kependekan dari 'diberikan' p (a / b) = probabilitas (a diberikan b)

Sesuai teorema bayes.

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

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

dimana:

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

Karena kata-kata diasumsikan independen satu sama lain.

Dan p (w1 / c) dapat diperoleh dengan menggunakan kode Anda, menghitung jumlah w1 di dalam dokumen kelas c dibagi dengan jumlah keseluruhan w1 di semua dokumen atau Anda dapat menggunakan logika Anda sendiri

Tetapi jika ingin menghindari penulisan kode detail

Anda dapat menyusun ulang data input Anda untuk mencapai klasifikasi multilabel. sedemikian rupa sehingga dokumen yang diberikan d dengan n label / kelas (misalnya d berlabel dengan c1, c2, c3) dapat diperluas menjadi data n sampel (3 di sini) dokumen yang sama d dengan label yang berbeda setiap kali ((d, c1), ( d, c2), (d, c3)). Sekarang Anda dapat meneruskan data ini ke pustaka R / python mana pun yang mendukung multinomial naive bayes. Hal yang sama perlu dilakukan dalam dataset Anda juga. Saat ini, Anda melewatkan $ traindata topik yang merupakan variabel y (label pelatihan) apa adanya, tanpa modifikasi.

Bahkan setelah Anda melatih data Anda menggunakan pendekatan ini. Anda perlu menggunakan ambang probabilitas mis. 0,2, sehingga label kelas dengan probabilitas di atas 0,2 akan ditugaskan untuk dokumen tes tersebut.

Pendekatan yang lebih baik yang membutuhkan restrukturisasi input Anda

Jika Anda memiliki label kelas 'n' maka Anda dapat melatih 'n' classifier biner naive bayes yang berbeda untuk masing-masing kelas. Misalnya, untuk melatih classifier untuk kelas 'c1', Anda melatih classifier naif bayes dengan variabel dependen Y yang menunjukkan keberadaan kelas c1 pada dokumen itu sebagai '1' dan absen sebagai '0'.

Setelah Anda melatih 'n' binary bayes naive classifier menggunakan pendekatan ini. Anda sekarang akan menggunakan output dari n classifier ini. misalnya jika di luar ini, n classifier, jika classifier tertentu, yang sesuai dengan kelas 'c1' memiliki probabilitas output di atas 0,5, maka label kelas 'c1' akan ditugaskan untuk dokumen uji ini.

Alok Nayak
sumber