-
Notifications
You must be signed in to change notification settings - Fork 0
/
naiveBayesSpamClassifier.py
63 lines (44 loc) · 1.63 KB
/
naiveBayesSpamClassifier.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import os
import io
from pandas import DataFrame
from sklearn. feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
def readFile(path):
for root, dirname, 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 readFile(path):
rows.append({"message":message, 'class':classification})
index.append(filename)
return DataFrame(rows,index=index)
data= DataFrame({'message':[], 'class':[]})
data= data.append(dataFrameFromDirectory('emails/spam','spam'))
data= data.append(dataFrameFromDirectory('emails/ham','ham'))
print(data.head())
vectorizer= CountVectorizer()
#token each work into a numbers
counts= vectorizer.fit_transform(data['message'].values)
#perform the the Naive Bayers.
classifier= MultinomialNB()
target= data['class'].values
classifier.fit(counts, target)
test= ['Low selling viagra now!!', "Hi Samuel, how about a hackthon tomorrow?"]
test_counts= vectorizer.transform(test)
#test the model to see if it can if identify the first message as spam and the second one
#as ham.
predictions= classifier.predict(test_counts)
print(predictions)