如何从NLTK Reuters语料库提取指定长度随机文档并优化异常代码
原代码无法停止的原因
- 缺失
random库导入语句,运行首先会抛出未定义变量的错误 - 终止逻辑完全错误:你写的
while len(sample_data) == 10: break仅在样本数刚好等于10时执行break,且只能跳出内层while循环,外层for循环还会继续遍历所有句子,不会提前终止 - 效率极低:每次循环都会重新调用
reuters.sents()加载全量语料,冗余开销极大
高效实现方案
方案1:先筛选后抽样(逻辑最简洁,无死循环风险)
先一次性筛选出所有符合长度要求的句子,再直接随机抽取10份,代码如下:
import nltk import random from nltk.corpus import reuters # 筛选所有元素数量超过50的句子 valid_sents = [sent for sent in reuters.sents() if len(sent) > 50] # 随机抽取10个不重复的样本 sample_data = random.sample(valid_sents, 10)
方案2:随机抽取+提前终止(适合超大语料不想全量预筛选的场景)
提前加载一次全量句子列表,循环随机抽取直到凑够10个符合要求的样本就自动停止:
import nltk import random from nltk.corpus import reuters sample_data = [] # 提前加载一次所有句子,避免循环内反复加载 all_sents = list(reuters.sents()) target_count = 10 while len(sample_data) < target_count: picked_sent = random.choice(all_sents) if len(picked_sent) > 50: sample_data.append(picked_sent)
内容的提问来源于stack exchange,提问作者user14994313
相关产品推荐
相关产品推荐

