源码地址:https://github.com/ZhixiuYe/NER-pytorch

本篇正式进入源码的阅读,按照流程顺序,一一解剖。

一、流程图

二、详细步骤

1、数据预处理

1)将数据集从文件中加载出来,如果句子中出现了数字,会将其置零(可选),删除

无用句。

2)转换标注模式,将iob1(数据集原有标注模式)转换为iob2,如果选用的是IOBES则将iob2转换成iobes,选用的是IOB,则将iob2返回。iob1和iob2都是表示里面只有I、O、B,不同的是iob1中的B是为了隔断同类实体不同实体名的,而iob2中的B是为了作为实体名的开头的。iobes中包含I(实体名内部)、O(非实体)、B(实体的开头)、E(实体的结尾)、S(单字实体名)。

下例将说明iob1、iob2、iobes的形式:

3)创建word、char、tag、cap字典(根据训练集)。

word字典:统计单词词频,筛选出词频大于3的单词,按照词频逆序、单词顺序对单词由0开始编号并加入字典中。除此,加入''、''这两个单词,分别表示pad和未知词汇,赋予最大的两个编号。

char字典:统计字母频数,按照词频逆序、字母顺序对字母由0开始编号并加入字典中,除此,加入''并赋予最大的编号。

tag字典:统计标签频数,按照标签频数逆序、标签顺序对标签由0开始编号并加入字典中,除此,加入''和''并分别赋予-1和-2编号

cap字典:无法创建字典,映射关系为全小写:0,全大写:1,首字母大写:2,其他:3。

4)根据3创建的字典和映射关系,分别对训练集、验证集、测试集的word、char、cap、tag等特征做数值化。得出的数据集中每一句由{'str_words': str_words,'words': words,'chars': chars,'caps': caps,'tags': tags,}字典组成,句中每个单词对应一个这样的字典。

2、进入训练

从上面的数据预处理中,假如我们得到这么一个句子数据:

{'str_words': ['Amy','goes','to','Beijing','to','visit','Peking','University'],

'words': [0,1,2,3,2,4,5,6],

'chars': [[0, 1, 2], [3, 4, 5, 6], [7, 4], [8, 5, 9, 10, 9, 11, 3], [7, 4], [12, 9, 6, 9, 7], [13, 5, 14, 9, 11, 3], [15, 11, 9, 12, 5, 16, 6, 9, 7, 2]],

'caps': [2,0,0,2,0,0,2,2],

'tags': [0,1,1,2,1,1,3,3], }

注:该示例的words、chars、tags并未按照1所说的根据词频进行的编码,只是按照出现的先后顺序进行的编码。

1)char Embedding

① 对'chars'根据word长度进行排序,得到排序后的列表,与原列表对比生成索引映射关系。

② 对排序后的列表进行mask处理,即对word进行尾部填充0知道达到最长word长度。本例中,即是生成:[[15, 11, 9, 12, 5, 16, 6, 9, 7, 2],[8, 5, 9, 10, 9, 11, 3, 0, 0, 0],......],为8×10的矩阵。

③将生成的char新矩阵输入Embedding层,设置的size为25,在本例中将得到8×10×25的矩阵,并进行转置,成为10×8×25的矩阵。

④对得到的矩阵进行pack操作(去除pad),成为39×25的PackedSequence,batchsize为(10,7,6,5,4,3,2,2)。

⑤ 将PackedSequence输入到双向LSTM中,然后把输出的output的pack操作还原回去,再进行转置操作。

⑥ 提取出output中最后一个字母的out和第一个字母的out进行拼接,并且将排序的结果还原。

注:如果在进行pack操作时,选择batch_first=True,则不用进行转置操作;进行长度排序是pack操作必经的过程;双向lstm的结果的第三维长度为2*size,拼接时选择第一个字母的后size长度(t→1)和最后一个字母的前size长度(1→t)。

2)word Embedding

输入embedding层

3)cap Embedding

输入embedding层

4)拼接所有的Embedding并输入LSTM中

① 拼接char、word、cap Embedding

② 对最终的Embedding增加第二维(unsqueeze)

③ 输入到dropout层

④ 输入到双向LSTM层

⑤ 减去第二维

⑥ 输入到dropout层

⑦ 输入到一个线性层

5)无crf的话,使用交叉熵作为loss函数。

cap流程图_源码阅读笔记 BiLSTM+CRF做NER任务(二)相关推荐

  1. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  2. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架

    1.概述 转载:Flink 源码阅读笔记(15)- Flink SQL 整体执行框架 在数据处理领域,无论是实时数据处理还是离线数据处理,使用 SQL 简化开发将会是未来的整体发展趋势.尽管 SQL ...

  5. dgl源码阅读笔记(3)——DeepWalk

    dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 文章目录 dgl源码阅读笔记(3)--DeepWalk 图神经网络开源库dgl阅读笔记 @[TOC](文章目录) 前言 一 ...

  6. syzkaller 源码阅读笔记1(syz-extract syz-sysgen)

    文章目录 1. syz-extract 1-0 总结 1-1. `main()` 1-2 `archList()` - `1-1 (3)` 获取架构 name list 1-3 `createArch ...

  7. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

  8. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

  9. AQS源码阅读笔记(一)

    AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node {//表示当前节点以共享模式等待锁static final Node SHA ...

最新文章

  1. Linux中iptraf命令详解(IP局域网监控工具)
  2. python实战系列之爬取CSDN博客之星2020年度排名情况(附源码)
  3. c++ 如何获取网络时间_云台山茶旅集团如何四年时间获取十万老人的万千目光...
  4. oracle 数据立方_大数据之数据仓库分层
  5. python定义16进制数组_python 文件转成16进制数组的实例
  6. Python判断变量的数据类型的两种方法
  7. 单片机课程设计数字心率计_如何选购合适的PH计
  8. 信息学奥赛一本通 1004:字符三角形 | OpenJudge NOI 1.1 08
  9. Web PostMessage
  10. 公共技术点之 Android 动画基础
  11. 437.路径总和III (力扣leetcode) 博主可答疑该问题
  12. 百度网盘linux微博登录,百度网盘,微博登录
  13. python爬取简历模板_python爬取简历模板
  14. source insight 3.5 配置文件GLOBAL.CF3--免费
  15. 安装VS2019、MFC,并创建MFC工程文件,查看工程信息
  16. 群辉nas虚拟linux,UNRAID教程:3分钟 用unraid自带的虚拟机 安装 黑群晖NAS DSM系统 很强大!...
  17. Zabbix监控学习系列(2):agent的安装与Server端添加客户端
  18. Qt5编译使用QFtp
  19. 计算机网络复习记录 (2)Chap 4
  20. Spring框架文档(二 )

热门文章

  1. CTF-window和linux下命令执行的知识
  2. Python对字符串进行左右中对齐
  3. 因为返回有true ajax提示进入错误,jquery ajax中error返回错误解决办法
  4. 计算机网络通信有哪些研究课题,科研进阶 | 西北大学 | 电子信息工程、通信与信息系统:通信与计算机网络...
  5. linux全自动安装光盘,CentOS7全自动安装光盘制做详解
  6. VMware ubuntu虚拟机怎么设置分辨率?(全屏显示、大屏显示)
  7. Intel Realsense D435报错:RuntimeError: Acquire failed!
  8. tensorflow tf.train.Saver.restore() (用于下次训练时恢复模型)
  9. Winmail邮件服务器
  10. linux——DHCP的配置问题