Naive Bayes
Table Of Contents
sklearn.naive_bayes can be used to train something like a spam classifier.
In [1]:
import os
import io
import numpy
import pandas as pd
from pandas import DataFrame
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNBIn [2]:
def readFiles(path):
for root, dirnames, filenames in os.walk(path):
for filename in filenames:
path = os.path.join(root, filename)
inBody = False
lines = []
f = io.open(path, 'r', encoding='latin1')
for line in f:
if inBody:
lines.append(line)
elif line == '\n':
inBody = True
f.close()
message = '\n'.join(lines)
yield path, message
def dataFrameFromDirectory(path, classification):
rows = []
index = []
for filename, message in readFiles(path):
rows.append({'message': message, 'class': classification})
index.append(filename)
return DataFrame(rows, index=index)In [3]:
data = DataFrame({'message': [], 'class': []})
data = pd.concat([data, dataFrameFromDirectory("emails/spam", "spam")]);
data = pd.concat([data, dataFrameFromDirectory("emails/ham", "ham")])
# INSPECT the dataframe
data.head()Out [3]:
Vectorize Text with CountVectorize
SkLearn CountVectorizer DOCSSplit up each message into its list of words.
Store the vectorized data in a MultinomialNB classifier.
Call
fit() and voila - a trained spam filter.In [4]:
vectorizer = CountVectorizer()
counts = vectorizer.fit_transform(data['message'].values)
targets = data['class'].values
print(f'first target: {targets[:1]}\n')
print(f'counts: {counts}\n')
print(f'get_feature_names_out: {vectorizer.get_feature_names_out()}\n')
print(f'first 5 feature names...: {vectorizer.get_feature_names_out()[:5]}')
print(counts.toarray())In [5]:
classifier = MultinomialNB()
classifier.fit(counts, targets)Out [5]:
In [6]:
examples = ['Free Viagra now!!!', "Hi Bob, how about a game of golf tomorrow?"]
example_counts = vectorizer.transform(examples)
predictions = classifier.predict(example_counts)
for idx, exampleText in enumerate(examples):
# print(f'Text: {exampleText} is probably a {predictions[exampleIdx]}')
print(f'{predictions[idx]}\t"{exampleText}"')Page Tags:
python
data-science
jupyter
learning
numpy