2015-05-23 5 views
1

Я использую Наивный Байес для категоризации текста это, как я создал начальные веса для каждого члена в указанной категории:Реализация Наивного Байес текст категоризации, но я продолжаю получать нули

  • term1: количество раз, срок 1 существует/количество документов в Категорияа
  • term2: количество раз термина 2 существует/количество документов в Категорияа
  • term3: число раз термин 3 существует/количество документов в Категорияа

  • term1: количество раз срок 1 существует/количество документов в categoryB

  • term2: число раз термин 2 существует/количество документов в categoryB
  • term3: число раз термин 3 существует/количество документов в categoryB

с новым тестом-документом настраивают весы на основе того, существует ли этот термин в тестовом документе или нет:

  • tERM1: существует в тестовом документе, поэтому я использую один и тот же вес для categoryA_term1, как выше
  • term2: не существует в тестовом документе поэтому я использую 1-вес для categoryA_term2
  • term3: не существует в тестовом документе поэтому я использую 1-вес для categoryA_term3

  • TERM1: существует в тестовом документе, поэтому я использую один и тот же вес для categoryB_term1, как описано выше

  • term2: не существует в тестовом документе поэтому я использую 1-вес для categoryB_term2
  • term3: существует в тестовом документе, поэтому я использую такой же вес для категории B_term2, как указано выше

Затем я умножаю веса для каждой категории. Это работает, когда я создаю фиктивные поезда/тестовые документы по одному предложению, но когда я реализую реальные документы для учебных/тестовых документов, я постоянно получаю нуль, когда я их объединяю. Это потому, что вероятности настолько малы, что после умножения стольких небольших чисел python просто сходится к нулю? Я так застрял, и я просто продолжаю сталкиваться с тем же нулевым вопросом :(Я был бы очень признателен за вашу помощь!

+0

Удостоверьтесь, что вы не умножаетесь на любые нулевые условия. Метод, который вы описали, может легко привести к потерям нуля. –

+0

Ну, я проверяю, существует ли термин в test_document, и если этот термин существует, я даю ему вес, который я вычислил ранее из набора тренировок, если вес не находится в тестовом документе, тогда я даю ему 1-вес. Я игнорирую термины, которые я еще не придавал весу, то есть термины, которые не существуют в моей сумке слов. Таким образом, нулевой срок не должен существовать. Я также просто дважды проверял, и у меня нет нулей ни в одном из моих весов. – hope288

+0

Вам также нужно убедиться, что вес не равен 1, потому что '1 - weight' будет равен нулю. Тем не менее, вероятно, это проблема с недостаточным потоком, умножая слишком много крошечных чисел. @DouglasZare предоставил отличный способ решить эту проблему. –

ответ

1

Как заметил Эд Коттрелл, вам нужно подумать о том, что произойдет, если вы встретите слово, которое отсутствует в документах в категории. Вы можете избежать умножения на 0, используя Laplace smoothing.Если вы видите слово из k из n документов в категории, вы назначаете условную вероятность (k + 1)/(n + 2) или (k + a)/(п + 2а) к этому слову данной категории.

Вместо того, чтобы продукт многих небольших количествах, это стандарт для вычисления логарифм произведения.

log x*y = log x + log y 
log(P(a0|c) * P(a1|c) * ... * P(ak|c)) 
    = log P(a0|c) + log P(a1|c) + ... + log P(ak|c) 

Тогда у вас есть сумма чисел, которые не так малы. Избегайте использования журнала 0. При необходимости вы можете повысить степень детализации, но обычно вы просто переводите порог принятия решения в условие логарифма.

+0

Итак, тогда я должен использовать условную вероятность И конвертировать в журналы? Заранее спасибо – hope288

+0

Вы всегда используете условные вероятности в наивном классификаторе Байеса. Вы должны использовать сглаживание и использование лапласа. –

+0

Хорошо, я собираюсь попробовать это, обновится! Спасибо, я надеюсь, что я сделаю это правильно, и это работает * скрещенные пальцы * – hope288