文章目录

  • 从头开始训练一个词性标注模型
  • 自定义模型
    • 一、导入所需要的包与模块
    • 二、自定义词性
    • 三、词性标注
  • 训练模型
    • 一、模型参数的注解(语种、输出目录以及训练迭代次数)
    • 二、创建一个空白的语言模型
    • 三、放入测试集
    • 四、保存模型以及测试模型
  • 不足的地方
  • 代码
  • 参考

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

词性标注的全称为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、【法】巴格夫·斯里尼瓦萨-德西坎.《自然语言处理与计算语言学》.人民邮电出版社

从头开始训练一个词性标注模型相关推荐

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

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

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

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

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

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

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

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

  5. 把一个dataset的表放在另一个dataset里面_使用中文维基百科语料库训练一个word2vec模型并使用说明...

    ​本篇主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/ WikiExtr ...

  6. 使用中文维基百科语料库训练一个word2vec模型

    本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/20180720 ...

  7. 使用中文维基百科语料库训练一个word2vec模型 12.1

    转自:https://blog.csdn.net/sinat_29957455/article/details/81432846 本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模 ...

  8. 手把手教你用MindSpore训练一个AI模型!

    首先我们要先了解深度学习的概念和AI计算框架的角色(https://zhuanlan.zhihu.com/p/463019160),本篇文章将演示怎么利用MindSpore来训练一个AI模型.和上一章 ...

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

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

最新文章

  1. 信息学奥赛C++语言:移数问题
  2. JavaScript是如何工作的:Web推送通知的机制
  3. PMP学习资料干货分享 - 干货满满
  4. NotifyIcon的属性、事件、方法
  5. 网络监控与安全 | 主要网络流量处理技术
  6. NoteExpress中遇到的坑
  7. 做一个业务中台你到底会踩多少坑?
  8. C++链表偶数在前,奇数在后的简单方法
  9. 三子棋 Tic-Tac-Toe
  10. 微软提出基于知识图谱的深度神经网络DKN用于新闻推荐
  11. 火影T5A笔记本系统损坏了无法进入桌面怎么办?
  12. db2嵌套查询效率_提高DB2 查询性能的常用方法
  13. 基于flowable的审批系统安装及部署
  14. 学习笔记:CODESYS(顺序功能图SFC)
  15. 论文阅读笔记《Decoupled Visual Servoing With Fuzzy Q-Learning》
  16. MIT 线性代数(16—18)读书笔记
  17. Linux系统引导过程及修复引导
  18. 视频编辑软件中如何制作字幕末屏停留
  19. 如何用计算机拍照,怎样用电脑照相
  20. HZ_WM向同仁新年问好!猪年快乐!

热门文章

  1. 一次迭代式开发的研究:一个迭代式项目计划
  2. mysql connector安装教程_Debezium:mysql connector安装
  3. DOS环境下出现“ ‘javac‘不是内部或外部命令,也不是可运行的程序或皮处理文件 “的报错的解决方法
  4. DLL注入_远程线程注入
  5. 注册苹果开发者帐号 用什么银行的什么卡好? 收款帐号呢?
  6. RAID 0、RAID1、RAID5、RAID10的区别
  7. 【算法】第三届全国大学生算法设计与编程挑战赛(冬季赛)
  8. 网站安全不可忽视--一个收费网站的破解过程
  9. php echo 后必须die,die 提示的消息都去哪了?
  10. 使用素描图像识别人脸