已安装BERT,如何获取Non-contextual Word Embeddings(非上下文词嵌入)?
获取BERT的非上下文词嵌入
BERT本质是上下文依赖的语言模型,但要获取非上下文词嵌入,直接调用它的词嵌入层(Word Embedding Layer)即可——这一层的输出是未经过Transformer编码器处理的原始token嵌入,完全脱离上下文影响。
实现步骤(基于Hugging Face Transformers库)
- 加载预训练BERT模型与分词器
- 对目标词进行分词转换
- 提取词嵌入层的输出或权重矩阵中对应token的向量
代码示例
from transformers import BertTokenizer, BertModel import torch # 加载预训练模型(以bert-base-uncased为例,可替换为其他BERT变体) tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') # 目标词 target_word = "Apple" # 分词并转为模型可接受的张量格式 inputs = tokenizer(target_word, return_tensors="pt") token_ids = inputs['input_ids'] # 方法1:直接从词嵌入层权重中提取向量 word_embedding_layer = model.embeddings.word_embeddings non_contextual_emb = word_embedding_layer(token_ids).squeeze().detach().numpy() # 方法2:通过模型前向传播,取最底层的隐藏状态(即词嵌入层输出) with torch.no_grad(): outputs = model(**inputs, output_hidden_states=True) # hidden_states[0]对应未经过编码器处理的原始词嵌入 non_contextual_emb = outputs.hidden_states[0].squeeze().detach().numpy() print(f"#embedding of '{target_word}':") print(non_contextual_emb)
注意事项
- 若目标词被分词器拆分为多个subtoken(如罕见词或复合词),可选择取首个subtoken的嵌入,或对所有subtoken的嵌入做平均/求和来代表整个词的非上下文嵌入
- 不同BERT模型的嵌入维度不同:base系列为768维,large系列为1024维
- 使用
detach().numpy()可将PyTorch张量转换为numpy数组,便于后续计算或存储
内容的提问来源于stack exchange,提问作者edamame
相关产品推荐
相关产品推荐

