GloVe词嵌入导入出现异常值报错,应如何处理?
GloVe嵌入加载异常问题解答
异常原因
GloVe 840B版本是在超大的Common Crawl语料上训练的,词表中保留了大量带空格的特殊token,包括连续标点(如...省略号)、邮箱前缀组合(如at name@domain.com)、域名前缀组合(如in mylot.com)等。你当前使用默认split()方法按任意空白分割每行内容,会把本身带空格的完整token拆分成多个独立元素,导致values[0]只拿到了token的一部分,剩下的token片段混入后面的向量数值中,无法转换为float类型,就触发了ValueError。
是否是导入方式有误
是的,你当前的导入逻辑只适配GloVe 6B、42B等不含空格token的小版本数据集,不兼容840B版本的特殊格式。
能否直接忽略这类异常
不建议直接忽略:
- 你现有代码的逻辑存在隐含bug:捕获异常后直接pass,还是会执行
embeddings_dict[word] = vector,这时候的vector是上一次循环成功生成的向量,会导致字典中存入完全错误的映射关系,危害比丢失少量token更大 - 如果你的任务需要处理邮箱、网址、特殊标点这类内容,丢失这些token会直接影响下游效果
处理方案
正确加载所有token的写法(官方推荐适配840B版本)
利用GloVe每行固定为「token + 300维向量」的规则,取每行最后300个元素作为向量,前面的所有元素拼接为完整token:
import numpy as np filename = "glove.840B.300d.txt" embeddings_dict = {} with open(filename, 'r', encoding='utf8') as f: for line in f: values = line.rstrip().split(' ') # 前面所有元素拼接为完整token word = ' '.join(values[:-300]) # 最后300个元素是向量 vector = np.asarray(values[-300:], dtype="float32") embeddings_dict[word] = vector
不需要特殊token的过滤方案
如果你的任务不需要处理邮箱、域名、连续标点这类特殊内容,可以在加载时加过滤逻辑直接跳过:
import numpy as np filename = "glove.840B.300d.txt" embeddings_dict = {} with open(filename, 'r', encoding='utf8') as f: for line in f: values = line.rstrip().split(' ') word = ' '.join(values[:-300]) # 过滤规则可按需调整 if '@' in word or '.com' in word or all(c in '.• ' for c in word): continue vector = np.asarray(values[-300:], dtype="float32") embeddings_dict[word] = vector
内容的提问来源于stack exchange,提问作者genjong
相关产品推荐
相关产品推荐

