预培训BERT和其他变压器的间距管道

spacy-pytorch-transformers的Python项目详细描述


Pythorch变压器的间隔包装

此软件包提供Spacy模型 包裹的管道 拥抱面pytorch变形金刚 包装,这样你就可以在温泉中使用。其结果是可以方便地访问 最先进的变压器架构,如BERT、GPT-2、XLNET等 更多细节和背景,请查看 我们的博客文章

azure pipelinespypigithub代码样式:black在colab中打开演示

功能

  • 直接在您的spacy中使用bertrobertaxlnetgpt-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_lgbert base未加保护英语谷歌研究406MBde_pytt戋u bertbasecase戋lgbert base德语cased德语深度设置406MBen_pytt_xlnetbased_lgxlnet基本大小写英语CMU/谷歌大脑434MBen_pytt_robertabase_lg罗伯塔基地英语脸谱网292兆字节
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

扩展属性

这个包装器设置了 自定义扩展属性docspan标记对象上:

<表><广告>名称键入说明 < /广告><正文>.pytt_对齐列表[list[int]词条和Spacy标记之间的对齐。包含词条标记索引列表(每个Spacy标记一个)或索引列表(如果在标记上调用)。.pytt\u单词片段列表[int]字词标识。.pytt\u单词片段列表[str]字词id的字符串形式。.pytt_last_hidden_状态ndarray从Pythorch Transformers模型输出的最后隐藏状态。.pytt_pooler_输出列表[ndarray]pytorch变压器模型的池输出输出。.pytt\u所有隐藏状态列表[ndarray]所有隐藏状态的输出。来自pytorch变压器模型。.所有注意事项列表[ndarray]Pythorch Transformers型号输出的所有注意事项。.pytt_d_last_hidden_状态ndarray从pytorch变压器模型输出的最后隐藏状态的梯度。.pytt_d_pooler_输出列表[ndarray]从pytorch变压器模型输出的池输出的梯度。.pytt\u所有隐藏状态列表[ndarray]从pytorch变压器模型输出的所有隐藏状态的梯度。.pytt\u所有注意事项列表[ndarray]从pytorch变压器模型输出的所有注意事项的梯度。

可以通过属性访问这些值。例如:

doc=nlp("This is a text.")print(doc._.pytt_word_pieces_)

设置管道

为了运行,使用pytt_语言创建的nlp对象需要一些 按顺序运行的组件:指定句子边界的组件(例如Spacy内置 量刑人 pytt_wordpiecer,它分配wordpiece标记和 pytt_tokenvectorencoder,它分配令牌向量。pytt名称 参数定义要使用的预训练模型的名称。来自预训练的 方法通过pytorch变压器加载预训练模型。

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']

您还可以使用 示例。

从路径加载模型

pytorch transformers模型也可以从文件路径加载,而不只是 一个名字。例如,假设你想使用allen ai的 scibert。首先,下载pytorch 模型文件,解包它们,解包weights.tar,重命名 bert_config.jsonconfig.json并将所有内容放在一个目录中。你的 目录现在应该有一个pytorch_model.binvocab.txtconfig.json。 还要确保路径包含模型的名称。那么你就可以 初始化nlp对象,如下所示:

pip install spacy-pytorch-transformers
0

标记化对齐

变压器模型通常是在用"wordpiece"预处理的文本上训练的。 算法,它限制模型需要的不同令牌类型的数量 考虑一下。wordpiece对于训练神经网络很方便,但是它不 产生与"词"的任何语言概念相匹配的分段。大多数 罕见的单词将映射到多个单词标记,有时还会对齐 将是多对多。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

在内部,transformer模型将对句子进行预测,结果是 张量特征将被重建以产生文档级注释。

为了进一步提高效率减少内存需求, spacy pytorch transformers也在内部执行基于长度的子匹配。 子匹配按序列长度对批处理的句子进行重组,以最小化 所需的填充量。每个批次的配置选项words 控制这种行为。可以将其设置为0以禁用子匹配,或设置 要求最大字数限制(包括 填充)每个子批次。3000字的默认值在 特斯拉v100。

许多预训练的变压器模型都有最大的序列长度。如果A 句子长度超过最大值,将被截断,并且受影响的结尾 令牌将接收零向量。

API

语言的一个子类,包含 Pythorch变压器(Pytt)管道。Pytt管道只能稍微起作用 与Spacy的默认管道不同。具体来说,我们引入了一个新的 管道组件在管道开始处,pytt_tokenvectorencoder。我们 然后将函数修改为 在其他管道组件之前运行pytt_tokenvectorencoder,然后 在其他部件完成后将其反向支撑。

staticmethodpytt_language.安装扩展

注册 自定义扩展属性docspantoken对象上。如果扩展名已经 注册后,Spacy将引发错误。有关 将设置的扩展属性。你不应该调用这个方法 您自己–导入包时它已经运行。

方法

请参见语言。期望 pytt_namemeta中设置,或作为关键字参数,指定 预先训练的模型名称。这用于设置特定于模型的标记器。

方法

更新正在进行中的模型。

<表><广告>名称键入说明 < /广告><正文>文档Iterable一批doc对象或unicode。如果是Unicode,则将从文本创建一个doc对象。金牌Iterable一批goldparse对象或字典。字典将用于创建对象。删除浮动辍学率。sgd可呼叫优化器。损失dict要用丢失更新的字典,由管道组件键入。组件配置 dict特定管道组件的配置参数,由组件名称键入。

指定pytorch transformers字词标记的spacy管道组件 到doc,然后令牌向量编码器可以使用它。注意这个 组件不修改Spacy的标记化。它只设置扩展属性 pytt_word_pieces_pytt_word_piecespytt_alignment(对齐 wordpiece令牌和spacy令牌)。

组件可用作pytt_wordpiecer并通过条目注册 点,所以它可以o使用 nlp.create管道

pip install spacy-pytorch-transformers
2

配置

组件可以使用以下设置进行配置,通常传入 作为**cfg

<表><广告>名称键入说明 < /广告><正文>pytt_nameUnicode编码预训练模型的名称,例如"bert base uncased"

类方法

要添加到语言的工厂。工厂通过入口点。

<表><广告>名称键入说明 < /广告><正文>nlpspacy.language.language使用nlp对象创建组件。**cfg -可选配置参数。返回pytt_wordpiecer拼字器。

方法

初始化组件。

<表><广告>名称键入说明 < /广告><正文>人声spacy.vocab.vocab要使用的Spacy词汇。名称Unicode编码预训练模型的名称,例如"bert base uncased"**cfg -可选配置参数。返回pytt_wordpiecer拼字器。

方法

对一批文档运行wordpiece标记器并返回提取的字符串。

<表><广告>名称键入说明 < /广告><正文>文档Iterable要处理的一批docs。返回元组a(字符串,无)元组。字符串是字符串列表,每个doc

方法

将提取的令牌和id分配给doc对象。

<表><广告>名称键入说明 < /广告><正文>文档Iterable一批doc对象。输出Iterable一批输出。

pytt_tokenvectorencoder

Spacy管道组件采用Pythorch变压器型号。组成部分 将转换器的输出指定给扩展属性。我们还计算 字块标记和Spacy标记化之间的对齐,以便 可以使用最后隐藏的状态设置doc.tensor属性。当多重 wordpiece标记与同一个spacy标记对齐,spacy标记接收 它们的价值。

组件可用作pytt_tok2vec并通过入口点注册, 因此也可以使用 nlp.create管道

pip install spacy-pytorch-transformers
3

配置

组件可以使用以下设置进行配置,通常传入 作为**cfg

<表><广告>名称键入说明 < /广告><正文>pytt_nameUnicode编码预训练模型的名称,例如"bert base uncased"每个批次的单词数 INT/TDT>将句子按每批最大字数分组。例如,一批100个d句和一个10字句的大小为200(由于填充)。设置为0禁用。默认为2000

类方法

要添加到语言的工厂。工厂通过入口点。

<表><广告>名称键入说明 < /广告><正文>nlpspacy.language.language使用nlp对象创建组件。**cfg -可选配置参数。返回pytt_tokenvectorencoder令牌矢量编码器。

类方法pytt_tokenvectorencoder.from_pretrained

使用 Pythorch Transformers型号,即使它不是作为Spacy软件包安装的。

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令牌矢量编码器。

方法

处理adoc并分配提取的功能。

<表><广告>名称键入说明 < /广告><正文>文档spacy.tokens.doc要处理的文档返回spacy.tokens.doc已处理的doc

方法pytt_tokenvectorencoder.pipe

将对象作为流处理并分配提取的特征。

<表><广告>名称键入说明 < /广告><正文>Iterabledoc对象的流。批量大小 INT/TDT>要缓冲的文本数。默认为128收益率spacy.tokens.doc按顺序处理docs。

方法pytt_tokenvectorencoder.predict

在一批文档上运行transformer模型并返回提取的特征。

<表><广告>名称键入说明 < /广告><正文>文档Iterable要处理的一批docs。返回namedtuple包含输出的命名元组。

方法pytt_tokenvectorencoder.set_annotations

将提取的特征分配给doc对象并覆盖向量和 相似挂钩。

<表><广告>名称键入说明 < /广告><正文>文档Iterable一批doc对象。输出Iterable一批输出。

Spacy内置子类 textCategorizer组件 支持使用pytorch transformers模型通过 令牌矢量编码器。它需要在它之前运行pytt_tokenvectorencoder 正在准备中。

组件可用作pytt_textcat并通过入口点注册, 因此也可以使用 nlp.create管道

pip install spacy-pytorch-transformers
5

类方法

要添加到语言的工厂。工厂通过入口点。

<表><广告>名称键入说明 < /广告><正文>nlpspacy.language.language使用nlp对象创建组件。**cfg -可选配置参数。返回Pytt_文本分类程序文本分类程序。

类方法

使用pytorch transformers模型为令牌创建文本分类模型 矢量编码。

<表><广告>名称键入说明 < /广告><正文>nr_类 INT/TDT>课程数量。宽度 INT/TDT>所分配张量的宽度。独占类布尔使类别互斥。默认为false**cfg -可选配置参数。返回thinc.neural.model模型。

数据类激活

数据类保存Pythorch Transformers生产的功能。

<表><广告>属性键入说明 < /广告><正文>上一个隐藏状态对象池输出对象所有隐藏状态对象所有注意事项 对象是梯度布尔

入口点

这个包公开了几个 入口点 Spacy如何初始化其组件。如果Spacy Pythorch Transformers和 Spacy安装在同一环境中,您将能够运行他跟随 它将按预期工作:

pip install spacy-pytorch-transformers
3

这也意味着您的定制模型可以发送一个pytt_tok2vec组件和 在管道中定义"pytt_tok2vec",Spacy将知道如何创建 反序列化模型时的那些组件。以下入口点是 设置:

<表><广告>名称目标键入说明 < /广告><正文>pytt_wordpiecerpytt_wordpiecerSpacy工厂工厂创建组件。pytt_tok2vecpytt_tokenvectorencoderSpacy工厂工厂创建组件。pytt_textcatPytt_文本分类程序Spacy工厂工厂创建组件。pyttpytt_语言spacy_语言自定义语言

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将Map<String,String>传递给需要Map<String,Object>   java在循环中使用字符串而不是StringBuilder是否会造成内存损失?   jnlp如何更新java控制台JRE?   java更改、修改和重新打包CXFAPI源文件   JavaFXJava应用程序在Fedora上运行一段时间后关闭   使用来自不同类的方法的java   java如何通过ant脚本在linux中使用subst?   java在使用camunda modeler进行base64编码/解码时出错   获取java。netbeans、weblogic和fastswap设置为true时的lang.NoSuchMethodError   java如何提高FinalizerThread在GC中收集对象的优先级   java检测具有相同根的单词   netbeans crud应用程序中的java错误