自然语言基础之分词、标注、命名实体识别
一、HMM隐马尔可夫模型分词、词性标注、命名实体识别
HMM是用来描述隐含未知参数的统计模型,经典的例子:一个东京的朋友每天根据天气{下雨、晴天}决定当天的活动{公园散步、购物、清理房间}中的一种,我每天只能在twitter上看到她发的“今前天去公园散步了、昨天购物、今天清理房间了!”,那么我可以根据她发的推特推断东京这三天的天气。在这个例子里,观测状态序列是活动,隐藏状态序列是天气。
任何一个HMM都可以通过下列五元组描述:
:param obs: 观测序列
:param states: 隐藏状态序列
:param start_p: 初始状态概率(隐藏状态,天气{晴、雨})
:param trans_p:状态转移矩阵概率 (隐藏状态、)
:param 观测序列概率(在时刻t隐藏状态条件下,生成观测序列的概率)
用python代码来描述如下:
求解最可能的天气:
维特比算法:实际是用动态规划解隐马尔可夫模型预测问题,即用动态规划求概率最大路径(最优路径)。这时一条路径对应着一个状态序列。
求解最可能的隐藏状态序列是HMM的三个典型问题之一、通常用维特比算法解决。维特比算法就是求解HMM上的最短路径(-log(prob),也即是最大概率)的算法
思路如下:第一天天晴还是下雨可以算出来:
1、定义V[时间][今天天气] = 概率,注意今年天天气指的是,前几天的天气确定下来了(概率最大)今天天气是X的概率,这里的概率 就是一个累乘的概率
2、因为第一天我的朋友去散步了,所以第一天下雨的概率V[第一天][下雨] = 初始概率[下雨]*观测概率[下雨][散步] = 0.6*0.1=0.06,同理可得V[第一天][天晴] = 0.24。因为第一天朋友出门了,她一般喜欢在
晴天的时候散步,所以第一天天晴的概率比较大,直觉上来看也是这样。
3、从第二天开始,对于这种每天天气Y,都有前一天天气是X的概率*X转移到Y的概率*Y天气下朋友进行这天这种活动的概率。因为前一天天气X有两种可能,所以Y的概率有两个,选取其中较大一个作为V[第二天][天气Y]的概率,同时将今天的天气加入到结果序列中
4、比较V[最后一天][下雨]和[最后一天][天晴]的概率,找出较大的哪一个对应的序列,就是最终结果。
只需从时刻t=1开始,递推地计算在时刻t状态为i的各条部分路径的最大概率,直至得到时刻t=T状态为i的各条路径的最大概率。时刻t=T的最大概率即为最优路径的概率。
具体HMM应用在分词系统,可以将天气当成“标签”,活动当成“字或者词”。那么nlp几个问题可以转化为:
词性标注:给定一个词的序列(句子),找出最可能的词性序列(标签是词性)。
分词:给定一个字的序列,找出最可能的标签序列(BMES),比如结巴分词目前就是利用BMES标签来分词的,
命名实体识别:给定一个词的序列,找出最可能的标签序列(内外符号:[内]表示词属于命名实体,[外]表示不属于)。如ICTCLAS实现的人名识别、翻译人名识别、地名识别都是用同一个Tagger实现的。