维特比(viterbi)算法与中文词性标注(三)

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之后空两个单字节空格,保持了格式的一致。

参考文献

[1]用hmmlearn学习隐马尔科夫模型HMM

[2]中文词性标注与viterbi算法

[3]人民日报标注语料库(PFR)

你可能感兴趣的:(机器学习)