viterbi算法用于中文词性标注
维特比(viterbi)算法与中文词性标注(一)—— 隐含马尔科夫模型
维特比(viterbi)算法与中文词性标注(二)—— 维特比算法
任务简述
中文词性标注是在中文分词器将文本划分为逐个词汇的基础上,将每个词的词性进行标注
输入:李 明 在 北京 考察 企业
输出:李/nr 明/nr 在/p 北京/ns 考察/v 企业/n
HMM模型
将中文词性标注套用到HMM模型中。
- 其隐藏的状态序列就是每个词汇的词性
- 每个状态的输出内容为预料中的词汇
首先讨论其对于HMM三大假设的符合情况:
- 每个词汇在句中某处的词性取决于该词的前一个词的词性
- 词汇的词性与该词汇在文中的前后位置无关
- 某个词汇的出现概率仅与其词性有关
根据模型的特点,可以见得我们要解决的问题属于第二类问题范畴:解码问题,在已知语料中的词汇序列的基础上,得到词性序列。
解决思路
根据训练集合的语料,计算得出HMM的五元组。
- 所有出现的词性
- 所有出现的词汇
- 每句话句首的词性概率
- 每种词性转换为不同词汇的概率
- 任意两种词性之间的转换概率
因此需要根据语料统计的内容有:
- 词性序列
- 词汇序列
- 各词性位于句首的次数 & 总的语句数量
- 各词性输出不同词汇的次数 & 各词性的输出总数量
- 各词性转换为其他各词性的次数 & 各词性的词性转换对总数量
使用hmmlearn库训练离散HMM模型
hmmlearn库简介及安装
hmmlearn实现了三种HMM模型类,按照观测状态是连续状态还是离散状态,可以分为两类。GaussianHMM(高斯分布)和GMMHMM(混合高斯分布)是连续观测状态的HMM模型,而MultinomialHMM是离散观测状态的模型,也是我们词性标注里面使用的模型。
安装十分简单,命令行输入"pip install hmmlearn"即可完成
离散型HMM模型训练
对于MultinomialHMM的模型,使用比较简单
- "startprob_"参数对应我们的隐藏状态初始分布
- "transmat_"对应我们的状态转移矩阵
- "emissionprob_"对应我们的观测状态概率矩阵
- 创建模型时需要输入隐含状态的数量
相关代码片段
# 通过语料信息提取的函数获取HMM五元组
# ./data/test.txt为训练语料库
StatesList, ObsvList, OrglStateProb, TransProb, EmissProb = InfoExct("./data/test.txt")
# 状态数量
num_state=len(StatesList)
model=hmm.MultinomialHMM(n_components=num_state)
# 隐藏状态初始分布(numpy矩阵)
model.startprob_=OrglStateProb
# 状态转移矩阵(numpy矩阵)
model.transmat_=TransProb
# 观测状态概率矩阵(numpy矩阵)
model.emissionprob_=EmissProb
运用模型进行状态预测
将输出序列输入模型,输出结果
相关代码片段
SeenList=[[]]
# 中间为测试样本中的输出序列提取过程
# SeenList的得出结果类似于[[12,143,24]]
# 数字为词汇在输出集合中的位置序号
SeenList = np.array(SeenList).T
logprob, stalist = model.decode(SeenList, algorithm="viterbi")
# 预测状态集合以数字形式存于stalist列表中
完整代码见github链接
语料库简介
我用的是人民日报1998年的词性标注语料库——199801.txt
-
对人民日报1998年上半年的纯文本语料进行了词语切分和词性标注制作而成,严格按照人民日报的日期、版序、文章顺序编排的。
-
文章中的每个词语都带有词性标记。目前的标记集里有26个基本词类标记(名词n、时间词t、处所词s、方位词f、数词m、量词q、区别词b、代词r、动词v、形容词a、状态词z、副词d、介词p、连词c、助词u、语气词y、叹词e、拟声词o、成语i、习惯用语l、简称j、前接成分h、后接成分k、语素g、非语素字x、标点符号w)外,从语料库应用的角度,增加了专有名词(人名nr、地名ns、机构名称nt、其他专有名词nz);从语言学角度也增加了一些标记,总共使用了40多个个标记。
格式说明
- 语料是纯文本文件,文件中每一行代表一自然段或者一个标题,一篇文章有若干个自然段,因此在语料中一篇文章是由多行组成的。
- 每一行的开头是编号。比如“19980101-01-001-001”表示这一自然段是1998年1月1日的第01版的第001篇文章的第001自然段,用短横线隔开的4部分按照顺序是“年月日-版号-篇章号-段号”。标号也作为一个词进行标注,词性固定为“m(数词)”。
- 一篇文章里面的段落之间是不空行的,在两篇文章之间,会有一个空行,表示文章的分界线,同时,下一篇文章的“篇章号-段号”都会有所改变。
- 标号之后,是2个单字节空格,然后开始正文。
- 正文部分按照规范已经切分成词,并且加上标注,标注的格式为“词语/词性”,即词语后面加单斜线,再紧跟词性标记。词与词之间用2个单字节空格隔开。每段最后的词,在标记之后也有2个单字节空格,保持格式一致。
- 语料中除了词性标记以外,还有“短语标记”,这种情况一般出现在机构团体名称、成语等情况中。如“通过/p [中央/n 人民/n 广播/vn 电台/n]nt 、/w”中,用“[ ]”合起来的部分是一个完整的机构团体名称,方括号后面紧跟标注nt,nt之后空两个单字节空格,保持了格式的一致。