使用w2v_512.model遇Key缺失问题,求解决方案及BERT embedding用法
解决Word2Vec未登录词问题及BERT Embedding使用方案
一、处理Word2Vec的"Key 'xxx' is not present"报错
针对预训练Word2Vec模型未覆盖的未登录词,有几种实用解决思路:
- 过滤未登录词:如果该词对任务影响极小,直接从输入中剔除,避免触发报错。
- 随机初始化向量:为未登录词生成一个与模型维度匹配(比如你的512维)的随机向量,后续可结合任务需求微调。
- 子词向量拼接:把未登录词拆分为字符或常见子词,取这些子词的Word2Vec向量均值作为该词的向量(例如将"xxx"拆为单字,若单字在模型中有对应向量则计算均值)。
- 增量训练模型:收集包含目标词的语料,在原w2v_512.model基础上继续训练,让模型学习该词的语义向量。
二、BERT Embedding是否可行?
完全可行。BERT采用子词分词机制,遇到未登录词时会将其拆分为已学习过的子词片段,不会出现"Key不存在"的报错,能更好适配生僻词、专业术语等场景。
三、用BERT获取Embedding的实操步骤
以下是基于Hugging Face Transformers库的示例代码(以中文BERT为例):
1. 安装依赖
pip install transformers torch
2. 加载预训练模型与分词器
from transformers import BertTokenizer, BertModel import torch # 加载中文预训练BERT模型 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') model.eval() # 切换至评估模式
3. 获取词/句子级Embedding
# 输入目标文本 text = "示例文本包含你的目标词xxx" # 分词并添加BERT要求的特殊标记([CLS]、[SEP]) inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) # 关闭梯度计算,节省资源 with torch.no_grad(): outputs = model(**inputs) # 获取词级Embedding,维度为[batch_size, seq_len, hidden_size] word_embeddings = outputs.last_hidden_state # 获取句子级Embedding,取[CLS]标记对应的向量 sentence_embedding = outputs.last_hidden_state[:, 0, :] # 提取特定词的Embedding(若目标词被拆分为子词,需调整索引) tokens = tokenizer.tokenize(text) target_token_idx = tokens.index("xxx") target_embedding = word_embeddings[0, target_token_idx + 1, :] # +1是因为第一个token为[CLS]
补充说明
- 若使用英文BERT,只需将
bert-base-chinese替换为bert-base-uncased。 - BERT默认输出768维向量,若需要匹配原Word2Vec的512维,可通过线性层转换:
torch.nn.Linear(768, 512)(word_embeddings)。
内容的提问来源于stack exchange,提问作者talent
相关产品推荐
相关产品推荐

