2015-12-03 6 views
2

Мне очень нужна помощь, чтобы понять процесс оценки вероятности. Так я вычислил счетчик биграмм в корпусе:Биграмм и вероятность триграмм python

import nltk 
bigram_p = {} 

for sentence in corpus: 
    tokens = sentence.split() 
    tokens = [START_SYMBOL] + tokens #Add a start symbol 
    #so the first word would count as bigram 
    bigrams = (tuple(nltk.bigrams(tokens))) 
    for bigram in bigrams: 
     if bigram not in bigram_p: 
      bigram_p[bigram] = 1 
     else: 
      bigram_p[bigram] += 1 

     for bigram in bigram_p: 
      if bigram[0] == '*': 
       bigram_p[bigram] = math.log(bigram_p[bigram]/unigram_p[('STOP',)],2) 
      else: 
       bigram_p[bigram] = math.log(bigram_p[bigram]/unigram_p[(word[0],)],2) 

, но я получаю KeyError - ошибку домена математики - и я не могу понять, почему. Просьба объясняет мне мою ошибку и что с ней делать.

ответ

2

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

import math 

# Input is zero 
math.log(0) # ValueError: math domain error 

# Input is negative 
math.log(-1) # ValueError: math domain error 

Один из ваших bigram_p[bigram]/unigram_p[('STOP',)] или как выражения math.log(bigram_p[bigram]/unigram_p[(word[0],)] производит нулевой или отрицательный вход.

Обратите внимание, что оператор деления (/) в Python 2.7 представляет собой целое деление, поэтому результаты округляются до целого числа, если оба аргумента являются целыми числами:

1/2 # => 0, because 1 and 2 are integers 
1./2 # => 0.5, because 1. is a float 
1.0/2 # => 0.5, because 1.0 is a float 

Если вы хотите более интуитивного поведения разделения operaror, добавьте в файл,

from __future__ import division 

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

EDIT:

Если вы не/может не хотите использовать импорт трюк, вы можете преобразовать плавать ряд либо путем умножения на поплавок n * 1.0 или с помощью встроенной функции float(n).

+0

спасибо! Это помогло! – Repzz

+0

@Repzz Если этот ответ помог вам решить вашу проблему, пожалуйста [примите это] (http://stackoverflow.com/help/accepted-answer). – memoselyk

Смежные вопросы