Jupyter中gensim加载word2vec CBOW词向量报EOFError如何解决
Gensim加载CBOW词向量报EOFError的排查修复
运行代码时抛出如下错误:
EOFError: unexpected end of input; is count incorrect or file otherwise damaged?
这个报错本质是load_word2vec_format按标准word2vec文本格式解析文件时,没读到预期长度的内容就到了文件末尾,按下面的顺序排查就行:
- 先确认文件路径和完整性
Jupyter Notebook的相对路径是基于启动时的工作目录,不是笔记本文件的存储位置,先跑下面的代码确认文件真实状态:
如果这步读文件报错、或者文件大小明显不对,直接重新获取完整的向量文件即可,不用往下排查。import os # 正常可用的词向量文件体积至少在MB级,如果输出值只有几KB,说明文件没下载完/拷贝残缺/路径指错了 print(f"文件大小:{os.path.getsize('Downloads/vectors.txt')} 字节") # 打印前3行看内容 with open('Downloads/vectors.txt', 'r', encoding='utf-8') as f: for _ in range(3): print(repr(f.readline())) - 校验文件头格式是否匹配
标准word2vec文本格式的第一行必须是两个空格分隔的整数:第一个是文件内总词数,第二个是词向量的维度,比如50000 300就代表文件里有5万个词,每个词对应300维向量。
如果你导出的向量文件本身没有这行表头(很多自写训练脚本、第三方工具导出的文件会直接存词+向量,不写表头),加载的时候必须加no_header=True参数,不然gensim会把第一行的词和向量值误判为词数和维度,解析到一半就会碰到文件末尾报错。这种情况的加载代码改成:
如果文件是有表头的,就核对下表头写的总词数和实际条目数是否一致:文件总行数减去1(表头行)就是实际存储的词向量数,把表头第一个数改成这个真实值即可,计数差多少都会触发这个EOF报错。cbow_output = gensim.models.KeyedVectors.load_word2vec_format( 'Downloads/vectors.txt', binary=False, no_header=True, encoding='utf-8' ) - 检查文件末尾是否残缺
训练中断、传输不完整会导致文件最后几行缺内容,比如某一行只写了词,后面的向量浮点数没写完,直接翻到文件末尾把残缺的行删掉,同步更新表头的总词数计数就行。 - 排查内容格式问题
确认文件里没有多余的空行,每行的词和向量值都是用空格分隔,不要用制表符、逗号当分隔符,不然gensim解析时字段数对不上,也会抛出同类错误。
修复完加载成功后,再调用cbow_output.most_similar(positive=['virus'])就能正常返回结果了。
内容的提问来源于stack exchange,提问作者David Lewis
相关产品推荐
相关产品推荐

