优化Word2Vec预处理效率:大语料下Jupyter内核崩溃问题排查
问题分析与解决方案
一、先修复代码中的关键错误
你的代码存在几个直接影响预处理流程的问题,可能是触发内核崩溃的诱因:
- 文件匹配路径错误:
glob.glob(f"{base_dir}/.txt")应改为glob.glob(f"{base_dir}/*.txt"),否则无法匹配到任何txt文件; - 语料未加载:
all_docs变量初始化后未填充内容,make_sentences(all_docs)实际传入的是空列表。正确的语料加载逻辑需要遍历文件并读取内容,示例代码如下:
all_docs = [] files = glob.glob(f"{base_dir}/*.txt") for file in files: with open(file, 'r', encoding='utf-8') as f: all_docs.append(f.read())
二、预处理阶段的内存优化(核心解决内核崩溃)
Jupyter内核无报错崩溃,大概率是内存耗尽导致的。一次性加载所有语料并生成完整的句子/Token列表,会让大量数据驻留内存,2k规模语料的内存占用会远超1k语料。优化方案:
- 改用生成器迭代处理:将
make_sentences改为生成器函数,每次仅处理单个文件、生成单条句子,避免一次性存储所有数据。Gensim的Word2Vec原生支持迭代器输入,示例代码:
def make_sentences(file_paths): for file_path in file_paths: with open(file_path, 'r', encoding='utf-8') as f: lower_txt = f.read().lower() sentences = sent_tokenize(lower_txt) for sent in sentences: yield tokenizer.tokenize(sent) # 直接传入文件路径列表,生成器会按需输出句子 sentences = make_sentences(files)
- 调整Jupyter内存限制:如果是本地运行Jupyter,可在启动时增加内存分配(比如Anaconda环境可修改虚拟环境的内存配置参数),缓解内存压力。
三、TreebankTokenizer是否过时?
TreebankTokenizer并未过时,它是NLTK中针对英文文本的经典分词器,遵循Penn Treebank分词规则,完全适配英文小说这类语料场景。如果你的语料是英文,继续使用即可;若为中文则需替换为中文分词器(如jieba)。
四、是否需要更新相关库?
优先排查代码错误和内存问题,再考虑库更新。若上述优化后仍有异常,可尝试更新关键库:
- 更新NLTK:
pip install --upgrade nltk - 更新Gensim:
pip install --upgrade gensim
旧版本库可能存在内存泄漏或大语料处理bug,但更新前建议备份当前环境,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Dez Miller
相关产品推荐
相关产品推荐

