文章目录

  • 从头开始训练一个 NER 标注器
  • 一、自定义模型
    • 1、导入所需要的包与模块
    • 2、导入训练样本
  • 二、训练模型
    • 1、对现有的模型进行优化
    • 2、创建内置管道组件
    • 3、添加train data的标签
    • 4、构建模型
    • 5、模型保存
  • 三、模型测试
  • 参考

从头开始训练一个 NER 标注器

NER 标注的中文名为命名实体识别,与词性标注一样是自然语言处理的技术基础之一。NER 标注是指对现实世界中某个对象的名称的识别,例如法国、Donald Trump 或者微信。在这些词汇中法国是一个国家,标识为 GPE(地缘整治实体),Donald Trump 标识为 PER(人名),微信是一家公司,因此被标识为 ORG(组织)。

在spaCy的模块中常见的实体类型有:

NER标注的作用:
1)显而易见最主要的是通过模型可以识别出文本中需要的实体。
2)可以推导出实体之间的关系;例如,Rome is the capital of Italy,可以根据实体识别可以判断出 Rome 是意大利的城市而不是 R&B 艺术家,这项工作叫实体消岐(NED);

NED的使用场景可以在医学研究中消除词语歧义鉴定基因和基因产物,写作风格分析等。

接下来开始 spaCy 训练 NER 标注器。

注:本文使用 spaCy 3.0 代码实现。

一、自定义模型

1、导入所需要的包与模块

from __future__ import unicode_literals, print_function
import plac
import random
from pathlib import Path
import spacy
from spacy.training import Example
from spacy.tokens import Doc

2、导入训练样本

实体标注的索引从 0 开始 17 是最后一字符的索引 +1 ,索引参考python索引方法

# training data
TRAIN_DATA = [('Who is Shaka Khan?', {'entities': [(7, 17, 'PERSON')] }),('I like London and Berlin.', {'entities': [(7, 13, 'LOC'), (18, 24, 'LOC')]})
]

虽然示例中的训练样本数量不多,但是具有代表性。

二、训练模型

1、对现有的模型进行优化

if model is not None:nlp = spacy.load(model)  # 加载存在的模型  print("Loaded model '%s'" % model)else:nlp = spacy.blank('en')  # 创建空白模型print("Created blank 'en' model")

2、创建内置管道组件

使用 add_pipeline函数创建流水线

if 'ner' not in nlp.pipe_names:ner = nlp.create_pipe('ner')nlp.add_pipe('ner', last=True)else:ner = nlp.get_pipe('ner')

3、添加train data的标签

for _, annotations in TRAIN_DATA:for ent in annotations.get('entities'):ner.add_label(ent[2])

4、构建模型

训练过程本身很简单,nlp.update()方法为我们抽象了所有内容,由 spaCy 处理实际的机器学习和训练过程。

# 禁用流水线中所有其他组件,以便只训练/更新NER标注器
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']with nlp.disable_pipes(*other_pipes):  # 仅训练我们标注的标签,假如没有则会对所有的标签训练,for itn in range(n_iter):random.shuffle(TRAIN_DATA)     # 训练数据每次迭代打乱顺序losses = {}                    # 定义损失函数for text, annotations in TRAIN_DATA:# 对数据进行整理成新模型需要的数据example = Example.from_dict(nlp.make_doc(text), annotations)    print("example:",example)nlp.update([example],  # 批注drop=0.5,sgd=optimizer,  # 更新权重losses=losses)print(losses)

5、模型保存

if output_dir is not None:output_dir = Path(output_dir)if not output_dir.exists():output_dir.mkdir()nlp.to_disk(output_dir)print("Saved model to", output_dir)

三、模型测试

def load_model_test(path,text):nlp = spacy.load(path)print("Loading from", path)doc = nlp(text)for i in doc.ents:print(i.text,i.label_)if __name__ == "__main__":path = "./model/"text = "Who is Shaka Khan"load_model_test(path,text)

模型的效果如下

Loading from ./model/
Shaka Khan PERSON

可以的到 Shaka Khan 标注为 PERSON,即人名。

参考

【法】巴格夫·斯里尼瓦萨-德西坎.《自然语言处理与计算语言学》.人民邮电出版社

从头开始训练一个 NER 标注器相关推荐

  1. 从头开始训练一个依存分析器

    文章目录 从头开始训练一个依存分析器 重要概念 关系标签 标注关系 应用场景 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.模型参数的注解(语种.输出目录以及训练迭代次 ...

  2. 从头开始训练一个词性标注模型

    文章目录 从头开始训练一个词性标注模型 自定义模型 一.导入所需要的包与模块 二.自定义词性 三.词性标注 训练模型 一.模型参数的注解(语种.输出目录以及训练迭代次数) 二.创建一个空白的语言模型 ...

  3. 深度学习笔记13_猫狗分类案例 - 从头开始训练一个神经网络

    在小型数据集上从头开始训练一个卷积神经网络 小型数据集的模型构建的策略 小型数据集:"很少的"样本可能是几百张图像,也可能是几万张图像. 接下来的示例中,主要用来猫狗分类:4000 ...

  4. pytorch:如何从头开始训练一个CNN网络?

    文章目录 前言 一.CNN? 二.用单批量测试模型 1.引入库 2.读入数据集 3. 建造Module实例 4. 训练 总结 前言 在刚开始学习Deep Learning时,一件几乎不可能的事情就是知 ...

  5. 从头开始训练一个检测QR二维码区域的YOLOv3模型

    条形码和二维码在识别的时候主要包含定位和解码两个步骤.寻找码的位置,除了用传统的图像算法之外,也可以借助深度学习.那么深度学习的效率如何,我做了一个实验. 为QR二维码训练YOLOv3模型 编译Dar ...

  6. 代理方式部署NER标注平台doccano

    背景 从事NLP工作的小伙伴或多或少会接触数据标注,这里要提到老牌的brat1标注平台,只需一个简单的配置文件和一个存储标注数据的文件夹即可完成搭建.由于brat标注平台出现的比较早,网络上有大量的文 ...

  7. spaCy的方法进行训练一个新的招投标实体标注模型

    前言 NER标注的中文名为命名实体识别,与词性标注一样是自然 语言处理的技术基础之一. NER标注是指对现实世界中某个对象的名称的识别,例如法 国.Donald Trump或者微信.在这些词汇中法国是 ...

  8. python神经网络训练数据_用Python从头开始实现一个神经网络

    注:本篇文章非原创,翻译自Implementing a Neural Network from Scratch in Python – An Introduction​www.wildml.com ...

  9. 如何从头训练一个一键抠图模型

    如何从头训练一个一键抠图模型 1. 前言 抠图是图像编辑的基础功能之一,在抠图的基础上可以发展出很多有意思的玩法和特效.比如一键更换背景.一键任务卡通化.一键人物素描化等.正是因为这些有意思的玩法,C ...

最新文章

  1. Acwing第 12 场周赛【未完结】
  2. 基于VTK User Guide和VTK Textbook学习
  3. 可惜Java中没有yield return
  4. xxl子任务_XXL-JOB v2.1.2 发布,分布式任务调度平台
  5. c语言从html控件sscanf,sscanf与sprintf在C语言中的用法
  6. 【androidjniNDk】详细介绍每一步,让你轻松掌握android JNI NDk
  7. Unity调用动态链接库dll和so
  8. 042 第一章 简介
  9. gns3 桥接linux,GNS3之与本机桥接步骤
  10. Qt数据库应用3-数据打印到pdf
  11. RIGOL DS70000系列示波器在USB2.0一致性分析测试方案
  12. 苏州科技大学的计算机专业怎么样,苏州科技大学怎么样?有什么王牌专业?排名如何?...
  13. Ubuntu如何发音
  14. 可达性分析算法(自用)
  15. 使用TabLayout+ViewPager+Fragment实现切页展示
  16. 【谈谈】动态规划——求最长公共子序列
  17. 生命不息,折腾不止:Jetson Nano填坑之硬件篇
  18. 一位架构师用服务打动客户的故事之二
  19. Java——基础知识
  20. 计算机SCI 源代码,计算机类SCI检索源刊

热门文章

  1. 强监管焕新外卖行业,美团、饿了么如何应对?
  2. console,控制台也能玩出花样(console操作大全)
  3. 学习(一)C#利用窗体打开Excel文件进行正常访问和写入
  4. opencv-python 详解图像梯度、边缘检测
  5. 获取手机验证码按钮的效果实现
  6. 干货:构建C/C++良好的工程结构
  7. pygame学习笔记——检测鼠标碰到、点击图片
  8. php中表格标记是,HTML标记语言——表格标记_HTML/Xhtml_网页制作
  9. python控制鼠标移动
  10. python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数