初学分词-crf++

网上有很多这方面的资料,但是很零碎,尝试写一个入门版的

crf++训练压缩包

运行

一、解压

1、data文件夹,训练和测试需要的数据:

  • input文件夹,存放所需要的数据
  • train_data.txt,训练数据,这里只有几条作为示例,实际工程 中,需要上万条数据
  • test_data.txt,测试数据
  • crf.template,特征模板
  • output文件夹 -> 输出的模型和测试结果

2、code文件夹,C++调用CRF++接口的代码示例
3、CRF+±0.58,crf++源码

二、编译

前置需求:gcc3.0+或者clang12.0.5

cd CRF++-0.58
./configure
make
sudo make install

三、训练

cd data
./train.sh

四、测试

cd data
./test.sh 

到这一步,流程就走完了,但是中间配置文件,命令,训练结果,测试结果里写的是啥玩意,我们都不知道

解释

一、特征模板

crf.template文件,就是crf的初始配置,就像排序算法一样,不同场景用的是不一样的

Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]

 Bigram
 B

1、T**:%x[#,#] 中的T表示模板类型即算法,两个"#"分别表示相对的行偏移与列偏移,即算法中的参数
2、Unigram:描述点函数,Bigram:描述边函数

二、命令行

train.sh脚本,运行结果就是crf.mdl
test.sh脚本,运行结果就是test_result.txt
参数详情见:https://taku910.github.io/crfpp/#source

三、训练结果

crf.mdl 二进制文件,该文件告诉crf分词逻辑和参数,分几个部分:
文件头,标签,模板,特征函数,特征函数权值

四、测试结果

test_result.txt

刘	artist+b
德	artist+i
华	artist+e
是	O
谁	O

播	O
放	O
周	artist+b
杰	artist+i
伦	artist+e
的	O
歌	O

第一例是一个汉字,也可能是词
第二列就是简单的词性标注(某些场合也可能有别的标注)
• artist:应该是类别
• b:标识一个词的开头
• i:表示一个词的中间
• e:表示一个词的结尾
• 0:表示单个词

山寨版原理解释

一、信息论

   英语  →  翻译机  →  中文
I   want   to  eat    →   我   想   吃   饭

i 可以转成 我
want to 可以转成 想
eat 可以转成 吃饭

信息可以是 不同语言的转换,也可以是动物和人,还可以是人和机器(这就是自然语言处理)

二、隐马尔科夫模型(HMM)

      也是从一个状态转换到另一个状态,但是有点不一样
123456789101112131415
心情沮丧沮丧沮丧沮丧变好兴奋舒畅沮丧沮丧沮丧沮丧变好兴奋舒畅

由这个链我们可以发现,状态的变化是这样的,如果t时刻的状态是由t-1时刻决定的话,那么我们可以进行这样的预测

沮丧变好兴奋舒畅
沮丧80%20%0%0%
变好0%0%100%0%
兴奋0%0%0%100%
舒畅100%0%0%0%

但是感觉预测还不是太好,因为我们稍微观察一下就发现,这就是每周7天职场人的心情变化啊,这个稍后再说

三、维特比算法

这个算法是一个叫维特比的数学家发明的,这个人是历史上第二富的数学家(第一富的是文艺复兴公司老板),高通就是维特比创建的,3G算法基于维特比算法

维特比算法是一个编解码的算法,他数学上的意义是解决篱笆型的最短路径问题,网上有个例子说明这个算法,无论是隐马尔科夫模型还是后面说的条件随机场都需要用这个算法解码

背景情况:

从前有个村儿,村里的人的身体情况只有两种可能:健康或者发烧。
假设这个村儿的人没有体温计或者百度这种神奇东西,他唯一判断他身体情况的途径就是到村头我的偶像金正月的小诊所询问。
月儿通过询问村民的感觉,判断她的病情,再假设村民只会回答正常、头晕或冷。 有一天村里奥巴驴就去月儿那去询问了。
第一天她告诉月儿她感觉正常。
第二天她告诉月儿感觉有点冷。
第三天她告诉月儿感觉有点头晕。那么问题来了,
月儿如何根据阿驴的描述的情况,推断出这三天中阿驴的一个身体状态呢?为此月儿上百度搜 google一番狂搜,发现维特比算法正好能解决这个问题。月儿乐了。

已知情况:

隐含的身体状态 = { 健康 , 发烧 }
可观察的感觉状态 = { 正常 , 冷 , 头晕 }
月儿预判的阿驴身体状态的概率分布 = {
健康:0.6 , 发烧: 0.4 }

月儿认为的阿驴身体健康状态的转换概率分布 = {
健康->健康: 0.7 ,
健康->发烧: 0.3 ,
发烧->健康:0.4 ,
发烧->发烧: 0.6}

月儿认为的在相应健康状况条件下,阿驴的感觉的概率分布 = {健康,正常:0.5 ,冷 :0.4 ,
头晕: 0.1 ; 发烧,正常:0.1,
冷 :0.3 ,头晕: 0.6 }
阿驴连续三天的身体感觉依次是: 正常、冷、头晕 。

题目:

已知如上,求:阿驴这三天的身体健康状态变化的过程是怎么样的?即已知观测序列和HMM模型的情况下,求状态序列。

解题过程:(这一段其实不用细看,只要知道是有算法可以解决这个问题的
过程:初始化。第一天的时候,对每一个状态(健康或者发烧),分别求出第一天身体感觉正常的概率:P(第一天健康) =P(正常|健康)P(健康|初始情况) = 0.5 * 0.6 = 0.3 P(第一天发烧) = P(正常|发烧)P(发烧|初始情况) = 0.1 * 0.4 = 0.04
第二天的时候,对每个状态,分别求在第一天状态为健康或者发烧情况下观察到冷的最大概率。在维特比算法中,我们先要求得路径的单个路径的最大概率,然后再乘上观测概率。P(第二天健康)= max{0.3
0.7, 0.04
0.4}0.4=0.30.70.4=0.084 此时我们需要记录概率最大的路径的前一个状态,即0.084路径的前一个状态,我们在小本本上记下,第一天健康。 P(第二天发烧)=max{0.30.3, 0.040.6}0.3=0.027, 同样的在0.027这个路径上,第一天也是健康的。
第三天的时候,跟第二天一样。P(第三天健康)=max{0.084
0.7, 0.027
0.4}0.1=0.00588,在这条路径上,第二天是健康的。P(第三天发烧)=max{0.0840.3, 0.027*0.6}*0.6=0.01512,在这条路径上,第二天是健康的。 最后一天的状态概率分布即为最优路径的概率,即P(最优)=0.01512,这样我们可以得到最优路径的终点,是发烧由最优路径开始回溯。请看我们的小本本,在求得第三天发烧概率的时候,我们的小本本上面写的是第二天健康,好了,第二天就应该是健康的状态,然后在第二天健康的情况下,我们记录的第一天是健康的。这样,我们的状态序列逆推出来了。即为:健康,健康,发烧。

简略的画个图吧:
请添加图片描述

四、crf:条件随机场

这个算法经常被用于序列标注,包括命名实体识别,词性标
注,分词等

  • 之前的隐马尔科夫模型提到了,每一个状态依赖上一个状态,他有两个局限性
    1,该模型定义的是联合概率,必须列举所有观察序列的可能值,而这对多数领域来说是比较困难的。
    2,基于观察序列中的每个元素都相互条件独立。即:在* 任何时刻观察值仅仅与状态序列中的一个状态有关。而大多数现实世界中的真是观察序列是有多个相互作用的特征和观察序列中较长范围内的元素之间的依赖而形成的。(比如自然语言中有的词可能跟前前前前个词相关,所以光看上一个状态,有一定局限定)
  • 条件随机场就是解决第二个问题的,就是他每个状态依赖前面好几个状态。
  • crf++(一种CRF算法的实现)官网:https://taku910.github.io/crfpp/#source

参考引用:
https://www.zhihu.com/question/20136144
https://zhuanlan.zhihu.com/p/39695509

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值