0 入门项目
以下项目可以根据自身兴趣选择性了解
0.1 经典开源项目汇总链接
0.2 文本分类
1 常见概念
1.1 曝光偏差(exposure bias)
- 曝光误差(exposure bias)简单来讲是因为文本生成在训练和推断时的不一致造成的。
- 不一致体现在推断和训练时使用的输入不同,在训练时每一个词输入都来自真实样本(GroudTruth),但是在推断时当前输入用的却是上一个词的输出(比如在Bert中)。
1.2 关系抽取中的关系重叠
- Single Entity Overlap (SEO) 单一实体重叠
- Entity Pair Overlap (EPO) 实体对重叠 :即一个实体对之间存在着多种关系
- Subject Object Overlap (SOO) 主客体重叠 :既是主体,又是客体
1.3 Byte Pair Encoding(BPE)
BPE每一步都将最常见的一对*相邻数据单位*替换为该数据中没有出现过的一个*新单位*,反复迭代直到满足停止条件。
假设我们有需要编码(压缩)的数据 aaabdaaabac。相邻字节对(相邻数据单位在BPE中看作相邻字节对) aa 最常出现,因此我们将用一个新字节 Z 替换它。我们现在有了 ZabdZabac,其中 Z = aa。下一个常见的字节对是 ab,让我们用 Y 替换它。我们现在有 ZYdZYac,其中 Z = aa ,Y = ab。剩下的唯一字节对是 ac,它只有一个,所以我们不对它进行编码。我们可以递归地使用字节对编码将 ZY 编码为 X。我们的数据现在已转换为 XdXac,其中 X = ZY,Y = ab,Z = aa。它不能被进一步压缩,因为没有出现多次的字节对。那如何把压缩的编码复原呢?反向执行以上过程就行了。
1.4 [CLS] [SEP] [UNK] [MASK] 标志含义
- [CLS] 标志放在第一个句子的首位,经过 BERT 得到的的表征向量 C 可以用于后续的分类任务。
- [SEP] 标志用于分开两个输入句子,例如输入句子 A 和 B,要在句子 A,B 后面增加 [SEP] 标志。
- [UNK]标志指的是未知字符
- [MASK] 标志用于遮盖句子中的一些单词,将单词用 [MASK] 遮盖之后,再利用 BERT 输出的 [MASK] 向量预测单词是什么。
2 Transformers
2.1 tokenizer
2.1.1 encode和tokeninze方法的区别
sentence = "Hello, my son is cuting."
input_ids_method1 = torch.tensor(
tokenizer.encode(sentence, add_special_tokens=True)) # Batch size 1
# tensor([ 101, 7592, 1010, 2026, 2365, 2003, 3013, 2075, 1012, 102]) # 此处add_special_tokens设置为False可以不添加 [cls]、[sep]
input_token2 = tokenizer.tokenize(sentence)
# ['hello', ',', 'my', 'son', 'is', 'cut', '##ing', '.']
input_ids_method2 = tokenizer.convert_tokens_to_ids(input_token2)
# tensor([7592, 1010, 2026, 2365, 2003, 3013, 2075, 1012])
# 并没有开头和结尾的标记:[cls]、[sep]
- 从例子中可以看出,encode方法可以一步到位地生成对应模型的输入。
- 相比之下,tokenize只是用于分词,可以分成WordPiece的类型,并且在分词之后还要手动使用convert_tokens_to_ids方法,比较麻烦。
- 通过源码阅读,发现encode方法中调用了tokenize方法,所以在使用的过程中,我们可以通过设置encode方法中的参数,达到转化数据到可训练格式一步到位的目的,下面开始介绍encode的相关参数与具体操作。
2.2 学习率
2.2.1 warmup
warmup是针对学习率learning rate优化的一种策略,主要过程是,在预热期间,学习率从0线性(也可非线性)增加到优化器中的初始预设lr,之后使其学习率从优化器中的初始lr线性降低到0。
- transformers.get_linear_schedule_with_warmup
scheduler = transformers.get_linear_schedule_with_warmup(optimizer, num_warmup_steps=args.lr_warmup * updates_total, num_training_steps=updates_total)
参数说明:
optimizer: 优化器
num_warmup_steps:初始预热步数
num_training_steps:整个训练过程的总步数
PS:当num_warmup_steps
参数设置为0时,learning rate没有预热的上升过程,只有从初始设定的learning rate 逐渐衰减到0的过程。
2 常用工具
2.1 分词
2.1.1 jieba
详见博客:jieba分词使用方法
常见用法:
jieba.cut
方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型jieba.cut_for_search
方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8jieba.cut
以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut
以及 jieba.lcut_for_search 直接返回 listjieba.tokenizer(dictionary=DEFAULT_DICT)
新建自定义分词器,可用于同时使用不同词典。
jieba.dt
为默认分词器,所有全局分词相关函数都是该分词器的映射。
### cut ###
import jieba
seg_list = jieba.cut("杭州的西湖像一颗光彩夺目的明珠。", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("猛兽总是独行,牛羊才成群结队。", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut("知我者谓我心忧,不知我者谓我何求!") # 默认是精确模式
print("New word recognition: " +"/".join(seg_list))
seg_list = jieba.cut_for_search("轻轻的我走了,正如我轻轻的来;我轻轻的招手,作别西天的云彩。") # 搜索引擎模式
print("Search engine mode: " +"/".join(seg_list))
### tokenize ###
from __future__ import unicode_literals #将模块中显式出现的所有字符串转为unicode类型
import jieba
result = jieba.tokenize('永和服装饰品有限公司') #默认模式进行分词,Tokenize: 返回词语在原文的起止位置
print("默认模式为:")
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
3 NLP资源
3.1 公开数据集与榜单
3.1.1 关系抽取 Relation Extraction
Dataset | Intro | Details |
---|---|---|
DocRED | DocRED(文档级关系提取数据集)是从维基百科和维基数据构建的关系提取数据集。数据集中的每个文档都带有人工注释,其中包含命名的实体提及、共指信息、句内和句间关系以及支持证据。DocRED需要阅读文档中的多个句子来提取实体并通过综合文档的所有信息来推断它们之间的关系。除了人工注释的数据外,该数据集还提供了大规模的远程监督数据。 | DocRED包含132,375个实体和56,354个关系事实,并在5,053个维基百科文档中进行了注释。除了人工注释的数据外,该数据集还提供了超过101,873个文档的大规模远程监督数据。 |
TACRED | TACRED是一个大规模的关系提取数据集,这些示例来自年度TAC知识库群体(TAC KBP)挑战中使用的语料库的新闻线和Web文本。 | TACRED包含106,264个示例,涵盖 TAC KBP 挑战中使用的 41 种关系类型(例如,per:schools_attended 和 org:members),如果没有建立定义的关系,则标记为no_relation。 |
ACE 2005 | ACE 2005 多语言培训语料库包含用于 2005 年自动内容提取 (ACE) 技术评估的全套英语、阿拉伯语和中文培训数据。 | |
SemEval-2010 Task 8 | SemEval-2010 任务 8 的数据集是用于对名词之间互斥语义关系的多路分类的数据集。 | |
NYT | 现存NYT数据集的变体,其中包括NYT-H和NYT11-HRL。NYT-H是用于远程监督关系提取的数据集,其中使用DS标记的训练数据,并雇用几个注释器来标记测试数据。 | |
CoNLL04 | 现存CoNLL数据集的变体,包含很多CoNLL数据集 | |
ADE | 支持从医疗病例报告中自动提取与药物有关的不良反应。 | |
WebNLG | WebNLG 语料库由三元组组成,以自然语言文本的形式描述事实(实体和它们之间的关系)和相应的事实。语料库包含最多包含 7 个三元组的集合,以及每个集合的一个或多个参考文本。测试集分为两部分:seen,包含为在训练数据中看到的属于 DBpedia 类别的实体和关系创建的输入;unseen,包含为实体提取的输入和属于 5 个未见过类别的关系。 | |
ChemProt | ChemProt由1,820篇PubMed摘要组成,其中化学 - 蛋白质相互作用由领域专家注释,并用于BioCreative VI文本挖掘化学 - 蛋白质相互作用共享任务。 | |
ACE2004 | ACE 2004多语言培训语料库包含用于 2004 年自动内容提取 (ACE) 技术评估的全套英文、阿拉伯文和中文训练数据。 |