наивный байесовский классификатор не работает, предпочитает спам - PullRequest
0 голосов
/ 27 февраля 2019

Я новичок в 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")

1 Ответ

0 голосов
/ 27 февраля 2019

Я думаю, что вы перепутали свои тормоза в строке:

probHam = probHam * ((dictionaryHam[item] + 1) / (sum(dictionaryHam.values()) + len(dictionaryTotal) + 1))
...