word_tokenize 不做清洗,需手动组合步骤:先下载 punkt 和 stopwords,再正则清理、转小写、分词、去标点、去停用词、词形还原;清洗顺序错误或漏步会导致空字符串或报错。

word_tokenize 是 NLTK 里最常用的分词入口,但它本身不做清洗——直接喂原始文本进去,标点、大小写、数字全保留。想得到干净的词元(tokens),必须自己组合清洗步骤,不能只靠一个函数。
分词前必须先下载 punkt 和 stopwords
没下载就调用 word_tokenize 或 stopwords.words('english'),会直接报错:LookupError: Resource 'tokenizers/punkt' not found。这不是代码写错了,是资源缺失。
- 运行一次
nltk.download('punkt')(分句和分词必需) - 再运行
nltk.download('stopwords')(去停用词必需) - 如果后续要用词形还原,还得加
nltk.download('wordnet') - 别用
nltk.download()弹窗全选——太慢还容易失败;按需下载更稳
word_tokenize 的输出包含标点和大小写,不是“干净词表”
比如输入 "It's raining! Let's go.",word_tokenize 输出的是 ['It', "'s", 'raining', '!', 'Let', "'s", 'go', '.']。这里面 's、!、. 都是独立 token,It 和 Let 还是大写。
- 大小写统一建议放在分词后做:
[t.lower() for t in tokens] - 标点过滤不能只靠
string.punctuation——它不包括'(撇号),而word_tokenize会把It's拆成It和's,所以得用正则re.sub(r'[^\w\']', ' ', text)预处理,或分词后再剔除纯标点 token - 数字要不要留,取决于任务:主题建模通常去掉,金融舆情分析可能要保留
去停用词时注意语言和大小写匹配
NLTK 的英文停用词列表全是小写,比如 stopwords.words('english') 返回 ['i', 'me', 'my', ...]。如果你的 token 没统一转小写,'I' 就不会被过滤掉。
- 务必在去停用词前做
token.lower(),或者用set(stopwords.words('english'))后再查 - 中文停用词需另配(NLTK 自带的
stopwords不含中文),别误用英文列表 - 某些场景下,“not”、“no” 这类否定词不该当停用词删掉——情感分析里它们很关键
清洗顺序错了,结果就不可控
常见错误是先去停用词、再转小写,或先分词、再用正则清空格——这会导致空字符串混入 token 列表,后续 WordNetLemmatizer 处理时报错 ValueError: word is empty。
- 推荐顺序:正则清理(去 HTML/特殊字符/多余空格)→ 转小写 →
word_tokenize→ 去标点 token → 去停用词 → 词形还原(可选) - 每步都该有检查:比如
len(tokens)突然变 0,大概率是正则写崩了,比如re.sub(r'\W+', '', text)把所有非字母全干掉了,连空格都没留,word_tokenize就切不出东西 - 清洗后的 token 列表里出现空字符串
'',说明某步过滤没写好,得加[t for t in tokens if t.strip()]收尾
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











