Sizin gibi okuyucular MUO'yu desteklemeye yardımcı oluyor. Sitemizdeki bağlantıları kullanarak bir satın alma işlemi gerçekleştirdiğinizde, bir ortaklık komisyonu kazanabiliriz. Devamını oku.

Hemen hemen her e-posta gönderme veya mesajlaşma platformunda bir spam filtresi vardır. Filtre, gelen her postayı veya mesajı inceler ve spam veya ham olarak sınıflandırır. Gelen kutunuz jambonun altına düşenleri görüntüler. Spam kapsamına giren iletileri reddeder veya ayrı olarak görüntüler.

Ana kitaplıklar olarak NLTK, regex ve scikit-learn'ü kullanarak kendi spam filtrenizi oluşturabilirsiniz. Modelinizi eğitmek için bir veri kümesine de ihtiyacınız olacak.

Veri Kümenizi Anlamak

"Temel NLP için Spam Sınıflandırması" ücretsiz olarak kullanılabilir Kaggle veri kümesi. Spam ve ham ham posta mesajlarının bir karışımını içerir. 5.796 satır ve 3 sütuna sahiptir.

bu KATEGORİ sütunu, bir iletinin spam mı yoksa jambon mu olduğunu gösterir. Bir numara spam'i, sıfır ise ham'ı temsil eder. bu İLETİ sütun gerçek ham postayı içerir. bu DOSYA ADI kategori, benzersiz bir mesaj tanımlayıcısıdır.

instagram viewer

Ortamınızı Hazırlamak

Takip etmek için bir temel Python anlayışı ve makine öğrenimi. Ayrıca çalışmak için rahat olmalısınız. Google İşbirliği veya Jüpyter Defter.

Jupyter Notebook için, projenin bulunmasını istediğiniz klasöre gidin. Yeni bir sanal ortam oluşturun ve Jupyter Notebook'u bu klasörden çalıştırın. Google Colab'ın bu adıma ihtiyacı yoktur. Google Colab veya Jupyter Notebook'ta yeni bir not defteri oluşturun.

Tam kaynak kodu ve veri kümesi bir GitHub deposu.

Gerekli kitaplıkları yüklemek için aşağıdaki sihirli komutu çalıştırın.

!pip kurulumu nltk scikit-learn regex numpy pandas

Kullanacaksınız:

  • NLTK için doğal dil işleme (NLP).
  • makine öğrenimi modelini oluşturmak için scikit-learn.
  • normal ifadelerle çalışmak için regex.
  • Dizilerle çalışmak için NumPy.
  • Veri kümenizi işlemek için pandalar.

Kitaplıkları İçe Aktar

Ortamınıza kurduğunuz kitaplıkları içe aktarın. Normal ifade kitaplığını yeniden ve scikit-learn olarak sklearn olarak içe aktarın.

içe aktarmak pandalar gibi pd
içe aktarmak dizi gibi np
içe aktarmak nltk
itibaren nltk.stem içe aktarmak WordNetLemmatizer
itibaren nltk.corpus içe aktarmak gizli kelimeler
içe aktarmak tekrar
itibaren sklearn.model_selection içe aktarmak train_test_split
itibaren sklearn.metrics içe aktarmak sınıflandırma_raporu
itibaren sklearn.feature_extraction.text içe aktarmak SayıVektörleştirici
itibaren sklearn.feature_extraction.text içe aktarmak TfidfVektörleştirici

Veri kümesindeki ham iletileri önceden işlemek için NLTK'den WordNetLemmatizer ve engellenecek sözcükler modüllerini kullanacaksınız. Model oluşturma sırasında içe aktarılan sklearn modüllerini kullanacaksınız.

Verileri Ön İşleme

Veri kümesini yüklemek için pandas read_csv işlevini çağırın. Veri kümesini projenizle aynı dizinde sakladığınızdan emin olun. Veri kümesinin görselini elde etmek için veri kümesinin ilk beş satırını görüntüleyin.

df = pd.read_csv('/content/NLP.csv için Spam E-posta ham metni')
df.head()

Veri kümesinin FILE_NAME sütununu bırakın. Spam sınıflandırması için kullanışlı bir özellik değildir.

df.bırak('DOSYA ADI', eksen=1, yerine=Doğru)

Veri kümesindeki ham ve spam posta sayısını kontrol edin. Bu, daha sonra model eğitimi ve testi için verileri nasıl böleceğinizi belirlemenize yardımcı olacaktır.

df. CATEGORY.value_counts()

Korpus stopwords'ü NLTK kitaplığından indirin. Durdurulacak kelimeler, yaygın olarak kullanılan bir dizi kelimedir. Ön işleme onları mesajlardan kaldırır. İngilizce stopwords yükleyin ve onları bir stopword değişkeninde saklayın.

nltk.indir("kilit kelimeler")
stopword = nltk.corpus.stopwords.words('İngilizce')

Açık Çok Dilli WordNet'i indirin. İngilizce kelimelerin ve anlamsal anlamlarının sözcüksel bir veritabanıdır.

nltk.indir("omw-1.4")

Wordnet külliyatını indirin. Metin sınıflandırması için kullanacaksınız. Bir WordNetLemmatizer() nesnesi oluşturun. Lemmatizasyon sırasında nesneyi kullanacaksınız. Lemmatizasyon, NLP'de kelimelerin türetme biçimlerini sözlük anlamlarına indirgemek için kullanılan bir tekniktir.

Örneğin: “cats” kelimesini azaltmak size “cat” kelimesini verecektir. Lemmatizasyondan sonra bir kelime bir lemmaya dönüşür.

nltk.indir("wordnet")
lemmatizer = WordNetLemmatizer()

Önceden işlenmiş mesajları saklamak için kullanacağınız boş bir liste oluşturun.

külliyat=[]

Veri kümesinin MESSAGE sütunundaki her iletiyi işlemek için bir for döngüsü oluşturun. Alfasayısal olmayan tüm karakterleri kaldırın. Mesajı küçük harfe dönüştürün. Metni kelimelere ayırın. Stopwords'ü kaldırın ve kelimeleri lemmatize edin. Kelimeleri tekrar cümlelere dönüştürün. Önceden işlenmiş mesajı korpus listesine ekleyin.

için Ben içinde aralık (uzunluk (df)):
# alfasayısal olmayan tüm karakterleri kaldırma
mesaj = re.sub("[^a-zA-Z0-9]", ' ', df['İLETİ'][Ben])

# mesajı küçük harfe dönüştürme
mesaj = mesaj.lower()

# lemmatizasyon için cümleyi kelimelere bölme
mesaj = mesaj.split()

# gizli sözcükleri kaldırma ve lemmatize etme
mesaj = [lemmatizer.lemmatize (kelime) için kelime içinde İleti
eğer kelime Olumsuziçinde set (stopwords.words('İngilizce'))]

# Kelimeleri tekrar cümleye dönüştürme
mesaj = ' '.join (mesaj)

# Önişlenmiş mesajın korpus listesine eklenmesi
corpus.append (mesaj)

Bu döngünün çalışması yaklaşık beş dakika sürecektir. Engellenen sözcükleri lemmatize etme ve kaldırma adımı çoğu zaman alır. Artık verilerinizi önceden işlediniz.

TF-IDF Tekniğine Karşı Sözcük Torbası Modelini Kullanan Özellik Mühendisliği

Özellik mühendisliği, ham veri özelliklerini makine öğrenimi modellerine uygun yeni özelliklere dönüştürme işlemidir.

Kelime Çantası Modeli

Kelime çantası modeli, metin verilerini belgede bulunan kelimelerin sıklık dağılımı olarak temsil eder. Bu, basitçe bir kelimenin bir belgede kaç kez geçtiğidir.

Metin verilerini sayısal vektörlere dönüştürmek için scikit-learn'deki CountVectorizer sınıfını kullanın. Önceden işlenmiş mesajların külliyatını sığdırın ve külliyatı seyrek bir matrise dönüştürün.

# En iyi 2500 özelliği alın 
cv = CountVectorizer (max_features=2500, ngram_aralığı=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORİ']

Dönüştürülen verileri eğitim ve test setlerine ayırın. Verilerin yüzde yirmisini test için ve yüzde seksenini eğitim için kullanın.

x_train, x_test, y_train, y_test = tren_test_split(
X, y, test_size=0.20, rastgele_durum=1, tabakalandırma=y)

Kelime çantası modeli, veri kümesindeki mesajları doğru bir şekilde sınıflandıracaktır. Ancak kendi mesajlarınızı sınıflandırmada iyi performans göstermez. Mesajların anlamsal anlamını dikkate almaz. Yalnızca veri kümesindeki iletileri sınıflandırmak için bu tekniği kullanın.

TF-IDF Tekniği

Terim Sıklığı-Ters Belge Sıklığı (TF-IDF), bir belgedeki sözcüklere ne sıklıkta göründüklerine bağlı olarak ağırlıklar atayarak çalışır. TF-IDF, bir belgede sıklıkla görülen ancak daha yüksek ağırlığa sahip külliyatta nadir bulunan sözcükleri verir. Bu, makine öğrenimi algoritmalarının metnin anlamını daha iyi anlamasına olanak tanır.

tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (korpus).toarray()

x_train, x_test, y_train, y_test = tren_test_split(
X, y, test_size=0.20, rastgele_durum=1, tabakalandırma=y)

Mesajlardan semantik anlam çıkarmak ve kendi mesajlarınızı sınıflandırmak için TF-IDF'yi kullanın.

Modelinizi Oluşturma ve Eğitme

Scikit-learn MultinomialNB sınıfını kullanarak bir Naive Bayes modeli oluşturup başlatarak başlayın.

model = MultinomialNB()

Modelin eğitim seti üzerinde çalışmasına izin vererek eğitim verilerini sığdırın:

model.fit (x_train, y_train)

Ardından, tahmin yöntemini kullanarak eğitim ve test kümeleri üzerinde tahminler yapın.

train_pred = model.predict (x_train)
test_pred = model.predict (x_test)

Bu tahminler, modelinizi değerlendirmenize yardımcı olacaktır.

Model Değerlendirmesi

scikit-learn'den Classification_report işlevini kullanarak modelinizin performansını değerlendirin. Eğitim seti tahminlerini ve gerçek eğitim seti etiketlerini girdi olarak iletin. Test seti için de aynısını yapın.

yazdır (sınıflandırma_raporu (train_pred, y_train))
yazdır (sınıflandırma_raporu (test_pred, y_test))

Her iki sınıf için kesinlik, hatırlama ve doğruluk ne kadar yüksekse, model o kadar iyi olur.

Kendi Mesajlarınızı Sınıflandırmanın Sonuçları

TF-IDF tekniğini kullanarak mesajı bir vektöre dönüştürün. Modeli kullanarak mesajın spam mı yoksa jambon mu olduğunu tahmin edin, ardından bu tahmini ekranda görüntüleyin.

Yazdır('Tahmin...')

mesaj = ["10000 dolar kazandınız, lütfen hesabınızı belirtin
detaylar, parayı transfer edebilmemiz için"]

message_vector = tf.transform (mesaj)
kategori = model.predict (mesaj_vektörü)
Yazdır("Mesaj şu", "istenmeyen e-posta"eğer kategori == 1başka"spam değil")

Mesajı kendi mesajınla değiştir.

Çıktı aşağıdaki gibidir:

Model, yeni görünmeyen mesajları spam veya ham olarak sınıflandırabilir.

Uygulamalarda Spam Sınıflandırmasının Karşılaştığı Zorluk

Uygulamalarda spam sınıflandırmasının karşılaştığı temel zorluk, mesajların yanlış sınıflandırılmasıdır. Makine öğrenimi modelleri her zaman doğru değildir. Spam'i jambon olarak sınıflandırabilirler ve bunun tersi de geçerlidir. Jambon'un spam olarak sınıflandırılması durumunda, bir program e-postayı kullanıcının gelen kutusundan kaldırarak önemli mesajları kaçırmasına neden olabilir.