用CRF做命名实体识别(二)

用CRF做命名实体识别(三)

用BILSTM-CRF做命名实体识别

博客园的markdown格式可能不太方便看,也欢迎大家去我的简书里看

摘要

本文主要讲述了关于人民日报标注语料的预处理,利用CRF++工具包对模型进行训练以及测试

目录

  • 明确我们的标注任务
  • 语料和工具
  • 数据预处理

    1.数据说明

    2.数据预处理
  • 模型训练及测试

    1.流程

    2.标注集

    3.特征模板

    4.CRF++包的使用说明
  • 总结与展望

正文

1.明确我们的标注任务

这篇文章主要是介绍用CRF模型去提取人民日报语料的时间、人物、地点及组织机构名,也就是提取TIME、PERSON、LOCATION、ORGANIZATION四种实体。训练我们直接使用CRF++工具包。

2.语料和工具

人民日报1998中文标注语料库

CRF++安装包

3.数据预处理

3.1 数据说明

首先打开下载的人民日报标注语料的文件,要转为utf-8格式。我们需要提取的实体是时间、人名、地名、组织机构名,根据语料库的词性标记说明,对应的词性分别为/t、/nr、/ns、/nt。

3.2 数据预处理

语料库里的姓名标注是将姓和名分开标注的,因此需要合并姓名

合并姓名前:
'19980101-01-001-002/m中共中央/nt总书记/n、/w国家/n主席/n江/nr某某/nr'
合并姓名后:
'19980101-01-001-002/m中共中央/nt总书记/n、/w国家/n主席/n江某某/nr'

需要将中括号里的内容合并

合并中括号前:
'[中国/ns 政府/n]nt 顺利/ad 恢复/v 对/p 香港/ns 行使/v 主权/n ,/w '
合并中括号后:
'中国政府nt顺利/ad恢复/v对/p香港/ns行使/v主权/n,/w'

时间合并

合并时间前:
'1999年/t 12月/t 澳门/ns 的/u 回归/vn 一定/d 能够/v 顺利/ad 实现/v 。/w'
合并时间后:
'1999年12月/t澳门/ns的/u回归/vn一定/d能够/v顺利/ad实现/v。/w'

全角字符统一转为半角字符

人民日报语料有些地方不是两个空格的,例如11042行 '副教授/n 叹/Vg 道/v ,/w 成/v', 中的“叹/Vg” 和“道/v”之间是单空格,需要变成双空格。否则代码运行会报错


4.模型训练及测试

4.1流程

4.2 标注集

用的是BMEWO做标注体系

B代表实体的首部,M代表实体的中部,E代表实体的尾部,W代表单个的实体,O代表非实体

新	O
世 O
纪 O
— O
— O
一 B_TIME
九 M_TIME
九 M_TIME
八 M_TIME
年 E_TIME
新 B_TIME
年 E_TIME
讲 O
话 O
( O
附 O
图 O
片 O
1 O
张 O
) O 中 B_ORGANIZATION
共 M_ORGANIZATION
中 M_ORGANIZATION
央 E_ORGANIZATION
总 O
书 O
记 O

CRF++训练的数据格式如上图所示

4.3 特征模板

特征模板template如下

# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0] # Bigram
B

4.4 CRF++包的使用说明

下载工具包之后,打开文件夹

1.在此处新建一个文件夹chinese

2.我们复制crf_learn.exe,crf_test.exe和libcrfpp.dll这三个文件到我们新建的chinese文件夹里面,然后再把之前生成的CRF++数据格式的数据文件train.data放到chinese里面,再把我们自己定义的特征模板文件放到chinese文件夹里面(一共五个文件)

3.在chinese里面打开cmd

敲入以下代码,这便是开始训练模型

crf_learn -a MIRA template train.data model

template就是我们上面定义的特征模板

训练好之后会产生一个model文件

4.自己写几个测试文本,并将其转为CRF++的数据格式,注意标签要全部一样,如下图所示

扬	B
帆 B
远 B
东 B
做 B
与 B
中 B
国 B
合 B
作 B
的 B
先 B
行 B 希 B
腊 B
的 B
经 B
济 B
结 B
构 B
较 B
特 B
殊 B
。 B

同样把这个测试数据的文件test.data放到chinese文件夹里面


5.在chinese里面打开cmd

敲入以下代码,这便是开始模型预测

crf_test -m model test.data >> output.txt

打开output.txt文件你就会看到预测的结果

扬	B	O
帆 B O
远 B O
东 B O
做 B O
与 B O
中 B B_LOCATION
国 B E_LOCATION
合 B O
作 B O
的 B O
先 B O
行 B O 希 B B_LOCATION
腊 B E_LOCATION
的 B O
经 B O
济 B O
结 B O
构 B O
较 B O
特 B O
殊 B O
。 B O

5.总结与展望

现在仅仅只是粗暴的把这个流程实现了一遍,测试的效果并不是很好,有部分的人名没有识别出来,还需要再添加特征,以及更改template特征模板,这些还在学习。CRF的原理也不是很懂,也需要去完整的学习一下。后续还会更新

欢迎扫码关注

用CRF做命名实体识别(一)的更多相关文章

  1. 用CRF做命名实体识别(二)

    用CRF做命名实体识别(一) 用CRF做命名实体识别(三) 一. 摘要 本文是对上文用CRF做命名实体识别(一)做一次升级.多添加了5个特征(分别是词性,词语边界,人名,地名,组织名指示词),另外还修 ...

  2. 使用CRF做命名实体识别(三)

    摘要 本文主要是对近期做的命名实体识别做一个总结,会给出构造一个特征的大概思路,以及对比所有构造的特征对结构的影响.先给出我最近做出来的特征对比: 目录 整体操作流程 特征的构造思路 用CRF++训练 ...

  3. 用深度学习做命名实体识别(二):文本标注工具brat

    本篇文章,将带你一步步的安装文本标注工具brat. brat是一个文本标注工具,可以标注实体,事件.关系.属性等,只支持在linux下安装,其使用需要webserver,官方给出的教程使用的是Apac ...

  4. 用深度学习做命名实体识别(七)-CRF介绍

    还记得之前介绍过的命名实体识别系列文章吗,可以从句子中提取出人名.地址.公司等实体字段,当时只是简单提到了BERT+CRF模型,BERT已经在上一篇文章中介绍过了,本文将对CRF做一个基本的介绍.本文 ...

  5. NLP入门(八)使用CRF++实现命名实体识别(NER)

    CRF与NER简介   CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机 ...

  6. 用深度学习做命名实体识别(六)-BERT介绍

    什么是BERT? BERT,全称是Bidirectional Encoder Representations from Transformers.可以理解为一种以Transformers为主要框架的双 ...

  7. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词的数据集预处理成作者提到的格式,即可很快的就迁移了这个代码到中文分词中,相关的代码后续将会分享. 具体的数据格式,这种方式并不适合处理 ...

  8. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf

    文章目录基本介绍BertForTokenClassificationpytorch-crf实验项目参考基本介绍命名实体识别:命名实体识别任务是NLP中的一个基础任务.主要是从一句话中识别出命名实体.比 ...

  9. 基于条件随机场(CRF)的命名实体识别

    很久前做过一个命名实体识别的模块,现在有时间,记录一下. 一.要识别的对象 人名.地名.机构名 二.主要方法 1.使用CRF模型进行识别(识别对象都是最基础的序列,所以使用了好评率较高的序列识别算法C ...

随机推荐

  1. Delphi DbGridEh实现表格没有内容的渐变效果

    OptionsEh = dghExtendVertLines  就会有这个效果, 去掉就会没有这个效果

  2. Shell逐行读取文件的3种方法

    方法1:while循环中执行效率最高,最常用的方法. while read linedoecho $linedone  < filename 注释:这种方式在结束的时候需要执行文件,就好像是执行 ...

  3. Vue使用,异步获取日期时间后格式成"/Date(1333245600000+0800)/" 转换成正常格式

    js从后台mvc中日期获取,结果格式成"/Date(1333245600000+0800)/"了,当然不能这样展显给用户了,要转换,方法如下: function data_stri ...

  4. resp.getWriter().print的注意点

  5. 【bzoj3560】DZY Loves Math V 欧拉函数

    题目描述 给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). 输入 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. 输出 仅一行答案. 样例输入 3 ...

  6. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

    题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...

  7. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  8. java.lang - 不用import

    java.lang包是java语言的核心,它提供了java中的基础类.包括基本Object类.Class类.String类.基本类型的包装类.基本的数学类等等最基本的类.我们介绍一下Java 8中的j ...

  9. 【刷题】洛谷 P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  10. 解题:JLOI 2016 侦查守卫

    题面 经典的$cov-unc$树形dp(这词是你自己造的吧=.=) 设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少 ...