这次为了做NLP的第一个作业:隐马尔科夫模型的词性判断,开始接触pandas,numpy和pandas我真的很不熟,导致了作业晚交,理解了原理但代码写得很痛苦。
用测试集计算了词性之间的转移概率,转换成矩阵;以及词性到单词的发射概率,转换成矩阵,记得import numpy as np。
veterbi 算法获取预测的词性结果,因为我传进去的观察序列,也就是测试句转换成的单词表,是训练集的每个句子的单词在测试集的单词列表中的对应的索引,所以生成的词性列表就要和传进去的观察序列重新匹配上,才能判断到底预测得对不对。
可把我给难到了,我返回的预测结果是一个矩阵,行的索引是全部训练集里的全部词性,列的索引是每个单词。本来就也不知道怎么做,用了numpy的求每列的最大值的行索引和列索引的方法来返回了一个row, col,其中axis=0是每行,axis=1是每列。row是每列最大值对应的行号组成的列表,col是每列最大值的列号。然后在test_output里新增(单词,词性),有多少个单词新增多少个这样的元组。但是这样的代码可读性太差了,我估计自己第二天来看就看不懂这些col[i]是些什么。
row, col = np.where(np.max(F, axis=0)) # get the max pos for each word
for i in range(len(obs_seq)):
test_output.append((obs_seq[col[i]], pi[row[i]])) # tag index in