加载GloVe 840B 300d向量遇异常:适配GloVe.6b.*的脚本失效
解决GloVe 840B 300d加载失败的问题
我之前踩过一模一样的坑!用适配GloVe.6B系列的脚本加载840B 300d时出错,核心原因是两个版本的文件格式藏着一个关键差异:
- GloVe.6B里的词汇都是单个单词,没有空格,所以老脚本可以直接按空格拆分后取第一个元素当单词,剩下的全当向量;
- 但GloVe.840B包含大量带空格的短语(比如"machine learning"、"new york"),如果还用老逻辑拆分,会把短语里的空格当成「词和向量」的分隔符,导致拆分结构彻底混乱——比如把"new"当成单词,"york"加后面299个数字凑成向量,向量长度不够自然就报错了。
修复后的加载脚本
针对这个问题,我们可以换个拆分思路:因为300d的向量固定是300个数字,所以每行的最后300个元素一定是向量,前面的所有内容合并起来就是完整的词汇(不管有没有空格)。
用Python实现的示例代码如下:
import numpy as np def load_glove_840b(file_path): embeddings_index = {} # 必须指定utf-8编码,避免特殊字符乱码或读取失败 with open(file_path, encoding='utf-8') as f: for line_num, line in enumerate(f, 1): line = line.strip() if not line: continue parts = line.split() # 过滤元素数量不足的异常行 if len(parts) < 301: print(f"跳过格式异常的行 {line_num}: {line}") continue # 合并前n-300个部分为完整词汇(支持带空格的短语) word = ' '.join(parts[:-300]) try: coefs = np.asarray(parts[-300:], dtype='float32') embeddings_index[word] = coefs except ValueError as e: print(f"行 {line_num} 向量转换失败: {e}") continue print(f"成功加载 {len(embeddings_index)} 个词向量") return embeddings_index
额外注意事项
- 内存需求:GloVe 840B 300d加载后大概会占用5-6GB内存,确保你的机器有足够空间;
- 编码问题:一定要用
encoding='utf-8'打开文件,否则中文或特殊字符乱码会导致拆分失败; - 异常处理:脚本里加了简单的异常过滤,可以跳过少数格式异常的行,避免整个加载流程中断。
内容的提问来源于stack exchange,提问作者Linjie Xu
相关产品推荐
相关产品推荐

