从头开始训练一个词性标注模型
文章目录
- 从头开始训练一个词性标注模型
- 自定义模型
- 一、导入所需要的包与模块
- 二、自定义词性
- 三、词性标注
- 训练模型
- 一、模型参数的注解(语种、输出目录以及训练迭代次数)
- 二、创建一个空白的语言模型
- 三、放入测试集
- 四、保存模型以及测试模型
- 不足的地方
- 代码
- 参考
从头开始训练一个词性标注模型
词性标注的全称为Part-Of-Speech tagging。顾名思义,词性标注是为输入文本中的单词标注对应词性的过程。
spaCy 词性标注模型是一种统计模型,它不同于检查一个词是否属于停用词这种基于规则的检查流程。统计加预测的特性,意味着我们可以自己训练一个模型,以便获得更优的预测结果,新的预测过程与使用的数据集更加相关。所谓更优并不一定是数字层面的优化,因为目前的 spaCy 模型的通用词性标注准确率已经达到 97%。
为了使预测结果更准确,权重需要朝特定方向去优化,即增大或减小。spaCy 词性标注器的训练过程示意图如图所示。
接下来开始 spaCy 训练自定义模型。
注:本文使用 spaCy 3.0 代码实现。
自定义模型
一、导入所需要的包与模块
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
二、自定义词性
spaCy 中的单词对象包含一个.tag_
属性,下面是 spaCy 中的 19 个主要词性以及介绍。
导入并初始化了 TAG_MAP 字典
TAG_MAP = {'名词': {'pos': 'NOUN'},'动词': {'pos': 'VERB'},'形容词': {'pos': 'ADJ'},'判断词': {'pos': 'AUX'},'数词': {'pos': 'NUM'},'量词': {'pos': 'DET'},'代词': {'pos': 'PRON'},'副词': {'pos': 'ADV'},'助词': {'pos': 'PART'}
}
三、词性标注
把自定义的词性名称映射到通用词性标注集上,
# 训练样本
TRAIN_DATA = [('你自己的文本', {'tags': ['代词', '动词', '数词', '量词', '名词', '名词']}),('你自己的文本', {'tags': ['代词', '动词', '数词', '量词', '名词', '名词']})
]
训练集可以自由发挥,数据越多,模型的训练效果越好。
训练模型
一、模型参数的注解(语种、输出目录以及训练迭代次数)
@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))
二、创建一个空白的语言模型
使用 add_pipeline
函数创建流水线,并向其中添加标注器
def main(lang='zh', output_dir=None, n_iter=25):nlp = spacy.blank(lang) # 创建一个空的中文模型tagger = nlp.add_pipe('tagger') # 创建流水线# 添加标注器for tag, values in TAG_MAP.items():#print("tag:",tag)#print("values:",values)tagger.add_label(tag)print("3:",tagger)optimizer = nlp.begin_training() # 模型初始化for i in range(n_iter):random.shuffle(TRAIN_DATA) # 打乱列表losses = {}for text, annotations in TRAIN_DATA:example = Example.from_dict(Doc(nlp.vocab, words=text, spaces=[""] * len(text)), annotations)nlp.update([example], sgd=optimizer, losses=losses)print(losses)
三、放入测试集
test_text = "你自己的文本"
doc = nlp(test_text)
print('Tags', [(t.text, t.tag_, TAG_MAP[t.tag_]['pos']) for t in doc])
四、保存模型以及测试模型
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)doc = nlp2(test_text)print('Tags', [(t.text, t.tag_, TAG_MAP[t.tag_]['pos']) for t in doc])
模型的效果如下
# 我喜欢吃苹果
Tags [('我', '代词', 'PRON'), ('喜', '动词', 'VERB'), ('欢', '动词', 'VERB'), ('吃', '动词', 'VERB'), ('苹', '名词', 'NOUN'), ('果', '名词', 'NOUN')]
不足的地方
从效果可以看出模型把每个字都标注了词性,但无法将整个词语进行标注,后续会继续尝试。
代码
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 15 23:57:49 2021@author: 94036使用 spaCy 3.0 进行词性标注
"""
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#=======================自定义词性=============================#
TAG_MAP = {'名词': {'pos': 'NOUN'},'动词': {'pos': 'VERB'},'形容词': {'pos': 'ADJ'},'判断词': {'pos': 'AUX'},'数词': {'pos': 'NUM'},'量词': {'pos': 'DET'},'代词': {'pos': 'PRON'},'副词': {'pos': 'ADV'},'助词': {'pos': 'PART'}
}#=========================词性标注=============================#
TRAIN_DATA = [('你自己的文本', {'tags': ['代词', '动词', '数词', '量词', '名词', '名词']}),('你自己的文本', {'tags': ['代词', '动词', '数词', '量词', '名词', '名词']})
]#==========================训练模型============================#
# 模型参数的注解
@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))# 模型进行训练
def main(lang='zh', output_dir=None, n_iter=25):nlp = spacy.blank(lang) # 创建一个空的中文模型tagger = nlp.add_pipe('tagger') # 创建流水线# 添加标注器for tag, values in TAG_MAP.items():print("tag:",tag)print("values:",values)tagger.add_label(tag)print("3:",tagger)optimizer = nlp.begin_training() # 模型初始化for i in range(n_iter):random.shuffle(TRAIN_DATA) # 打乱列表losses = {}for text, annotations in TRAIN_DATA:example = Example.from_dict(Doc(nlp.vocab, words=text, spaces=[""] * len(text)), annotations)nlp.update([example], sgd=optimizer, losses=losses)print(losses)# 测试样本test_text = "你自己的文本"doc = nlp(test_text)print('Tags', [(t.text, t.tag_, TAG_MAP[t.tag_]['pos']) for t in doc])# 将模型保存到输出目录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)doc = nlp2(test_text)print('Tags', [(t.text, t.tag_, TAG_MAP[t.tag_]['pos']) for t in doc])if __name__ == '__main__':plac.call(main)
参考
1、【法】巴格夫·斯里尼瓦萨-德西坎.《自然语言处理与计算语言学》.人民邮电出版社
从头开始训练一个词性标注模型相关推荐
- 深度学习笔记13_猫狗分类案例 - 从头开始训练一个神经网络
在小型数据集上从头开始训练一个卷积神经网络 小型数据集的模型构建的策略 小型数据集:"很少的"样本可能是几百张图像,也可能是几万张图像. 接下来的示例中,主要用来猫狗分类:4000 ...
- 从头开始训练一个 NER 标注器
文章目录 从头开始训练一个 NER 标注器 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.对现有的模型进行优化 2.创建内置管道组件 3.添加train data的标签 ...
- 从头开始训练一个依存分析器
文章目录 从头开始训练一个依存分析器 重要概念 关系标签 标注关系 应用场景 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.模型参数的注解(语种.输出目录以及训练迭代次 ...
- pytorch:如何从头开始训练一个CNN网络?
文章目录 前言 一.CNN? 二.用单批量测试模型 1.引入库 2.读入数据集 3. 建造Module实例 4. 训练 总结 前言 在刚开始学习Deep Learning时,一件几乎不可能的事情就是知 ...
- 把一个dataset的表放在另一个dataset里面_使用中文维基百科语料库训练一个word2vec模型并使用说明...
本篇主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/ WikiExtr ...
- 使用中文维基百科语料库训练一个word2vec模型
本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/20180720 ...
- 使用中文维基百科语料库训练一个word2vec模型 12.1
转自:https://blog.csdn.net/sinat_29957455/article/details/81432846 本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模 ...
- 手把手教你用MindSpore训练一个AI模型!
首先我们要先了解深度学习的概念和AI计算框架的角色(https://zhuanlan.zhihu.com/p/463019160),本篇文章将演示怎么利用MindSpore来训练一个AI模型.和上一章 ...
- 从头开始训练一个检测QR二维码区域的YOLOv3模型
条形码和二维码在识别的时候主要包含定位和解码两个步骤.寻找码的位置,除了用传统的图像算法之外,也可以借助深度学习.那么深度学习的效率如何,我做了一个实验. 为QR二维码训练YOLOv3模型 编译Dar ...
最新文章
- 信息学奥赛C++语言:移数问题
- JavaScript是如何工作的:Web推送通知的机制
- PMP学习资料干货分享 - 干货满满
- NotifyIcon的属性、事件、方法
- 网络监控与安全 | 主要网络流量处理技术
- NoteExpress中遇到的坑
- 做一个业务中台你到底会踩多少坑?
- C++链表偶数在前,奇数在后的简单方法
- 三子棋 Tic-Tac-Toe
- 微软提出基于知识图谱的深度神经网络DKN用于新闻推荐
- 火影T5A笔记本系统损坏了无法进入桌面怎么办?
- db2嵌套查询效率_提高DB2 查询性能的常用方法
- 基于flowable的审批系统安装及部署
- 学习笔记:CODESYS(顺序功能图SFC)
- 论文阅读笔记《Decoupled Visual Servoing With Fuzzy Q-Learning》
- MIT 线性代数(16—18)读书笔记
- Linux系统引导过程及修复引导
- 视频编辑软件中如何制作字幕末屏停留
- 如何用计算机拍照,怎样用电脑照相
- HZ_WM向同仁新年问好!猪年快乐!
热门文章
- 一次迭代式开发的研究:一个迭代式项目计划
- mysql connector安装教程_Debezium:mysql connector安装
- DOS环境下出现“ ‘javac‘不是内部或外部命令,也不是可运行的程序或皮处理文件 “的报错的解决方法
- DLL注入_远程线程注入
- 注册苹果开发者帐号 用什么银行的什么卡好? 收款帐号呢?
- RAID 0、RAID1、RAID5、RAID10的区别
- 【算法】第三届全国大学生算法设计与编程挑战赛(冬季赛)
- 网站安全不可忽视--一个收费网站的破解过程
- php echo 后必须die,die 提示的消息都去哪了?
- 使用素描图像识别人脸