Я новичок в Python, и я пытался создать наивный байесовский классификатор, но, похоже, он расставляет приоритеты Spam, а не Ham.Я знаю, это много, чтобы спросить, но я надеялся, что кто-то, кто был знаком с Наивным Байесом, мог указать, что я сделал неправильно.В качестве примечания: я пропустил знаменатель части наивного уравнения Байеса;общий знаменатель не должен иметь значения, верно?
Вот ссылка на руководство, за которым я следовал: https://towardsdatascience.com/unfolding-na%C3%AFve-bayes-from-scratch-2e86dcae4b01
А вот мой код:
import csv
ham = 0
spam = 0
dictionarySpam = {}
dictionaryHam = {}
dictionaryTotal = {}
userString = input("Enter your string")
userString = userString.replace('.', ' ')
a = "!@#$%^&*()_+=-?,><':;[]/"
userStringList = userString.split()
print(userStringList)
totalNumHam = 0
with open('spam.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
if "ham" in row[0]:
ham += 1
elif "spam" in row[0]:
spam += 1
words = row[1].split()
for word in words:
word = word.replace('.', ' ')
for char in a:
word = word.replace(char, '')
dictionaryTotal[word.lower()] = dictionaryTotal.get(word.lower(), 0) + 1
if "ham" in row[0].lower():
dictionaryHam[word.lower()] = dictionaryHam.get(word.lower(), 0) + 1
elif "spam" in row[0].lower():
dictionarySpam[word.lower()] = dictionarySpam.get(word.lower(), 0) + 1
probHam = 1;
probSpam = 1;
print("HAM cases: ", ham)
print("SPAM cases: ", spam)
print(dictionaryHam)
print(dictionarySpam)
for item in userStringList:
if item in dictionaryHam:
probHam = probHam * ((dictionaryHam[item] + 1) / (sum(dictionaryHam.values()) + len(dictionaryTotal) + 1))
elif item not in dictionaryHam:
probHam = probHam * (1 / (sum(dictionaryHam.values()) + len(dictionaryTotal) + 1))
if item in dictionarySpam:
probSpam = probSpam * ((dictionarySpam[item] + 1) / (sum(dictionarySpam.values()) + len(dictionaryTotal) + 1))
elif item not in dictionaryHam:
probHam = probSpam * (1 / (sum(dictionarySpam.values()) + len(dictionaryTotal) + 1))
print("OUT: ", probHam)
probHam = probHam * (ham / (ham + spam))
probSpam = probSpam * (spam / (ham + spam))
print(probHam)
print(probSpam)
if probHam > probSpam:
print("This message is HAM")
else:
print("This message is SPAM")