基于CRF的命名实体识别思路与实现
本文参考了https://github.com/liuhuanyong的CRF实现分词的思路
CRF的实现思路类似于HMM,需要求解几个概率(词与词的转移概率,状态与状态的转移概率、发射概率、初始词概率),然后用verbiter方法求解,verbiter方法的原理简单来说就是给出当前状态,求解最有可能转移至该状态的上一个状态,这个原理和思路也是实现CRF的核心。
首先给出宗成庆老师PPT的一个关于CRF中文分词例子(实体识别无非是把字转为词,训练样本是带有标记的):
由宗成庆老师PPT的例子可以看到,若使用CRF实现中文分词,总结需要以下几个概率:
1.词与词的转移概率:如下图第一项当前字被标记为B时上一个字为null的概率,但是在本人的实现中,仅仅计算了词与词之间的转移概率,即某词和词之间转移概率不为None,则f为1,λ为某词和词之间的转移概率,否则f=0。如下图若第三项'乒'转移至'乒'的概率不为None,则f(乒,乓,B) = word_trans(乒,乓)
2.初始词概率:从上图第一项f(null,乒,B)则发现又要计算一个概率:null->句子的首词的转移概率,本人的实现中,直接计算每个句子的首词在训练样本中出现的概率strat_word(乒)代替f(null,乒,B)
3.发射概率:即上图的第二项f(乒,B),所谓发射概率即为在某个状态中,某个词出现的可能性有多大。如状态B中有['乒':0.03,'乓':0.02,'我':0.06]
4.转移概率:verbiter方法的原理简单来说就是给出当前状态,求解最有可能转移至该状态的上一个状态。基于这种思路,和原理,下图的式子便很好理解了,即若当前状态为B,求解最有可能转移至状态B的上一状态,式中Teb则是E转移至B的概率,Tsb则是S转移至B的概率
故求解出以上几个概率,则实现verbiter方法无非是套公式了。
现给出实现思路:
1.根据语料库求解状态转移概率 (根据tag求解 B-LOG --> I--LOG)
2.根据语料库求解词与词的转移概率
3.根据语料库求解发射概率 (B-LOG中南京的概率)
4.根据语料库求解初始词概率
5.根据vebiter方法求解
句子:陈鼎立毕业于西南科技大学
输入分词结果:陈 鼎立 毕业 于 西南 科技 大学
1)初始化, R1x = W1x = l1*f(null,陈,B) + l2*f(陈,B) + l3*f(陈,B,鼎立)
约定:第一项的初始词为陈的概率,第二项为状态B中陈的发射概率,第三项为陈->鼎立的转移概率
注意:句子的第二个词开始则是第i-1个词转移至第i个词的概率 + 第i个词属于某个状态的概率 + 第i个词转移至第i+1个词的概率
2)循环,Rb = max{Teb*Re,Tsb*Rs}*Wb
约定
2201_75385514: 您好 有偿求一份源码
吃饭睡觉哄豆豆zzz: 我也是来要数据的
weixin_53121752: 电影的name展示到节点上需要手动设置,我发不了图,你搜一下就知道了
qq_48926444: 求一份源码
兔子队列: 求一份源码