Ini sebenarnya adalah masalah yang sangat mendalam yang banyak orang dan perusahaan telah kerjakan. Berikut ini beberapa dasar:
Pertama, kita perlu merepresentasikan data dengan baik. Ini melibatkan entah bagaimana mewakili setiap dokumen sebagai vektor dalam ruang dimensi. Idealnya, di ruang ini, kami ingin sampel yang memiliki label yang sama berada di dekatnya dalam jarak euclidean, dan sampel yang merupakan label berbeda berada jauh di jarak euclidean. Langkah ini bisa sangat sulit, tetapi satu representasi coba-dan-benar disebut Term Frequency-Inverse Document Frequency (tf-idf). Di sini, setiap dimensi dalam ruang mewakili kata tertentu, dan nilai dalam dimensi itu untuk sampel tertentu pada dasarnya mewakili berapa kali jumlah kata itu muncul dalam dokumen. Anda dapat membaca lebih lanjut tentang itu di sini . Ada implementasi scikit-belajar yang cukup bagus dari representasi ini jika Anda ingin mencobanya.d
Sekarang data berada dalam ruang yang bermanfaat, tetapi ruang yang benar-benar berdimensi tinggi. Saya akan merekomendasikan mengurangi dimensi ini entah bagaimana, tapi itu subjek keseluruhan untuk utas lainnya.
Akhirnya Anda bisa melatih beberapa algoritma untuk mengklasifikasikan sampel (yang merupakan jawaban dari yang lain). Ada banyak pilihan bagus - jaringan saraf, adaboost, SVM, Naive Bayes, dan model klasifikasi grafis semuanya akan memberikan Anda hasil yang baik. Banyak dari ini juga memiliki implementasi di scikit-belajar.
Tetapi algoritma terbaik memanfaatkan fakta bahwa masalah ini sebenarnya merupakan pembelajaran transfer. Yaitu, distribusi dari mana data pelatihan dan pengujian datang mungkin tidak persis sama - karena hal-hal yang dianggap orang sebagai spam mungkin berbeda dari hal-hal yang orang lain anggap sebagai spam.