Ada filter spam di hampir setiap platform email atau perpesanan. Filter memeriksa setiap email atau pesan saat tiba dan mengklasifikasikannya sebagai spam atau ham. Kotak masuk Anda menampilkan yang termasuk dalam ham. Itu menolak, atau menampilkan secara terpisah, pesan yang termasuk dalam spam.
Anda dapat membuat filter spam Anda sendiri menggunakan NLTK, regex, dan scikit-learn sebagai perpustakaan utama. Anda juga memerlukan kumpulan data untuk melatih model Anda.
Memahami Kumpulan Data Anda
"Klasifikasi Spam untuk NLP Dasar" tersedia secara bebas Kumpulan data Kaggle. Ini berisi campuran pesan email spam dan ham mentah. Ini memiliki 5.796 baris dan 3 kolom.
Itu KATEGORI kolom menunjukkan apakah pesan adalah spam atau ham. Nomor satu mewakili spam sedangkan nol mewakili ham. Itu PESAN kolom berisi surat mentah yang sebenarnya. Itu NAMA FILE kategori adalah pengidentifikasi pesan unik.
Mempersiapkan Lingkungan Anda
Untuk mengikuti, Anda harus memiliki pemahaman dasar tentang Python dan pembelajaran mesin. Anda juga harus merasa nyaman bekerja dengannya Google Colab atau Notebook Jupyter.
Untuk Jupyter Notebook, navigasikan ke folder tempat Anda ingin proyek berada. Buat lingkungan virtual baru dan jalankan Notebook Jupyter dari folder ini. Google Colab tidak memerlukan langkah ini. Buat notebook baru di Google Colab atau Jupyter Notebook.
Kode sumber lengkap dan kumpulan data tersedia di a repositori GitHub.
Jalankan perintah ajaib berikut untuk menginstal pustaka yang diperlukan.
!pip install nltk scikit-learn regex numpy pandas
Anda akan menggunakan:
- NLTK untuk pemrosesan bahasa alami (NLP).
- scikit-belajar untuk membuat model pembelajaran mesin.
- regex untuk bekerja dengan ekspresi reguler.
- NumPy untuk bekerja dengan array.
- Panda untuk memanipulasi kumpulan data Anda.
Impor Perpustakaan
Impor perpustakaan yang Anda instal di lingkungan Anda. Impor pustaka regex sebagai re dan scikit-learn sebagai sklearn.
impor panda sebagai pd
impor numpy sebagai np
impor nltk
dari nltk.stem impor WordNetLemmatizer
dari nltk.corpus impor stopwords
impor ulang
dari sklearn.model_selection impor train_test_split
dari sklearn.metrics impor klasifikasi_laporan
dari sklearn.feature_extraction.text impor CountVectorizer
dari sklearn.feature_extraction.text impor TfidfVectorizer
Anda akan menggunakan modul WordNetLemmatizer dan stopwords dari NLTK untuk melakukan praproses pesan mentah dalam kumpulan data. Anda akan menggunakan modul sklearn yang diimpor selama pembuatan model.
Pra-pemrosesan Data
Panggil fungsi read_csv panda untuk memuat dataset. Pastikan Anda menyimpan kumpulan data di direktori yang sama dengan proyek Anda. Tampilkan lima baris pertama dari kumpulan data untuk mendapatkan visual dari kumpulan data tersebut.
df = pd.baca_csv('/content/Spam Email teks mentah untuk NLP.csv')
df.head()
Jatuhkan kolom FILE_NAME dari kumpulan data. Ini bukan fitur yang berguna untuk klasifikasi spam.
df.drop('NAMA FILE', sumbu =1, di tempat =BENAR)
Periksa jumlah email ham dan spam di kumpulan data. Ini nantinya akan membantu Anda menentukan cara membagi data untuk pelatihan dan pengujian model.
df. CATEGORY.nilai_jumlah()
Unduh kata kunci korpus dari perpustakaan NLTK. Stopwords adalah sekumpulan kata yang sering muncul. Preprocessing menghapusnya dari pesan. Muat stopword bahasa Inggris dan simpan dalam variabel stopword.
nltk.unduh('kata henti')
stopword = nltk.corpus.stopwords.words('bahasa inggris')
Unduh WordNet Multibahasa terbuka. Ini adalah basis data leksikal kata-kata bahasa Inggris dan makna semantiknya.
nltk.unduh('omw-1.4')
Unduh corpus wordnet. Anda akan menggunakannya untuk klasifikasi teks. Membuat instance objek WordNetLemmatizer(). Anda akan menggunakan objek selama lemmatisasi. Lemmatisasi adalah teknik yang digunakan dalam NLP untuk mereduksi bentuk derivasi kata menjadi makna kamusnya.
Misalnya: Mengurangi kata "kucing" akan menghasilkan "kucing". Sebuah kata setelah lemmatisasi menjadi lemma.
nltk.unduh('jaring kata')
lemmatizer = WordNetLemmatizer()
Buat daftar kosong yang akan Anda gunakan untuk menyimpan pesan yang diproses sebelumnya.
korpus=[]
Buat loop for untuk memproses setiap pesan di kolom MESSAGE dari kumpulan data. Hapus semua karakter non-alfanumerik. Ubah pesan menjadi huruf kecil. Pisahkan teks menjadi kata-kata. Hapus stopwords dan lemmatize kata-kata. Mengubah kata kembali menjadi kalimat. Tambahkan pesan yang telah diproses sebelumnya ke dalam daftar korpus.
untuk Saya di dalam rentang (len (df)):
# menghapus semua karakter non-alfanumerik
pesan = re.sub('[^a-zA-Z0-9]', ' ', df['PESAN'][Saya])# mengubah pesan menjadi huruf kecil
pesan = pesan.lower()# membelah kalimat menjadi kata-kata untuk lemmatisasi
pesan = pesan.split()# menghapus stopwords dan lemmatizing
pesan = [lemmatizer.lemmatize (kata) untuk kata di dalam pesan
jika kata bukandi dalam atur (stopwords.words('bahasa inggris'))]# Mengubah kata-kata kembali menjadi kalimat
pesan = ' '.gabung (pesan)
# Menambahkan pesan yang diproses sebelumnya ke daftar korpus
corpus.append (pesan)
Putaran ini akan memakan waktu sekitar lima menit untuk dijalankan. Langkah lemmatizing dan menghapus stopwords mengambil sebagian besar waktu. Anda sekarang telah memproses data Anda.
Rekayasa Fitur Menggunakan Model Bag-of-Words vs Teknik TF-IDF
Rekayasa fitur adalah proses mengubah fitur data mentah menjadi fitur baru yang cocok untuk model pembelajaran mesin.
Model Bag-of-Words
Model bag-of-words merepresentasikan data teks sebagai distribusi frekuensi kata-kata yang ada dalam dokumen. Ini hanyalah berapa kali sebuah kata muncul dalam sebuah dokumen.
Gunakan kelas CountVectorizer dari scikit-learn untuk mengonversi data teks menjadi vektor numerik. Sesuaikan korpus pesan yang telah diproses sebelumnya dan ubah korpus menjadi matriks renggang.
# Ambil 2500 fitur teratas
cv = CountVectorizer (max_features=2500, ngram_rentang=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORI']
Pisahkan data yang diubah menjadi set pelatihan dan pengujian. Gunakan dua puluh persen data untuk pengujian dan delapan puluh persen untuk pelatihan.
x_train, x_test, y_train, y_test = train_test_split(
X, y, ukuran_tes=0.20, status_acak=1, bertingkat=y)
Model bag-of-words akan mengklasifikasikan pesan dalam dataset dengan benar. Tetapi tidak akan berfungsi dengan baik dalam mengklasifikasikan pesan Anda sendiri. Itu tidak memperhitungkan makna semantik dari pesan. Untuk hanya mengklasifikasikan pesan dalam kumpulan data, gunakan teknik ini.
Teknik TF-IDF
Term Frequency-Inverse Document Frequency (TF-IDF) bekerja dengan memberi bobot pada kata-kata dalam dokumen berdasarkan seberapa sering kata tersebut muncul. TF-IDF memberikan kata-kata yang sering muncul dalam dokumen tetapi jarang di korpus dengan bobot lebih tinggi. Ini memungkinkan algoritme pembelajaran mesin untuk lebih memahami arti teks.
tf = TfidfVectorizer (ngram_range=(1,3), fitur_maks=2500)
X = tf.fit_transform (corpus).toarray()
x_train, x_test, y_train, y_test = train_test_split(
X, y, ukuran_tes=0.20, status_acak=1, bertingkat=y)
Untuk mengekstrak makna semantik dari pesan dan mengklasifikasikan pesan Anda sendiri, gunakan TF-IDF.
Membuat dan Melatih Model Anda
Mulailah dengan membuat dan menginisialisasi model Naive Bayes menggunakan kelas MultinomialNB scikit-learn.
model = MultinomialNB()
Paskan data pelatihan, memungkinkan model untuk berlatih di set pelatihan:
model.cocok (x_train, y_train)
Kemudian membuat prediksi pada training dan testing set dengan menggunakan metode predict.
train_pred = model.prediksi (x_train)
test_pred = model.prediksi (x_test)
Prediksi ini akan membantu Anda mengevaluasi model Anda.
Evaluasi Model
Evaluasi performa model Anda menggunakan fungsi classification_report dari scikit-learn. Lewati prediksi set pelatihan dan label set pelatihan yang sebenarnya sebagai input. Lakukan hal yang sama untuk set tes.
cetak (classification_report (train_pred, y_train))
cetak (classification_report (test_pred, y_test))
Semakin tinggi presisi, daya ingat, dan akurasi untuk kedua kelas, semakin baik modelnya.
Hasil Mengklasifikasikan Pesan Anda Sendiri
Ubah pesan menjadi vektor menggunakan teknik TF-IDF. Gunakan model untuk memprediksi apakah pesan tersebut spam atau ham, lalu tampilkan prediksi tersebut di layar.
mencetak('Memprediksi...')
pesan = ["Anda memenangkan 10.000 dolar, harap berikan akun Anda
detail, Agar kami dapat mentransfer uang"]
message_vector = tf.transform (pesan)
kategori = model.prediksi (message_vector)
mencetak("Pesan adalah", "spam"jika kategori == 1kalau tidak"bukan spam")
Ganti pesan dengan pesan Anda sendiri.
Outputnya adalah sebagai berikut:
Model dapat mengklasifikasikan pesan tak terlihat baru sebagai spam atau ham.
Tantangan Menghadapi Klasifikasi Spam di Aplikasi
Tantangan utama yang dihadapi klasifikasi spam dalam aplikasi adalah kesalahan klasifikasi pesan. Model pembelajaran mesin tidak selalu benar. Mereka dapat mengklasifikasikan spam sebagai ham dan sebaliknya. Dalam kasus mengklasifikasikan ham sebagai spam, sebuah program dapat menghapus email dari kotak masuk pengguna, menyebabkan mereka melewatkan pesan penting.