用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. java 两个数组合并

    需求:两个字符串合并(如果想去重复,参考下一篇--数组去重复及记录重复个数) //方法一 Arrays类 String[] a = {"A","B"," ...

  2. hash值

    任何类都继承public int hashCode()方法,该方法返回的值是通过将该对象的内部地址转换为一个整数来实现的,hash表的主要作用就是在对对象进行散列的时候作为key输入.我们需要每个对象 ...

  3. mysql项目路径URL编码

    jdbc_url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncodi ...

  4. 【Java】接口开发中关于接受和发送json的相关范例

    接受json package com.suneee.scn.wms.web.rocketmq; import java.util.List; import net.sf.json.JSONArray; ...

  5. Tajo--一个分布式数据仓库系统(概述)

    前言:一直对OS X比较仰慕,刚工作送给自己的第一件大礼就是mac pro,嘿嘿.最近在看一个叫tajo得分布式数据仓库,需要依赖protoc 2.4.1,2.5.0都不work,不知道为啥,我在装2 ...

  6. 【BZOJ4912】天才黑客(最短路,虚树)

    [BZOJ4912]天才黑客(最短路,虚树) 题面 BZOJ 洛谷 题解 \(Anson\)爷讲过的题目,然而我还是不会做 只有照着\(zsy\)的程序打我才会做....果然太弱了. 这道题目显然是把 ...

  7. 【HDU5919】SequenceII(主席树)

    [HDU5919]SequenceII(主席树) 题面 Vjudge 翻译(by ppl) 给一个长度为N的数列A,有m个询问,每次问 数列[l,r]区间中所有数的第一次出现的位置的中位 数是多少 题 ...

  8. redis的自带VM(虚拟内存)

    Redis支持采用VM技术,以达到当数据超过设置的可使用的物理内存的时候能够正常运行.当数据超过物理内存的时候,把一部分数据写入磁盘中的一块空间来代替物理内存. vm-enabled no       ...

  9. 米勒罗宾素性测试(Miller–Rabin primality test)

    如何判断一个素是素数 效率很高的筛法 打个表 (素数的倍数一定是合数) 就可以解决问题. 筛选法的效率很高,但是遇到大素数就无能为力了. 米勒罗宾素性测试是一个相当著名的判断是否是素数的算法 核心为费 ...

  10. Linux下C高手成长过程----经典书籍推荐

    http://www.cnblogs.com/shanzhizi/archive/2012/07/10/2585357.html