文章目录

  • 从头开始训练一个依存分析器
    • 重要概念
    • 关系标签
    • 标注关系
    • 应用场景
  • 一、自定义模型
    • 1、导入所需要的包与模块
    • 2、导入训练样本
  • 二、训练模型
    • 1、模型参数的注解(语种、输出目录以及训练迭代次数)
    • 2、对现有的模型进行优化
    • 3、创建内置管道组件
    • 4、添加train data的标签
    • 5、构建模型
    • 6、模型保存
  • 三、模型测试
  • 不足的地方
  • 参考

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

依存句法通过分析语言单位内成分之前的依存关系解释其句法结构,主张句子中核心动词是支配其他成分的中心成分。而它本身却不受其他任何成分的支配,所有受支配成分都以某种关系从属于支配者。

重要概念

  • 依存句法认为“谓语”中的动词是一个句子的中心,其他成分与动词直接或间接地产生联系。
  • 依存句法理论中,“依存”指词与词之间支配与被支配的关系,这种关系不是对等的,这种关系具有方向。确切的说,处于支配地位的成分称之为支配者,而处于被支配地位的成分称之为从属者。
  • 依存语法本身没有规定要对依存关系进行分类,但为了丰富依存结构传达的句法信息,在实际应用中,一般会给依存树的边加上不同的标记。
  • 依存语法存在一个共同的基本假设:句法结构本质上包含词和词之间的依存(修饰)关系。一个依存关系连接两个词,分别是核心词和依存词。依存关系可以细分为不同的类型,表示两个词之间的具体句法关系。

关系标签

标签表示从属的语法功能,名词性的标签是:

  • root:中心词,通常是动词
  • nsubj:名词性主语(nominal subject)
  • dobj:直接宾语(direct object)
  • prep:介词
  • pobj:介词宾语
  • cc:连词

其他常用的标签:

  • compound:复合词
  • advmod:状语
  • det:限定词
  • amod:形容词修饰语-

标注关系

中文依存分析关系如下:

应用场景

  • 帮助进行NER标注:名词短语通常被标记为一个完整的实体,这些短语经过语法解析后就可以被准确识别。
  • 机器翻译:通过构建完整的语法树,可以正确的建立词语之间的关系避免翻译歧义。
  • 通过重新定义词语之间的联系,识别词语之间的关系,例如:人物亲戚关系。

接下来开始 spaCy 训练依存分析器。

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

一、自定义模型

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

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

2、导入训练样本

TRAIN_DATA = [("房祖名 是 成龙 的 儿子", {'heads': [2, 4, 2, 2, 0],'deps': ['SON', '-', 'ROOT', '-', 'ATT']}),("张若昀 的 妻子 是 唐艺昕", {'heads': [0, 0, 4, 2, 0],'deps': ['ROOT', '-', 'ATT', '-', 'HUS']}),("陈凯歌 是 陈赫 的 舅舅", {'heads': [2, 4, 2, 2, 0],'deps': ['UNCLE', '-', 'ROOT', '-', 'ATT']}),("焦曼婷 是 焦恩俊 的 女儿", {'heads': [2, 4, 2, 2, 0],'deps': ['DAU', '-', 'ROOT', '-', 'ATT']})
]

数据可以自己再添加,越多越好,其中heads为根据下标的依存匹配(即从属词与支配词的划分)。

二、训练模型

1、模型参数的注解(语种、输出目录以及训练迭代次数)

@plac.annotations(lang=("ISO Code of language to use", "option", "l", str),output_dir=("Optional output directory", "option", "o", Path),n_iter=("Number of training iterations", "option", "n", int))

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

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

3、创建内置管道组件

使用 add_pipeline函数创建流水线

if 'parser' in nlp.pipe_names:nlp.remove_pipe('parser')
parser = nlp.add_pipe('parser', first=True)

4、添加train data的标签

for text, annotations in TRAIN_DATA:for dep in annotations.get('deps', []):parser.add_label(dep)

5、构建模型

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

# 禁用流水线中所有其他组件,以便只训练/更新NER标注器
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'parser']with nlp.disable_pipes(*other_pipes):  # 仅训练我们标注的标签,假如没有则会对所有的标签训练,for itn in range(n_iter):random.shuffle(TRAIN_DATA)     # 训练数据每次迭代打乱顺序losses = {}                    # 定义损失函数for batch in spacy.util.minibatch(TRAIN_DATA, size=2):for text, annotations in batch:#建立一个案例doc = nlp.make_doc(text)example = Example.from_dict(doc, annotations)nlp.update([example], losses=losses, drop=0.3)print(losses)

6、模型保存

test_model(nlp)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)print("Loading from", output_dir)nlp2 = spacy.load(output_dir)test_model(nlp2)

三、模型测试

def test_model(nlp):texts = ["小红 是 小绿 的 妻子","房祖名 和 成龙 的 关系 是 父子","张晓龙 和 张佳宁 的 舅舅"]docs = nlp.pipe(texts)for doc in docs:print(doc.text)print([(t.text, t.dep_, t.head.text) for t in doc if t.dep_ != '-'])if __name__ == '__main__':plac.call(main)

模型的效果如下

小红 是 小绿 的 妻子
[('小红', 'FAT', '小绿'), ('是', 'dep', '小红'), ('小绿', 'ROOT', '小绿'), ('妻子', 'dep', '小绿')]
房祖名 和 成龙 的 关系 是 父子
[('房祖名', 'SON', '成龙'), ('和', 'dep', '房祖名'), ('成龙', 'ROOT', '成龙'), ('关系', 'ATT', '父子'), ('父子', 'dep', '成龙')]
张晓龙 和 张佳宁 的 舅舅
[('张晓龙', 'UNCLE', '张佳宁'), ('和', 'dep', '张晓龙'), ('张佳宁', 'ROOT', '张佳宁'), ('舅舅', 'dep', '张佳宁')]

可以看到效果还是可以的,只有第一条没有匹配成功。

不足的地方

本文模型用的是英文模型,可以看到本文将中文句子事先用空格隔开,以到达成功训练,后续待改进。

参考

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

2、https://zhuanlan.zhihu.com/p/51186364

3、https://blog.csdn.net/sinat_33741547/article/details/79258045

从头开始训练一个依存分析器相关推荐

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

    文章目录 从头开始训练一个 NER 标注器 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.对现有的模型进行优化 2.创建内置管道组件 3.添加train data的标签 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 谷歌新作:视觉Transformer超越ResNet!!!从头开始训练!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 When Vision Transformers Outperform ResNets without ...

  9. 3.9 训练一个 Softmax 分类器-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.8 Softmax 回归 回到目录 3.10 深度学习框架 训练一个 Softmax 分类器 (Training a Softmax Classifier) 上一个视频中 ...

最新文章

  1. GitHub超3万星:Transformer 3发布,BERT被一分为二
  2. Exchange日常管理之二十二:配置保留策略
  3. The required Server component failed to start so Tomcat is unable to start问题解决
  4. 如何编写常见语言带默认参数值的函数
  5. arcsde9.3 the arcsde repository is not successfully created
  6. [深度学习]CNN--卷积神经网络中用1*1 卷积有什么作用
  7. 前端架构设计1:代码核心
  8. java就_GitHub - IammyselfYBX/This_is_how_Java_should_be_learned: 《Java就应该这样学》
  9. win10 联想键盘快捷键关闭_这些Win10键盘快捷键你必须掌握,系统高手必备技能...
  10. 基于matlab的电子时钟,基于LCD1602电子时钟毕业设计报告.doc
  11. Bitmap 和Drawable 的区别
  12. 【转】并查集算法和路径压缩
  13. Linux系统管理员命令:sudo
  14. Python--day26--封装和@property
  15. 一个创建 docker java jar项目案例 docker-sentinel
  16. 解决办法:nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-xenial)
  17. 手绘 | 7天自助游玩古都西安 3
  18. 基于android的无人健身房
  19. OpenCV的cv::cvtColor()
  20. DockerK8s---通过kubeadm快速部署K8s

热门文章

  1. 尊重孩子 梅兰芳“宠溺有道”
  2. java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon
  3. 数据结构(二): 链表篇
  4. poscms表结构和字段
  5. 符合python语言变量命名规则_符的解释|符的意思|汉典“符”字的基本解释
  6. lftp命令使用 操作系统(Windows、Linux) PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 - powered by phpwhy.com
  7. 用matlab画企鹅代码,CDR绘制超级可爱的QQ企鹅
  8. a8处理器相当于骁龙几_iPhone 8P相当于什么水平的安卓机?发现两点劣势,其它无关紧要...
  9. Xcode 设置macos app的适配系统,显示禁止图标
  10. 最全长文详述“数字人民币简史”,揭开数字人民币神秘面纱