spaCy下使用BERT获取句子嵌入

ow*_*ise 7 python nlp spacy bert-language-model

我正在尝试使用 BERT 来获取句子嵌入。我是这样做的:

import spacy
nlp = spacy.load("en_core_web_trf")
nlp("The quick brown fox jumps over the lazy dog").vector 
Run Code Online (Sandbox Code Playgroud)

这输出一个空向量!

array([], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

dim*_*mid 8

Transformers 与其他 spacy 模型有点不同,但您可以使用\n doc._.trf_data.tensors[1]

\n

各个 BPE(字节对编码)令牌片段的向量位于 中doc._.trf_data.tensors[0]。请注意,我使用术语token-pieces 而不是tokens,以防止 Spacy token 和 BPE tokenizer 生成的 token 之间发生混淆。

\n

例如,在我们的例子中,spacy-tokens 是:

\n
for i, spacy_tok in enumerate(doc):\n  print(f"spacy-token {i + 1}: {spacy_tok.text}")\n
Run Code Online (Sandbox Code Playgroud)\n
spacy-token 1: The\nspacy-token 2: quick\nspacy-token 3: brown\nspacy-token 4: fox\nspacy-token 5: jumps\nspacy-token 6: over\nspacy-token 7: the\nspacy-token 8: lazy\nspacy-token 9: dog\n
Run Code Online (Sandbox Code Playgroud)\n

令牌片段是:

\n
for i, tok_piece in enumerate(doc._.trf_data.tokens['input_texts'][0]):\n  print(f"token-piece {i + 1}: {tok_piece}")\n
Run Code Online (Sandbox Code Playgroud)\n
token-piece 1: <s>\ntoken-piece 2: The\ntoken-piece 3: \xc4\xa0quick\ntoken-piece 4: \xc4\xa0brown\ntoken-piece 5: \xc4\xa0fox\ntoken-piece 6: \xc4\xa0jumps\ntoken-piece 7: \xc4\xa0over\ntoken-piece 8: \xc4\xa0the\ntoken-piece 9: \xc4\xa0lazy\ntoken-piece 10: \xc4\xa0dog\ntoken-piece 11: </s>\n
Run Code Online (Sandbox Code Playgroud)\n