预培训BERT和其他变压器的间距管道
spacy-pytorch-transformers的Python项目详细描述
Pythorch变压器的间隔包装
此软件包提供Spacy模型
包裹的管道
拥抱面pytorch变形金刚
包装,这样你就可以在温泉中使用。其结果是可以方便地访问
最先进的变压器架构,如BERT、GPT-2、XLNET等
更多细节和背景,请查看
我们的博客文章
功能
- 直接在您的spacy中使用bert,roberta,xlnet和gpt-2。 管道。
- 使用Spacy的API对任务进行微调预训练的变压器模型。
- 使用Transformer功能进行文本分类的自定义组件。
- 自动对齐并输出到语言标记。
- 每句话智能处理多句文档 预测
- 内置挂钩,用于上下文相关向量和相似性。
- 开箱即用系列化和模型包装。
快速启动
从pip安装包将自动安装所有依赖项, 包括火把和斯帕西。确保在安装此软件包之前 安装模型。还要注意,这个包需要Python3.6+和 最新版本的Spacy, v2.1.7或更高版本。
pip install spacy-pytorch-transformers
对于GPU安装,使用nvcc查找CUDA版本--版本
并添加
括号中的版本,例如
用于CUDA9.2或
SPAcy Pythorch变压器[CUDA100]
用于CUDA10.0。
我们还预先打包了一些经过预处理的模型作为spacy模型包。
您可以使用spacy download
命令或从
模型版本
en_pytt_bertbaseuncased_lg
bert base未加保护
de_pytt戋u bertbasecase戋lg
bert base德语cased
en_pytt_xlnetbased_lg
xlnet基本大小写
en_pytt_robertabase_lg
罗伯塔基地
python -m spacy download en_pytt_bertbaseuncased_lg python -m spacy download de_pytt_bertbasecased_lg python -m spacy download en_pytt_xlnetbasecased_lg python -m spacy download en_pytt_robertabase_lg
一旦安装了模型,就可以像其他模型一样以spacy方式加载它。 包装:
importspacynlp=spacy.load("en_pytt_bertbaseuncased_lg")doc=nlp("Apple shares rose on the news. Apple pie is delicious.")print(doc[0].similarity(doc[7]))print(doc._.pytt_last_hidden_state.shape)< Buff行情>
如果您看到类似没有名为'spacy.lang.pytt'的模块的错误
,
再次检查是否安装了Spacy Pythorch Transformers
。它必须是
它可以注册它的语言入口点。还要确保
您正在运行Spacy v2.1.7或更高版本。
用法
转移学习
预训练变压器模型的主要用例是转移学习。你 在一个大的通用模型中加载预先训练过的大量文本,然后开始训练 具有特定于问题的标签的较小数据集。这个包裹有 自定义管道组件,使这特别容易。我们提供了一个例子 用于文本分类的组件。其它类似元件的研制 任务应该非常直接。
pytt_textcat
组件基于Spacy的内置
textCategorizer
并支持使用
Pythorch Transformers型号通过Pytt_Tok2vec分配的功能
组件。这允许您使用像bert这样的模型来预测上下文标记
表示,然后将文本分类程序作为特定于任务的
"头"。该api与任何其他spacy管道相同:
TRAIN_DATA=[("text1",{"cats":{"POSITIVE":1.0,"NEGATIVE":0.0}})]
importspacyfromspacy.utilimportminibatchimportrandomimporttorchis_using_gpu=spacy.prefer_gpu()ifis_using_gpu:torch.set_default_tensor_type("torch.cuda.FloatTensor")nlp=spacy.load("en_pytt_bertbaseuncased_lg")print(nlp.pipe_names)# ["sentencizer", "pytt_wordpiecer", "pytt_tok2vec"]textcat=nlp.create_pipe("pytt_textcat",config={"exclusive_classes":True})forlabelin("POSITIVE","NEGATIVE"):textcat.add_label(label)nlp.add_pipe(textcat)optimizer=nlp.resume_training()foriinrange(10):random.shuffle(TRAIN_DATA)losses={}forbatchinminibatch(TRAIN_DATA,size=8):texts,cats=zip(*batch)nlp.update(texts,cats,sgd=optimizer,losses=losses)print(i,losses)nlp.to_disk("/bert-textcat")
有关完整示例,请参见
示例/train_textcat.py
脚本
向量和相似性
模型的pytt_tokenvectorencoder
组件设置自定义挂钩
重写.vector
属性和.similarit的默认行为Y < /代码>
对象的方法。默认情况下,这些通常指
指向位于
nlp.vocab.vectors
的word vectors表。当然,在变压器里
模型我们宁愿使用doc.tensor
属性,因为它包含更多
信息上下文敏感表示。
apple1=nlp("Apple shares rose on the news.")apple2=nlp("Apple sold fewer iPhones this quarter.")apple3=nlp("Apple pie is delicious.")print(apple1[0].similarity(apple2[0]))print(apple1[0].similarity(apple3[0]))
序列化
预应变变压器模型的保存、加载及包装
模型只起作用(至少,它应该起作用)。包装器和组件如下
Spacy的API,所以当您保存并加载nlp
对象时,它…
- 将预训练的权重写入磁盘/字节并将其重新加载。
- 在meta.json中添加"lang_factory":"pytt",这样spacy就知道如何
加载模型时初始化
语言
类。
- 将此包及其版本添加到
meta.json
,因此当您运行spacy包
创建可安装的 python包它自动添加到安装程序的install_requires
例如,如果您已经训练了自己的文本分类器,则可以将其打包为 这:
python -m spacy package /bert-textcat /output
cd /output/en_pytt_bertbaseuncased_lg-1.0.0
python setup.py sdist
pip install dist/en_pytt_bertbaseuncased_lg-1.0.0.tar.gz
扩展属性
这个包装器设置了
自定义扩展属性
在doc
、span
和标记对象上:
.pytt_对齐
列表[list[int]
标记上调用)。
.pytt\u单词片段
列表[int]
.pytt\u单词片段
列表[str]
.pytt_last_hidden_状态
ndarray
.pytt_pooler_输出
列表[ndarray]
池输出
输出。.pytt\u所有隐藏状态
列表[ndarray]
.所有注意事项
列表[ndarray]
.pytt_d_last_hidden_状态
ndarray
.pytt_d_pooler_输出
列表[ndarray]
.pytt\u所有隐藏状态
列表[ndarray]
.pytt\u所有注意事项
列表[ndarray]
可以通过属性访问这些值。例如:
doc=nlp("This is a text.")print(doc._.pytt_word_pieces_)
设置管道
为了运行,使用 您还可以使用
示例。 pytorch transformers模型也可以从文件路径加载,而不只是
一个名字。例如,假设你想使用allen ai的
变压器模型通常是在用"wordpiece"预处理的文本上训练的。
算法,它限制模型需要的不同令牌类型的数量
考虑一下。wordpiece对于训练神经网络很方便,但是它不
产生与"词"的任何语言概念相匹配的分段。大多数
罕见的单词将映射到多个单词标记,有时还会对齐
将是多对多。 如果您可以处理与实际单词不对齐的表示,则
最好使用变压器的原始输出,可以在
如果您正在处理标记级别的任务,例如词性标记或
拼写更正,您将需要处理标记对齐的功能,其中
存储在 我们已经注意计算了对齐的 相对于
序列长度。这意味着较长的文本需要分成句子
为了达到合理的效率。 在内部,transformer模型将对句子进行预测,结果是
张量特征将被重建以产生文档级注释。 为了进一步提高效率减少内存需求,
许多预训练的变压器模型都有最大的序列长度。如果A
句子长度超过最大值,将被截断,并且受影响的结尾
令牌将接收零向量。 注册
自定义扩展属性
在 请参见 更新正在进行中的模型。 指定pytorch transformers字词标记的spacy管道组件
到doc,然后令牌向量编码器可以使用它。注意这个
组件不修改Spacy的标记化。它只设置扩展属性
组件可用作 组件可以使用以下设置进行配置,通常传入
作为 要添加到 初始化组件。 对一批文档运行wordpiece标记器并返回提取的字符串。 将提取的令牌和id分配给 Spacy管道组件采用Pythorch变压器型号。组成部分
将转换器的输出指定给扩展属性。我们还计算
字块标记和Spacy标记化之间的对齐,以便
可以使用最后隐藏的状态设置 组件可用作 组件可以使用以下设置进行配置,通常传入
作为 要添加到 使用
Pythorch Transformers型号,即使它不是作为Spacy软件包安装的。 创建 初始化组件。 处理a 将对象作为流处理并分配提取的特征。 在一批文档上运行transformer模型并返回提取的特征。 将提取的特征分配给doc对象并覆盖向量和
相似挂钩。 Spacy内置子类
组件可用作 要添加到 使用pytorch transformers模型为令牌创建文本分类模型
矢量编码。 数据类保存Pythorch Transformers生产的功能。 这个包公开了几个
入口点
Spacy如何初始化其组件。如果 这也意味着您的定制模型可以发送一个pytt_语言创建的
nlp
对象需要一些
按顺序运行的组件:指定句子边界的组件(例如Spacy内置
量刑人
pytt_wordpiecer
,它分配wordpiece标记和
pytt_tokenvectorencoder
,它分配令牌向量。pytt名称
参数定义要使用的预训练模型的名称。来自预训练的
方法通过
pytorch变压器加载预训练模型。
,Spacy将知道如何创建
反序列化模型时的那些组件。以下入口点是
设置:fromspacy_pytorch_transformersimportPyTT_Language,PyTT_WordPiecer,PyTT_TokenVectorEncodername="bert-base-uncased"nlp=PyTT_Language(pytt_name=name,meta={"lang":"en"})nlp.add_pipe(nlp.create_pipe("sentencizer"))nlp.add_pipe(PyTT_WordPiecer.from_pretrained(nlp.vocab,name))nlp.add_pipe(PyTT_TokenVectorEncoder.from_pretrained(nlp.vocab,name))print(nlp.pipe_names)# ['sentencizer', 'pytt_wordpiecer', 'pytt_tok2vec']
从路径加载模型
scibert
。首先,下载pytorch
模型文件,解包它们,解包weights.tar,重命名
bert_config.json
到config.json
并将所有内容放在一个目录中。你的
目录现在应该有一个pytorch_model.bin
,vocab.txt
和config.json
。
还要确保路径包含模型的名称。那么你就可以
初始化nlp
对象,如下所示:pip install spacy-pytorch-transformers
0
标记化对齐
Spacy Pythorch Transformers
计算此对齐,
您可以在doc.pytt_alignment
访问。这是一个长度等于
Spacy令牌的数目。列表中的每个值都是连续的
整数,它们是单词表中的索引。doc.pytt_last_hidden_状态
。这个变量给你一个只有一行的张量
每个字词标记。doc.tensor
变量中。doc.tensor
表示为
尽可能忠实,优先避免信息丢失。这个
校准的计算方法如下
doc.tensor.sum(axis=1)==doc.pytt_last_hidden_state.sum(axis=1)
。使
这项工作,每个doc.tensor
行(对应于一个spacy令牌)是
设置为最后一个隐藏状态的行的加权和
标记对齐,其中权重与其他标记的数量成比例
与该行对齐的Spacy标记。包括来自
重要——参见克拉克等人,2019)边界标记,我们认为这些是
也与句子中的所有标记"对齐"。
批处理、填充和逐句处理
Spacy Pythorch Transformers
在内部处理此问题,并要求
句子边界检测组件已添加到管道中。我们
建议:pip install spacy-pytorch-transformers
1
spacy pytorch transformers
也在内部执行基于长度的子匹配。
子匹配按序列长度对批处理的句子进行重组,以最小化
所需的填充量。每个批次的配置选项words
控制这种行为。可以将其设置为0以禁用子匹配,或设置
要求最大字数限制(包括
填充)每个子批次。3000字的默认值在
特斯拉v100。
API
类
staticmethod
pytt_language.安装扩展
doc
、span
和token
对象上。如果扩展名已经
注册后,Spacy将引发错误。有关
将设置的扩展属性。你不应该调用这个方法
您自己–导入包时它已经运行。方法
语言。期望
pytt_name
在meta
中设置,或作为关键字参数,指定
预先训练的模型名称。这用于设置特定于模型的标记器。方法
< /广告><正文>名称 键入 说明
文档
Iterable 一批 doc
对象或unicode。如果是Unicode,则将从文本创建一个doc
对象。金牌
Iterable 一批goldparse对象或字典。字典将用于创建对象。 删除
浮动 辍学率。 sgd
可呼叫 优化器。 损失
dict 要用丢失更新的字典,由管道组件键入。 组件配置
dict 特定管道组件的配置参数,由组件名称键入。 类
pytt_word_pieces_
,pytt_word_pieces
和pytt_alignment
(对齐
wordpiece令牌和spacy令牌)。pytt_wordpiecer
并通过条目注册
点,所以它可以o使用
nlp.create管道
:pip install spacy-pytorch-transformers
2
配置
**cfg
< /广告><正文>名称 键入 说明
pytt_name
Unicode编码 预训练模型的名称,例如 "bert base uncased"
类方法
语言的工厂。工厂
通过入口点。 < /广告><正文>名称 键入 说明
nlp
spacy.language.language
使用 nlp
对象创建组件。**cfg
- 可选配置参数。 返回 pytt_wordpiecer
拼字器。 方法
< /广告><正文>名称 键入 说明
人声
spacy.vocab.vocab
要使用的Spacy词汇。 名称
Unicode编码 预训练模型的名称,例如 "bert base uncased"
**cfg
- 可选配置参数。 返回 pytt_wordpiecer
拼字器。 方法
< /广告><正文>名称 键入 说明
文档
Iterable 要处理的一批 doc
s。返回 元组 a (字符串,无)
元组。字符串是字符串列表,每个doc
方法
doc
对象。 < /广告><正文>名称 键入 说明
文档
Iterable 一批 doc
对象。输出
Iterable 一批输出。 类
pytt_tokenvectorencoder
doc.tensor
属性。当多重
wordpiece标记与同一个spacy标记对齐,spacy标记接收
它们的价值。pytt_tok2vec
并通过入口点注册,
因此也可以使用
nlp.create管道
:pip install spacy-pytorch-transformers
3
配置
**cfg
< /广告><正文>名称 键入 说明
pytt_name
Unicode编码 预训练模型的名称,例如 "bert base uncased"
INT/TDT>每个批次的单词数
将句子按每批最大字数分组。例如,一批100个d句和一个10字句的大小为200(由于填充)。设置为 0
禁用。默认为2000
类方法
语言的工厂。工厂
通过入口点。 < /广告><正文>名称 键入 说明
nlp
spacy.language.language
使用 nlp
对象创建组件。**cfg
- 可选配置参数。 返回 pytt_tokenvectorencoder
令牌矢量编码器。 类方法
pytt_tokenvectorencoder.from_pretrained
pip install spacy-pytorch-transformers
4
<表><广告> < /广告><正文>名称 键入 说明
人声
spacy.vocab.vocab
要使用的Spacy词汇。 名称
Unicode编码 预训练模型的名称,例如 "bert base uncased"
**cfg
- 可选配置参数。 返回 pytt_tokenvectorencoder
令牌矢量编码器。 类方法
pytt_tokenvectorencoder.model
pytt_wrapper
的实例,该实例保存pytorch transformers
模型: < /广告><正文>名称 键入 说明
名称
Unicode编码 预训练模型的名称,例如 "bert base uncased"
**cfg
- 可选配置参数。 返回 thinc.neural.model
包装好的模型。 方法
< /广告><正文>名称 键入 说明
人声
spacy.vocab.vocab
要使用的Spacy词汇。 型号
thinc.neural.model
/true
组件的模型,如果尚未初始化,则为 true
。**cfg
- 可选配置参数。 返回 pytt_tokenvectorencoder
令牌矢量编码器。 方法
doc
并分配提取的功能。 < /广告><正文>名称 键入 说明
文档
spacy.tokens.doc
要处理的 文档
。返回 spacy.tokens.doc
已处理的 doc
方法
pytt_tokenvectorencoder.pipe
< /广告><正文>名称 键入 说明
流
Iterable doc
对象的流。 INT/TDT>批量大小
要缓冲的文本数。默认为 128
收益率 spacy.tokens.doc
doc
s。方法
pytt_tokenvectorencoder.predict
< /广告><正文>名称 键入 说明
文档
Iterable 要处理的一批 doc
s。返回 namedtuple
包含输出的命名元组。 方法
pytt_tokenvectorencoder.set_annotations
< /广告><正文>名称 键入 说明
文档
Iterable 一批 doc
对象。输出
Iterable 一批输出。 类
textCategorizer
组件
支持使用pytorch transformers模型通过
令牌矢量编码器。它需要在它之前运行pytt_tokenvectorencoder
正在准备中。
pytt_textcat
并通过入口点注册,
因此也可以使用
nlp.create管道
:pip install spacy-pytorch-transformers
5
类方法
语言的工厂。工厂
通过入口点。 < /广告><正文>名称 键入 说明
nlp
spacy.language.language
使用 nlp
对象创建组件。**cfg
- 可选配置参数。 返回 Pytt_文本分类程序
文本分类程序。 类方法
< /广告><正文>名称 键入 说明
INT/TDT>nr_类
课程数量。 INT/TDT>宽度
所分配张量的宽度。 独占类
布尔 使类别互斥。默认为 false
**cfg
- 可选配置参数。 返回 thinc.neural.model
模型。 数据类
激活
< /广告><正文>属性 键入 说明
上一个隐藏状态
对象 池输出
对象 所有隐藏状态
对象 所有注意事项
对象 是梯度
布尔 入口点
Spacy Pythorch Transformers
和
Spacy安装在同一环境中,您将能够运行他跟随
它将按预期工作:pip install spacy-pytorch-transformers
3
pytt_tok2vec
组件和
在管道中定义"pytt_tok2vec"
pytt_wordpiecer
pytt_wordpiecer
Spacy工厂
pytt_tok2vec
pytt_tokenvectorencoder
Spacy工厂
pytt_textcat
Pytt_文本分类程序
Spacy工厂
pytt
pytt_语言
spacy_语言