从头开始训练一个依存分析器
文章目录
- 从头开始训练一个依存分析器
- 重要概念
- 关系标签
- 标注关系
- 应用场景
- 一、自定义模型
- 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
从头开始训练一个依存分析器相关推荐
- 从头开始训练一个 NER 标注器
文章目录 从头开始训练一个 NER 标注器 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.对现有的模型进行优化 2.创建内置管道组件 3.添加train data的标签 ...
- 从头开始训练一个词性标注模型
文章目录 从头开始训练一个词性标注模型 自定义模型 一.导入所需要的包与模块 二.自定义词性 三.词性标注 训练模型 一.模型参数的注解(语种.输出目录以及训练迭代次数) 二.创建一个空白的语言模型 ...
- pytorch:如何从头开始训练一个CNN网络?
文章目录 前言 一.CNN? 二.用单批量测试模型 1.引入库 2.读入数据集 3. 建造Module实例 4. 训练 总结 前言 在刚开始学习Deep Learning时,一件几乎不可能的事情就是知 ...
- 深度学习笔记13_猫狗分类案例 - 从头开始训练一个神经网络
在小型数据集上从头开始训练一个卷积神经网络 小型数据集的模型构建的策略 小型数据集:"很少的"样本可能是几百张图像,也可能是几万张图像. 接下来的示例中,主要用来猫狗分类:4000 ...
- 从头开始训练一个检测QR二维码区域的YOLOv3模型
条形码和二维码在识别的时候主要包含定位和解码两个步骤.寻找码的位置,除了用传统的图像算法之外,也可以借助深度学习.那么深度学习的效率如何,我做了一个实验. 为QR二维码训练YOLOv3模型 编译Dar ...
- python神经网络训练数据_用Python从头开始实现一个神经网络
注:本篇文章非原创,翻译自Implementing a Neural Network from Scratch in Python – An Introductionwww.wildml.com ...
- 如何从头训练一个一键抠图模型
如何从头训练一个一键抠图模型 1. 前言 抠图是图像编辑的基础功能之一,在抠图的基础上可以发展出很多有意思的玩法和特效.比如一键更换背景.一键任务卡通化.一键人物素描化等.正是因为这些有意思的玩法,C ...
- 谷歌新作:视觉Transformer超越ResNet!!!从头开始训练!
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 When Vision Transformers Outperform ResNets without ...
- 3.9 训练一个 Softmax 分类器-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 3.8 Softmax 回归 回到目录 3.10 深度学习框架 训练一个 Softmax 分类器 (Training a Softmax Classifier) 上一个视频中 ...
最新文章
- GitHub超3万星:Transformer 3发布,BERT被一分为二
- Exchange日常管理之二十二:配置保留策略
- The required Server component failed to start so Tomcat is unable to start问题解决
- 如何编写常见语言带默认参数值的函数
- arcsde9.3 the arcsde repository is not successfully created
- [深度学习]CNN--卷积神经网络中用1*1 卷积有什么作用
- 前端架构设计1:代码核心
- java就_GitHub - IammyselfYBX/This_is_how_Java_should_be_learned: 《Java就应该这样学》
- win10 联想键盘快捷键关闭_这些Win10键盘快捷键你必须掌握,系统高手必备技能...
- 基于matlab的电子时钟,基于LCD1602电子时钟毕业设计报告.doc
- Bitmap 和Drawable 的区别
- 【转】并查集算法和路径压缩
- Linux系统管理员命令:sudo
- Python--day26--封装和@property
- 一个创建 docker java jar项目案例 docker-sentinel
- 解决办法:nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-xenial)
- 手绘 | 7天自助游玩古都西安 3
- 基于android的无人健身房
- OpenCV的cv::cvtColor()
- DockerK8s---通过kubeadm快速部署K8s
热门文章
- 尊重孩子 梅兰芳“宠溺有道”
- java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon
- 数据结构(二): 链表篇
- poscms表结构和字段
- 符合python语言变量命名规则_符的解释|符的意思|汉典“符”字的基本解释
- lftp命令使用 操作系统(Windows、Linux) PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 - powered by phpwhy.com
- 用matlab画企鹅代码,CDR绘制超级可爱的QQ企鹅
- a8处理器相当于骁龙几_iPhone 8P相当于什么水平的安卓机?发现两点劣势,其它无关紧要...
- Xcode 设置macos app的适配系统,显示禁止图标
- 最全长文详述“数字人民币简史”,揭开数字人民币神秘面纱