如何在 SpaCy 中使用预训练的 transformer 模型("en_trf_bertbaseuncased_lg")?

How to use the pretrained transformer model ("en_trf_bertbaseuncased_lg") in SpaCy?

我想知道如何使用 spacy 的预训练转换器模型 en_trf_bertbaseuncased_lg 来处理未来的 NLP 任务(NER、POS 等)。文档指出,该模块只能用于以下管道预处理模块 (https://spacy.io/models/en#en_trf_bertbaseuncased_lg):

任何人都可以向我解释一下,这些组件在做什么以及它们可以用于哪些任务?或者有人知道阅读它的好资源吗?

>>> import spacy
>>> nlp = spacy.load("en_trf_bertbaseuncased_lg")
>>> nlp.pipe_names
[sentencizer, trf_wordpiecer, trf_tok2vec]

SpaCy 的 Language Processing Pipelines 应该会引导您找到您正在寻找的信息。

Sentencizer: 一个简单的管道组件,允许不需要依赖解析的自定义句子边界检测逻辑。默认情况下,句子分割由 DependencyParser 执行,因此 Sentencizer 让您可以实施更简单的基于规则的策略,不需要加载统计模型。该组件也可以通过字符串名称 "sentencizer" 获得。初始化后,通常使用 nlp.add_pipe.

添加到处理管道中

官方文档解释说,您可以使用 BERT spacy 模型 en_trf_bertbaseuncased_lg 模型来获取句子标记的词嵌入。

https://spacy.io/universe/project/spacy-transformers

安装 spacy BERT 模型和 spacy-transformers 模块:

pip install spacy-transformers
python -m spacy download en_trf_bertbaseuncased_lg

下面是官方文档中的一个稍微改编的例子:

import spacy
nlp = spacy.load("en_trf_bertbaseuncased_lg")
doc = nlp("Apple shares rose on the news. Apple pie is delicious.")

# doc[0] accesses the emmbedding of the first token = 'Apple'
print(doc[0])  # Apple

# doc[7] accesses the emmbedding of the 8th token = 'Apple'
print(doc[7])  # Apple

# they are not the same, because the embedding are context sentitive (check with cosine similarity)    
print(doc[0].similarity(doc[7])) # 0.43365735

# get the shape of the last hidden layer
print(doc._.trf_last_hidden_state.shape)  # (16, 768)

# get the word embeddings for all tokens
print(doc._.trf_last_hidden_state)

[[ 0.34356186 -0.23586863 -0.06684081 ... -0.17081839 0.60623395 0.15930347] [ 0.65008235 0.01991967 -0.11502014 ... -0.5832436 -0.02782568 -0.4122076 ] [ 1.499611 0.02532474 0.23262465 ... -0.3212682 0.27605072 0.18531999] ... [ 0.24741858 0.00736329 -0.28011537 ... -0.1693347 -0.20065884 -0.6950048 ] [ 0.2859776 0.00303659 -0.37783793 ... 0.37828052 0.041728 -0.5648101 ] [ 0.7320844 0.11067941 -0.04100507 ... 0.25042596 -0.21909392 -0.31274694]]

词嵌入可用于更下游的 NLP/machine 学习任务。

trf_wordpiecer分量

  • 可通过 doc._.trf_alignment
  • 访问
  • 执行模型的词块pre-processing

引自docs

Wordpiece is convenient for training neural networks, but it doesn't produce segmentations that match up to any linguistic notion of a "word". Most rare words will map to multiple wordpiece tokens, and occasionally the alignment will be many-to-many.

trf_tok2vec分量

  • 可通过 doc._.trf_last_hidden_state
  • 访问
  • 存储转换器的原始输出:一个张量,每个词块标记一行
  • 但是,您可能想要的是 doc.tensor 中的 token-aligned 功能。

另请参阅此 blog article 介绍 spacy 的转换器集成。