nlpinaction / learning-nlp

nlp in action
1.03k stars 823 forks source link

第三章HMM中的viterbi的max函数 #25

Open Lukasjame opened 5 years ago

Lukasjame commented 5 years ago

当需要分词的是一个文本段落时,viterbi函数中的max函数报错

Traceback (most recent call last): File "D:\code\python_test\test\start.py", line 11, in print(str(list(res))) File "D:\code\python_test\test\hmm.py", line 150, in cut prob, pos_list = self.viterbi(text, self.state_list, self.Pi_dic, self.A_dic, self.B_dic) File "D:\code\python_test\test\hmm.py", line 134, in viterbi for y0 in states if V[t - 1][y0] > 0]) ValueError: max() arg is an empty sequence

choupiqi commented 5 years ago

是不是用了自己做的语料?若果是,可能是语料不好。 还可以试试在 for k,v in enumerate(line_state): Count_dic[v] += 1 if k == 0: 这个if下面也加入self.B_dic[line_state[k]][word_list[k]] = self.B_dic[line_state[k]].get(word_list[k],0)+1.0 我碰到这个问题的时候是用的自己的语料,发现是语料不好,换一个就OK了。

qxxiao commented 5 years ago

最好用来分析短句子,长文本的话V矩阵,超过一定的迭代后,计算结果会很小,最后趋于为0,导致for y0 in states if V[t - 1][y0] > 0的结果是空。可以采用对数概率相加来解决下溢的问题。

FlyingCat-fa commented 4 years ago

128行 for y0 in states if V[t - 1][y0] > 0]),会出现上一时刻不存在的状态如“B”,应该修改为 for y0 in V[t - 1].keys()])