# 基于CRF++的中文名实体识别程序
# 1 实验环境
- win10
- Python 3.7.0
- CRF++-0.58
# 2 程序主要算法
条件随机场(CRF):
条件随机场定义:令 G = ( V , E ) 表示一个无向图, 任意一个节点v对应一个随机变量Y,因此Y = (v ∈ V) , Y中元素与无向图 G中的顶点一一对应。当在条件 Χ 下,随机变量 Y v 的条件概率分布服从图的马尔可夫属性:p ( | Χ , , w ≠ v ) = p ( | Χ , , w ~ v ) ,其中 w ~ v 表示 ( w , v) 是无向图 G 的边。这时我们称 ( Χ , Y ) 是一个条件随机场。
我们可以推出最终条件随机场的条件概率为:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/ec411d35336b511ad7efd6d813b64876.writebug)
其中,
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2f11045657a314caa1910de1820a557f.writebug)
训练CRF主要就是要训练特征函数的权重(即),对于训练集(x1,y1),(x2,y2),...,(xn,yn)(x1,y1),(x2,y2),...,(xn,yn),采用极大似然估计法计算权重参数,条件概率的对数似然函数为:
其中
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b873461730f0f5691e6edba939bbe9d6.writebug)
为训练样本集中xy的经验概率,它等于xy同时出现的次数除以样本空间容量;
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c32c4264e924a8ee261cf38af0bd1420.writebug)
为训练样本集中x的经验概率,它等于x出现的次数除以样本空间容量。
只需要对似然函数求导为0,进行优化求解即可。
# 3 实验过程
**1)对语料进行预处理。在本次实验中,采用的1998年人民日报分词数据集,格式如下**:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/076b178ba25ce72f4c8dce8b559037ac.writebug)
需要将其处理为crf++需要的训练数据格式:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/7b844fc2a28fd18716cdf0dea5e46b2a.writebug)
其中,O标识不是查找的中文名,S标识该中文名只有一个字符,B表示中文名的第一个字符,M标识中文名的非开始/结束字符,E表示中文名的最后一个字符
在处理过程中,需要将语料转换为对应的标注,并将形如[华北/ns 电管局/n]nt进行合并,合并为华北电管局/nt。同时,从中去除部分数据作为测试集数据。在本次实验中,我抽取了25%的数据用作测试。
具体实现见代码setTag.py
**2)编写特征模板文件,该文件描述了用来训练以及进行测试的特征**。
```
# Unigram
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]
U06:%x[0,0]/%x[-1,0]
U07:%x[0,0]/%x[1,0]
U08:%x[-1,0]/%x[-2,0]
U09:%x[1,0]/%x[2,0]
U10:%x[-1,0]/%x[1,0]
# Bigram
B
```
**3)执行crf_learn -f 3 -p 8 template.txt train.txt model命令,完成模型的学习,模型文件为model**。
其中,各参数含义为:
- -f, –freq=INT使用属性的出现次数不少于INT(默认为1)
- -p, –thread=INT线程数(默认1),利用多个CPU减少训练时间
训练过程如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f2bf9aa6b24b6f0d7eb1121fe1301ac9.writebug)
**4)通过crf_test -m model test.txt > test.rst命令完成对测试集数据的标注,标注后的test.tst文件如下**:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/ca5808694647dc0c9a33e88d1bad10b1.writebug)
第一列为进行标注的中文字符,第二列为按照模型进行标注的结果,第三列为人工标注的结果。
**5)根据对测试集的标注结果计算模型的各项参数:Precision,Recall,F1-Score**.
```python
def test(path):
file = open(path)
tags = 0#被标记字的总数
right = 0#标记正确的数目
precisionTags = 0#所有标记出来的数目
recallTags = 0#应该被标记的字的数目
for line in file:
line = line.strip()
if(len(line)==0):
continue
tags += 1
_word, tag_real, tag_point = line.split()
if tag_point == tag_real and tag_point != 'O':
right += 1
if tag_point != 'O':#被标注的数据
precisionTags += 1
if tag_real != 'O':#应该被标注的数据
recallTags += 1
precision = float(right)/precisionTags
recall = float(right)/recallTags
f1Score = 2*precision*recall/(precision+recall)
print("precision:%f, recall:%f, F1Score:%f\n"%(precision,recall,f1Score))
test('test.rst')
```
# 6 实验结果
测试内容:
Precision:所有标注正确的词的数量/所标注出来的词的总数
Recall:所有标注正确的词的数量/应该标注的词的数量
![](http://www.writebug.com/myres/static/uploads/2021/10/19/09c0c4969b106c14794567e4e03a1679.writebug)
执行结果如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0ec5f11e422f55de088e2ad2fe38ff83.writebug)
分析test.rst文件我们可以看出:
**1) 人工标注为地名而模型未能成功标注的结果**:
```
, O O
中 O B
国 O E
驻 O O
阿 O B
联 O M
酋 O M
使 O M
馆 O E
内 O O
```
对于中国,阿联酋这两个地名,模型未能成功识别
**2)人工未标注为地名而模型识别为地名的情况**:
```
(1)
增 O O
加 O O
从 O O
巴 B O
自 M O
治 M O
区 E O
进 O O
口 O O
(2)
为 O O
什 O O
么 O O
维 B O
也 M O
纳 E O
音 O O
乐 O O
会 O O
```
在人工标注中,巴自治区以及维也纳未被标注为地名,而在模型中,将其识别为地名。
分析上述结果,我们可以看出:CRF算法通过对地名前后的词语进行提取,将其纳入模型的考虑范围中。在判断一个词是否为地名时,主要通过对前后的特征进行匹配,从而进行判断。因此,当前后不具有明显特征时,不能够对特征进行有效提取。同时,对于具有多重含义的词进行识别时,可能会识别错误。
# 7 实验结论和体会
CRF可以有效对中文名词进行识别,其主要通过对特征进行提取,生成模型,然后用模型来进行匹配。由于本次实验中,仅通过对词进行特征提取,效果没有达到最佳,为了提升识别的效果,可以将语料的词性作为特征进行提取或者扩充训练的语料。同时,可以对语料进行事先整理,提升识别效果
# 8 执行过程如下
- 采用1998年人民日报分词数据集,文件为renmin.txt
- 执行setTag.py文件(python setTag.py),用以生成CRF++格式标注的训练集以及测试集数据
- 执行crf_learn -f 3 -p 8 template.txt train.txt model命令,生成模型(template可修改)
- 执行crf_test -m model test.txt > test.rst命令,将该模型在测试集数据上进行测试,标注结果写到test.rst文件中
test.rst文件格式如下:
进行标记的字 完成的标记 真正的标记
- 执行testResult.py文件(python testResult.py),查看识别效果
没有合适的资源?快使用搜索试试~ 我知道了~
精选_基于CRF++的中文名实体识别程序_源码打包
共15个文件
txt:4个
py:2个
exe:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 198 浏览量
2022-03-12
08:27:13
上传
评论
收藏 15.66MB ZIP 举报
温馨提示
基于CRF++的中文名实体识别程序
资源推荐
资源详情
资源评论
收起资源包目录
5860435355637148.zip (15个子文件)
chinese-name-recognition
src
文档.doc 589KB
代码
test.rst 3.08MB
.vscode
tasks.json 497B
libcrfpp.dll 330KB
setTag.py 2KB
crf_learn.exe 50KB
template.txt 187B
crf_test.exe 50KB
model 14.15MB
test.txt 2.2MB
testResult.py 841B
renmin.txt 8.4MB
train.txt 6.58MB
LICENSE 1KB
README.md 7KB
共 15 条
- 1
资源评论
工具盒子
- 粉丝: 60
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功