Er is een spamfilter in bijna elk e-mail- of berichtenplatform. Het filter onderzoekt elke e-mail of elk bericht zodra het binnenkomt en classificeert het als spam of ham. Je inbox toont degenen die onder ham vallen. Het weigert, of geeft afzonderlijk de berichten weer die onder spam vallen.
U kunt uw eigen spamfilter maken met NLTK, regex en scikit-learn als hoofdbibliotheken. U hebt ook een dataset nodig om uw model te trainen.
Inzicht in uw dataset
"Spamclassificatie voor Basic NLP" is vrij verkrijgbaar Kaggle-gegevensset. Het bevat een mix van spam en rauwe ham-mailberichten. Het heeft 5.796 rijen en 3 kolommen.
De CATEGORIE kolom geeft aan of een bericht spam of ham is. Nummer één staat voor spam, terwijl nul staat voor ham. De BERICHT kolom bevat de daadwerkelijke onbewerkte e-mail. De BESTANDSNAAM categorie is een unieke bericht-ID.
Uw omgeving voorbereiden
Om mee te volgen, moet je een basiskennis van Python en machinaal leren. Je moet er ook prettig mee kunnen werken Google Colab of Jupyter-notebook.
Navigeer voor Jupyter Notebook naar de map waarin u het project wilt hebben. Maak een nieuwe virtuele omgeving en voer de Jupyter Notebook uit vanuit deze map. Google Colab heeft deze stap niet nodig. Maak een nieuw notitieboek in Google Colab of Jupyter Notebook.
De volledige broncode en de dataset zijn beschikbaar in een GitHub-opslagplaats.
Voer de volgende magische opdracht uit om de vereiste bibliotheken te installeren.
!pip install nltk scikit-leer regex numpy panda's
Je gebruikt:
- NLTK voor natuurlijke taalverwerking (NLP).
- scikit-learn om het machine learning-model te maken.
- regex voor het werken met reguliere expressies.
- NumPy voor het werken met arrays.
- Panda's om uw dataset te manipuleren.
Bibliotheken importeren
Importeer de bibliotheken die u in uw omgeving hebt geïnstalleerd. Importeer de regex-bibliotheek als re en scikit-learn als sklearn.
importeren panda's als pd
importeren onnozel als np
importeren nltk
van nltk.stem importeren WordNetLemmatizer
van nltk.corpus importeren stopwoorden
importeren met betrekking tot
van sklearn.model_selection importeren train_test_split
van sleren.metrics importeren classificatie_rapport
van sklearn.feature_extraction.text importeren CountVectorizer
van sklearn.feature_extraction.text importeren TfidfVectorizer
Je gebruikt WordNetLemmatizer en stopwoordmodules van NLTK om de onbewerkte berichten in de dataset voor te verwerken. U gebruikt geïmporteerde sklearn-modules tijdens het bouwen van modellen.
Het voorbewerken van de gegevens
Roep de functie pandas read_csv aan om de dataset te laden. Zorg ervoor dat u de dataset opslaat in dezelfde map als uw project. Geef de eerste vijf rijen van de dataset weer om een visual van de dataset te krijgen.
df = pd.read_csv('/content/Spam E-mail onbewerkte tekst voor NLP.csv')
df.hoofd()
Zet de kolom FILE_NAME van de dataset neer. Het is geen handige functie voor spamclassificatie.
df.drop('BESTANDSNAAM', as=1, plaats=WAAR)
Controleer op het aantal ham- en spammail in de dataset. Dit zal u later helpen bepalen hoe u de gegevens splitst voor modeltraining en -testen.
df. CATEGORIE.value_counts()
Download de corpusstopwoorden uit de NLTK-bibliotheek. Stopwoorden zijn een reeks veel voorkomende woorden. Voorverwerking verwijdert ze uit berichten. Laad de Engelse stopwoorden en sla ze op in een stopwoordvariabele.
nltk.download('stopwoorden')
stopwoord = nltk.corpus.stopwords.words('Engels')
Download het open Meertalige WordNet. Het is een lexicale database van Engelse woorden en hun semantische betekenis.
nltk.download('omw-1.4')
Download het wordnet-corpus. U zult het gebruiken voor tekstclassificatie. Een WordNetLemmatizer()-object instantiëren. U gebruikt het object tijdens het lemmatiseren. Lemmatisering is een techniek die in NLP wordt gebruikt om afgeleide vormen van woorden terug te brengen tot hun woordenboekbetekenis.
Bijvoorbeeld: als u het woord "katten" verkleint, krijgt u "kat". Een woord na lemmatisering wordt een lemma.
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
Maak een lege lijst die u gaat gebruiken om de voorverwerkte berichten op te slaan.
corpus=[]
Maak een for-lus om elk bericht in de MESSAGE-kolom van de dataset te verwerken. Verwijder alle niet-alfanumerieke tekens. Converteer het bericht naar kleine letters. Splits de tekst op in woorden. Verwijder de stopwoorden en lemmatiseer de woorden. Zet de woorden weer om in zinnen. Voeg het voorbewerkte bericht toe aan de corpuslijst.
voor i in bereik (lens (df)):
# alle niet-alfanumerieke tekens verwijderen
bericht = re.sub('[^a-zA-Z0-9]', ' ', df['BERICHT'][i])# het bericht converteren naar kleine letters
bericht = bericht.lager()# de zin opsplitsen in woorden voor lemmatisering
bericht = bericht.split()# Stopwoorden verwijderen en lemmatiseren
message = [lemmatizer.lemmatize (woord) voor woord in bericht
als woord nietin set (stopwoorden.woorden('Engels'))]# De woorden weer omzetten in zinnen
bericht = ' '.join (bericht)
# Het voorbewerkte bericht toevoegen aan de corpuslijst
corpus.append (bericht)
Deze lus duurt ongeveer vijf minuten. De stap lemmatiseren en stopwoorden verwijderen neemt de meeste tijd in beslag. U heeft uw gegevens nu voorbewerkt.
Feature Engineering met behulp van het Bag-of-Words-model versus TF-IDF-techniek
Feature engineering is het proces van het omzetten van onbewerkte gegevensfuncties in nieuwe functies die geschikt zijn voor machine learning-modellen.
Bag-of-Words-model
Het bag-of-words-model geeft tekstgegevens weer als een frequentieverdeling van woorden die in het document aanwezig zijn. Dit is simpelweg het aantal keren dat een woord voorkomt in een document.
Gebruik de klasse CountVectorizer van scikit-learn om de tekstgegevens om te zetten in numerieke vectoren. Pas het corpus van voorverwerkte berichten aan en transformeer het corpus in een schaarse matrix.
# Neem de top 2500 functies
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['CATEGORIE']
Splits de getransformeerde gegevens op in trainings- en testsets. Gebruik twintig procent van de data voor testen en tachtig procent voor training.
x_train, x_test, y_train, y_test = train_test_split(
X, y, testgrootte=0.20, willekeurige_status=1, stratificeren=y)
Het bag-of-words-model zal de berichten in de dataset correct classificeren. Maar zal niet goed presteren bij het classificeren van uw eigen berichten. Het houdt geen rekening met de semantische betekenis van de berichten. Gebruik deze techniek om alleen de berichten in de dataset te classificeren.
TF-IDF-techniek
De Term Frequency-Inverse Document Frequency (TF-IDF) werkt door gewichten toe te kennen aan woorden in een document op basis van hoe vaak ze voorkomen. TF-IDF geeft woorden die vaak voorkomen in een document, maar zeldzaam zijn in het hogere gewicht van het corpus. Hierdoor kunnen machine learning-algoritmen de betekenis van de tekst beter begrijpen.
tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (corpus).toarray()
x_train, x_test, y_train, y_test = train_test_split(
X, y, testgrootte=0.20, willekeurige_status=1, stratificeren=y)
Gebruik TF-IDF om semantische betekenis uit de berichten te halen en uw eigen berichten te classificeren.
Uw model maken en trainen
Begin met het maken en initialiseren van een Naive Bayes-model met behulp van de scikit-learn MultinomialNB-klasse.
model = MultinominaalNB()
Pas de trainingsgegevens aan, zodat het model kan trainen op de trainingsset:
model.fit (x_train, y_train)
Doe vervolgens voorspellingen op de trainings- en testsets met behulp van de predict-methode.
train_pred = model.predict (x_train)
test_pred = model.predict (x_test)
Deze voorspellingen helpen u bij het evalueren van uw model.
Modelevaluatie
Evalueer de prestaties van uw model met behulp van de classificatie_report-functie van scikit-learn. Geef de voorspellingen van de trainingsset en de daadwerkelijke labels van de trainingsset door als invoer. Doe hetzelfde voor de testset.
afdrukken (classificatie_rapport (train_pred, y_train))
afdrukken (classificatie_rapport (test_pred, y_test))
Hoe hoger de precisie, herinnering en nauwkeurigheid voor beide klassen, hoe beter het model.
Resultaten van het classificeren van uw eigen berichten
Transformeer het bericht in een vector met behulp van de TF-IDF-techniek. Gebruik het model om te voorspellen of het bericht spam of ham is en geef die voorspelling vervolgens weer op het scherm.
afdrukken('Voorspellen...')
bericht = ["Je hebt 10.000 dollar gewonnen, geef alsjeblieft je account op
details, zodat we het geld kunnen overmaken"]
message_vector = tf.transform (bericht)
categorie = model.predict (message_vector)
afdrukken("De boodschap is", "spam"als categorie == 1anders"geen spam")
Vervang het bericht door uw eigen bericht.
De uitvoer is als volgt:
Het model kan nieuwe ongeziene berichten classificeren als spam of ham.
De uitdaging voor spamclassificatie in applicaties
De grootste uitdaging voor spamclassificatie in applicaties is de verkeerde classificatie van berichten. Machine learning-modellen zijn niet altijd correct. Ze kunnen spam classificeren als ham en vice versa. In het geval dat ham als spam wordt geclassificeerd, kan een programma e-mail uit de inbox van de gebruiker verwijderen, waardoor ze belangrijke berichten missen.