Кажется, я не могу понять, как исправить эту «ошибку ZeroDivisionError: деление на ноль»

#python #pandas #jupyter-notebook #naivebayes

#python #панды #jupyter-ноутбук #наивный ответ

Вопрос:

Я продолжаю, что это ошибка в моем коде, и я не знаю, как это исправить, и когда я пытаюсь это исправить, это приводит к путанице во всей программе, как я могу это исправить.

 def p_appears_in_spam(word):
    count = 0
    total_spams = 0
    for t in train_set:
        text = t[0]
        if t[1] == 1:
            total_spams  = 1
            if word in text:
                count  = 1
    return count/total_spams
def p_appears_in_ham(word):
    count = 0
    total_hams = 0
    for t in train_set:
        text = t[0]
        if t[1] == 0:
            total_hams  = 1
            if word in text:
                count  = 1
    return count/total_hams
def total_spams_and_hams(tset):
    spams = 0
    hams = 0
    for t in tset:
        spams  = 1 if t[1] == 1 else 0
        hams  = 1 if t[1] == 0 else 0
    return spams, hams

p_spam = total_spams_and_hams(train_set)[0]/len(train_set) # Probability that a message is spam
p_ham = total_spams_and_hams(train_set)[1]/len(train_set) # Probability that a message is ham

def p_is_spam_given_word(word):
    return (p_appears_in_spam(word)*p_spam)/((p_appears_in_spam(word)*p_spam   p_appears_in_ham(word)*p_ham))

word = 'free'
print('Probability that a message is spam given the word "{}" is: {}'.format(word, p_is_spam_given_word(word)))
  

это ошибка, которую я получаю

 ---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-102-eaaafc1fa61f> in <module>
     31     return (p_appears_in_spam(word)*p_spam)/((p_appears_in_spam(word)*p_spam   p_appears_in_ham(word)*p_ham))
     32 word = 'free'
---> 33 print('Probability that a message is spam given the word "{}" is: {}'.format(word, p_is_spam_given_word(word)))

<ipython-input-102-eaaafc1fa61f> in p_is_spam_given_word(word)
     29 p_ham = total_spams_and_hams(train_set)[1]/len(train_set) # Probability that a message is ham
     30 def p_is_spam_given_word(word):
---> 31     return (p_appears_in_spam(word)*p_spam)/((p_appears_in_spam(word)*p_spam   p_appears_in_ham(word)*p_ham))
     32 word = 'free'
     33 print('Probability that a message is spam given the word "{}" is: {}'.format(word, p_is_spam_given_word(word)))

<ipython-input-102-eaaafc1fa61f> in p_appears_in_spam(word)
      8             if word in text:
      9                 count  = 1
---> 10     return count/total_spams
     11 def p_appears_in_ham(word):
     12     count = 0

ZeroDivisionError: division by zero
  

Я получаю ошибку нулевого деления для подсчета как в функциях spams, так и в функциях hams, которые я написал для этого.

Комментарии:

1. Вопрос был бы более понятным, если бы вы сократили его до минимального рабочего примера.

2. Итак. У вас ошибка, которая вызывает себя ZeroDivisionError и описывает себя как division by zero . Я полагаю, вы понимаете, почему недопустимо пытаться делить на ноль. Ошибка указывает на вашу строку кода return count/total_spams . Итак, здесь происходит деление на ноль. Что это говорит вам о вашем коде? В частности, что это говорит вам о значении total_spams во время выполнения этой строки кода? Ожидаете ли вы такой возможности? Когда вы это делаете count/total_spams , что это должно вычислять? Имеет ли смысл ваша формула для этого?

3. (Подсказка: каким должно быть максимально возможное значение для p_appears_in_spam результата, учитывая, что оно представляет вероятность ? Каким должно быть наименьшее возможное значение? В общем, чего вы ожидаете больше: count , или total_spams ? Почему?)