使用NLTK word_tokenize处理10-K报告文本时内核崩溃求助
问题:处理10-K报告长文本Tokenize时内核崩溃
我正在处理一个包含56252条观测值的数据集,需要对其中来自10-K报告的长文本执行tokenize操作,但内核总是在处理约四分之一的数据时崩溃。
已尝试的方案
- 脱离Jupyter运行.py文件,收到错误:
zsh: killed - 使用
line[j].split(' ')替代word_tokenize(line[j]) - 重装Python和Jupyter
相关代码
from nltk.tokenize import word_tokenize output = [[20120831,20120808,1199,1928175839, 'words section one report', 'words section onea report', 'words section seven report'],[20150621,20141231,1239,1124966666, 'more words fly kite big', 'different words compared section before', 'even more different words']] item_1 = [] item_1a = [] item_7 = [] count = 0 for line in output: try: item_entry = [] item_tokens_to_add = [] for i in range(0, 4): item_entry.append(line[i]) for j in range(4, 7): line_tokens = word_tokenize(line[j]) item_tokens_to_add.append(line_tokens) item_1.append(item_entry + item_tokens_to_add[0]) item_1a.append(item_entry + item_tokens_to_add[1]) item_7.append(item_entry + item_tokens_to_add[2]) count += 1 except: pass print(str(count) + '/' + str(len(output)))
Jupyter日志信息
error 12:27:24.797: Disposing session as kernel process died ExitCode: undefined, Reason: /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/traitlets/traitlets.py:2202: FutureWarning: Supporting extra quotes around strings is deprecated in traitlets 5.0. You can use 'hmac-sha256' instead of '"hmac-sha256"' if you require traitlets >=5. warn( /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/traitlets/traitlets.py:2157: FutureWarning: Supporting extra quotes around Bytes is deprecated in traitlets 5.0. Use '0a146f2b-abdf-428e-b31f-d08fde1c7026' instead of 'b"0a146f2b-abdf-428e-b31f-d08fde1c7026"'. warn(
我已去除文本中的所有标点,但仍出现上述关于“额外引号”的警告,且内核崩溃的观测值位置不固定,希望得到解决建议。
解决建议
1. 解决内存溢出核心问题
zsh: killed是系统因内存不足强制终止进程,10-K报告文本长度大,tokenize后生成的大量token持续存入item_1、item_1a、item_7列表会快速耗尽内存:
- 不要一次性存储所有结果,改为分批写入文件:每处理1000条数据,就将当前批次的结果写入CSV/JSON文件,然后清空对应列表释放内存
- 使用生成器替代列表存储中间结果,避免一次性加载所有数据到内存
2. 优化Tokenize流程
- 替换
word_tokenize为更轻量的工具:比如使用nltk.RegexpTokenizer自定义简单分词规则,或spaCy的轻量模型en_core_web_sm,减少内存开销 - 对超长文本分段处理:将单条长文本拆分成多个小段,逐段tokenize后再合并结果,避免单次处理占用过多内存
3. 消除Traitlets警告(非崩溃直接原因)
警告来自traitlets版本兼容问题,和内核崩溃无关,可通过以下方式消除:
- 升级traitlets到最新版本:
pip install --upgrade traitlets - 检查Jupyter配置文件,将带转义引号的配置项(如
"hmac-sha256")改为无引号形式(hmac-sha256)
4. 定位崩溃具体原因
- 移除
try-except中的pass,打印具体错误信息,排查是否是某条特殊文本(如极端长度、残留特殊字符)导致的问题 - 添加日志记录:将每一步处理的观测值ID和状态写入日志文件,方便定位崩溃时的具体数据
内容的提问来源于stack exchange,提问作者princesskaguya666
相关产品推荐
相关产品推荐

