每天给你送来NLP技术干货!


来自:ChallengeHub

作者:致Great

完整代码 https://www.heywhale.com/home/competition/6216f74572960d0017d5e691/content/

1

条件随机场-CRF

CRF,英文全称为Conditional Random Field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。

较为简单的条件随机场是定义在线性链上的条件随机场,称为线性链条件随机场(linear chain conditional random field)。

线性链条件随机场可以用于序列标注等问题,需要解决的命名实体识别(NER)任务正好可通过序列标注方法解决。

在条件概率模型P(Y|X)中,Y是输出变量,表示标记序列(或状态序列),X是输入变量,表示需要标注的观测序列。

训练时,利用训练数据 集通过极大似然估计或正则化的极大似然估计得到条件概率模型p(Y|X);
预测时,对于给定的输入序列x,求出条件概率p(y|x)最大的输出序列y

利用线性链CRF来做实体识别的时候,需要假设每个标签 的预测同时依赖于先前预测的标签 和 的词语输入序列,如下图所示每个 NER标签仅依赖于其直接前前继和后继标签以及 x

CRF是一种选择因子的特定方式,换句话说,就是特征函数。定义因子的 CRF 方法是采用实值特征函数  与参数 θ 和  θ 的线性组合的指数,下面是特征函数与权重参数在时间步上是对应的:

关于Linear-chain CRF的训练推导,可以查看文章:条件随机场CRF(一)从随机场到线性链条件随机场 

2

实践1:基于CRF++实现NER

CRF++简介

CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具,采用C++语言编写而成。其最重要的功能我认为是采用了特征模板。这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函数,我们要做的就是寻找特征,比如词性等。官网地址:http://taku910.github.io/crfpp/

安装

CRF++的安装可分为Windows环境和Linux环境下的安装。关于Linux环境下的安装,可以参考文章:CRFPP/CRF++编译安装与部署 。在Windows中CRF++不需要安装,下载解压CRF++0.58文件即可以使用

训练语料创建

在训练之前需要将标注数据转化为CRF++训练格式文件:

分两列,第一列是字符,第二例是对应的标签,中间用\t分割。

比如标注方案采用BISO,效果如下:

模板

模板是使用CRF++的关键,它能帮助我们自动生成一系列的特征函数,而不用我们自己生成特征函数,而特征函数正是CRF算法的核心概念之一。一个简单的模板文件如下:在这里,我们需要好好理解下模板文件的规则。T**:%x[#,#]中的T表示模板类型,两个"#"分别表示相对的行偏移与列偏移。一共有两种模板:

训练

crf_learn -f 3 -c 4.0 -m 100 template train.data crf_model > train.rst

其中,template为模板文件,train.data为训练语料,-t表示可以得到一个model文件和一个model.txt文件,其他可选参数说明如下:

-f, –freq=INT使用属性的出现次数不少于INT(默认为1)-m, –maxiter=INT设置INT为LBFGS的最大迭代次数 (默认10k)-c, –cost=FLOAT    设置FLOAT为代价参数,过大会过度拟合 (默认1.0)-e, –eta=FLOAT设置终止标准FLOAT(默认0.0001)-C, –convert将文本模式转为二进制模式-t, –textmodel为调试建立文本模型文件-a, –algorithm=(CRF|MIRA)    选择训练算法,默认为CRF-L2-p, –thread=INT线程数(默认1),利用多个CPU减少训练时间-H, –shrinking-size=INT    设置INT为最适宜的跌代变量次数 (默认20)-v, –version显示版本号并退出-h, –help显示帮助并退出

输出信息

iter:迭代次数。当迭代次数达到maxiter时,迭代终止terr:标记错误率serr:句子错误率obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成diff:与上一个对象值之间的相对差。当此值低于eta时,训练完成

预测

在训练完模型后,我们可以使用训练好的模型对新数据进行预测,预测命令格式如下:

crf_test -m crf_model test.data > test.rstt

-m model表示使用我们刚刚训练好的model模型,预测的数据文件为test.data> test.rstt  表示将预测后的数据写入到test.rstt  中。

3

实践2:基于sklearn_crfsuite实现NER

sklearn_crfsuite简介

sklearn-crfsuite是基于CRFsuite库的一款轻量级的CRF库。该库兼容sklearn的算法,因此可以结合sklearn库的算法设计实体识别系统。sklearn-crfsuite不仅提供了条件随机场的训练和预测方法还提供了评测方法。

https://sklearn-crfsuite.readthedocs.io/en/latest/#

安装:pip install sklearn-crfsuite

特征与模型创建

特征构造:模型初始化

crf_model = sklearn_crfsuite.CRF(algorithm='lbfgs',c1=0.25,c2=0.018,max_iterations=100,all_possible_transitions=True,verbose=True)
crf_model.fit(X_train, y_train)

完整代码如下:

import re
import sklearn_crfsuite
from sklearn_crfsuite import metrics
import joblib
import yaml
import warningswarnings.filterwarnings('ignore')def load_data(data_path):data = list()data_sent_with_label = list()with open(data_path, mode='r', encoding="utf-8") as f:for line in f:if line.strip() == "":data.append(data_sent_with_label.copy())data_sent_with_label.clear()else:data_sent_with_label.append(tuple(line.strip().split(" ")))return datadef word2features(sent, i):word = sent[i][0]features = {'bias': 1.0,'word': word,'word.isdigit()': word.isdigit(),}if i > 0:word1 = sent[i-1][0]words = word1 + wordfeatures.update({'-1:word': word1,'-1:words': words,'-1:word.isdigit()': word1.isdigit(),})else:features['BOS'] = Trueif i > 1:word2 = sent[i-2][0]word1 = sent[i-1][0]words = word1 + word2 + wordfeatures.update({'-2:word': word2,'-2:words': words,'-3:word.isdigit()': word1.isdigit(),})if i > 2:word3 = sent[i - 3][0]word2 = sent[i - 2][0]word1 = sent[i - 1][0]words = word1 + word2 + word3 + wordfeatures.update({'-3:word': word3,'-3:words': words,'-3:word.isdigit()': word1.isdigit(),})if i < len(sent)-1:word1 = sent[i+1][0]words = word1 + wordfeatures.update({'+1:word': word1,'+1:words': words,'+1:word.isdigit()': word1.isdigit(),})else:features['EOS'] = Trueif i < len(sent)-2:word2 = sent[i + 2][0]word1 = sent[i + 1][0]words = word + word1 + word2features.update({'+2:word': word2,'+2:words': words,'+2:word.isdigit()': word2.isdigit(),})if i < len(sent)-3:word3 = sent[i + 3][0]word2 = sent[i + 2][0]word1 = sent[i + 1][0]words = word + word1 + word2 + word3features.update({'+3:word': word3,'+3:words': words,'+3:word.isdigit()': word3.isdigit(),})return featuresdef sent2features(sent):return [word2features(sent, i) for i in range(len(sent))]def sent2labels(sent):return [ele[-1] for ele in sent]
train=load_data('data/train.txt')
valid=load_data('data/train.txt')
test=load_data('data/train.txt')
print(len(train),len(valid),len(test))sample_text=''.join([c[0] for c in train[0]])
sample_tags=[c[1] for c in train[0]]
print(sample_text)
print(sample_tags)X_train = [sent2features(s) for s in train]
y_train = [sent2labels(s) for s in train]X_dev = [sent2features(s) for s in valid]
y_dev = [sent2labels(s) for s in valid]
# **表示该位置接受任意多个关键字(keyword)参数,在函数**位置上转化为词典 [key:value, key:value ]
crf_model = sklearn_crfsuite.CRF(algorithm='lbfgs',c1=0.25,c2=0.018,max_iterations=100,all_possible_transitions=True,verbose=True)
crf_model.fit(X_train, y_train)

训练效果如下:

labels=list(crf_model.classes_)
labels.remove("O")
y_pred = crf_model.predict(X_dev)
metrics.flat_f1_score(y_dev, y_pred,average='weighted', labels=labels)
sorted_labels = sorted(labels,key=lambda name: (name[1:], name[0]))
print(metrics.flat_classification_report(y_dev, y_pred, labels=sorted_labels, digits=3
))

4

参考资料

参考资料

  • 实体识别(1) -实体识别任务简介

  • 条件随机场CRF及CRF++安装与使用 https://www.biaodianfu.com/crf.html

  • 使用CRF++实现命名实体识别(NER) https://www.cnblogs.com/jclian91/p/10795413.html

  • 利用crf++进行实体识别
    https://www.jianshu.com/p/f5868fdd96d2

最近文章

EMNLP 2022 和 COLING 2022,投哪个会议比较好?

一种全新易用的基于Word-Word关系的NER统一模型,刷新了14种数据集并达到新SoTA

阿里+北大 | 在梯度上做简单mask竟有如此的神奇效果


下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!  后台回复【五件套】
下载二:南大模式识别PPT  后台回复【南大模式识别】

投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

整理不易,还望给个在看!

命名实体识别实践 - CRF相关推荐

  1. 流水的NLP铁打的NER:命名实体识别实践与探索

    前言 最近在做命名实体识别(Named Entity Recognition, NER)的工作,也就是序列标注(Sequence Tagging),老 NLP task 了,就是从一段文本中抽取到找到 ...

  2. 【NLP】流水的NLP铁打的NER:命名实体识别实践与探索

    作者:王岳王院长 知乎:https://www.zhihu.com/people/wang-yue-40-21 github: https://github.com/wavewangyue 编辑:yu ...

  3. 知识图谱 基于CRF的命名实体识别模型

    基于CRF的命名实体识别模型 条件随机场 CRF ​ 条件随机场 CRF 是在已知一组输入随机变量条件的情况下,输出另一组随机变量的条件概率分布模型:其前提是假设输出随机变量构成马尔可夫随机场:条件随 ...

  4. 基于BERT+BiLSTM+CRF的中文景点命名实体识别

    赵平, 孙连英, 万莹, 葛娜. 基于BERT+BiLSTM+CRF的中文景点命名实体识别. 计算机系统应用, 2020, 29(6): 169-174.http://www.c-s-a.org.cn ...

  5. 中文命名实体识别(tensorflow,BiLSTM+CRF)

    运行Github上简单的一个命名实体识别BiLSTM+CRF模型 一,版本问题 TensorFlow版本为1.4.0 Python版本为2.7 二,运行环境 Linux操作系统 在Win10下会报错 ...

  6. 【NLP实战系列】Tensorflow命名实体识别实战

    实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式.因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试. 本篇介绍自然语言处理中一种非常重要的任务:命名实体 ...

  7. 面向新闻媒体的命名实体识别技术

    ☝点击上方蓝字,关注我们! [导读] 媒体资讯对新闻事件进行报导或评论,这些新闻事件的基本要素可以使用命名实体识别技术(NER)进行提取,如人物.机构.地点.时间.专有名词等.提取文章中的实体对于自媒 ...

  8. BiLSTM+CRF医学病例命名实体识别项目

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx 数据来自CCKS2018的电子病历命名实体识别的评测任务,是对于给定的一组电子病历纯文本文档 ...

  9. 信息抽取实战:命名实体识别NER【ALBERT+Bi-LSTM模型 vs. ALBERT+Bi-LSTM+CRF模型】(附代码)

    实战:命名实体识别NER 目录 实战:命名实体识别NER 一.命名实体识别(NER) 二.BERT的应用 NLP基本任务 查找相似词语 提取文本中的实体 问答中的实体对齐 三.ALBERT ALBER ...

  10. 【项目实战课】基于BiLSTM+CRF的命名实体识别实战

    欢迎大家来到我们的项目实战课,本期内容是<基于BiLSTM+CRF的命名实体识别实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...

最新文章

  1. LeetCode简单题之最长和谐子序列
  2. 第五课.Linux开发基础
  3. 【原】display:inline-block下的IE元素
  4. java s0 s1_业余草告诉你Java GC 变量含义(S0 S1 E O P YGC YGCT FGC FGCT G
  5. 软件概要设计和详细设计的区别
  6. linux基于文本的配置工具,Linux基本配置和管理 3 ---- Linux命令行文本处理工具
  7. 按钮右对齐_Python Tkinter Button按钮
  8. 那些让我们哭的一塌糊涂的句子
  9. 强制 转换string 的一个简单方法(笔记)
  10. android设置自动开关机,Android开发之设置开机自动启动的几种方法
  11. Flash Builder 找不到Adobe Flash Player或者Flash Builder 找不到debug版本的解决方法
  12. python 测试开发请关注这个新框架
  13. 【原创】Altium Designer Winter 09 笔记 之一
  14. P2313 [HNOI2005]汤姆的游戏
  15. 【优化预测】基于matlab布谷鸟算法优化SVM预测【含Matlab源码 1422期】
  16. Ubuntu 16.04 双网卡 同时上内外网
  17. 困扰我两天的问题(nginx配置好ssl证书,https却不能访问)
  18. 22:紧急措施http://noi.openjudge.cn/ch0107/22/
  19. shineblink BH1750光照强度传感器
  20. 豆瓣最新API-python

热门文章

  1. 设计模式---组件协作模式之观察者模式(Observer)
  2. 20个最常用的Windows命令行
  3. 简单的Android文件浏览器(附源代码)
  4. 修改注册表设置桌面和收藏夹路径
  5. 【vs2019MFC】msvcrtd.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 “int __cdecl invoke_mai
  6. VIM插件——vimplus安装(centos 7)
  7. java day47【redis概念 、下载安装 、 命令操作 、持久化操作 、使用Java客户端操作redis】...
  8. HDU 4786 生成树 并查集+极大极小值 黑白边 确定选择白边的数量
  9. 流媒体应用程序Mobdro或存在安全隐患
  10. win10 升级导致找不到SQL Server配置管理器