Python词频统计遇NameError:name 'word_tokenize' is not defined 求助
解决你的NameError及其他潜在问题
咱们先从你遇到的直接错误说起:
NameError: name 'word_tokenize' is not defined
这个错误的根源很简单——你只导入了分句用的sent_tokenize,但没导入分词需要的word_tokenize。看你的导入语句:
from nltk.tokenize import sent_tokenize
这里只引入了处理句子分割的函数,分词用的word_tokenize完全没被导入,所以Python找不到它。
不过就算你补上导入,后面的代码还有个逻辑错误:你把word_dist(这是nltk.FreqDist的对象,是已经统计好的词频结果)传给了word_tokenize,但这个函数是用来处理文本/字符串的,根本不能直接处理词频对象。你应该用之前已经分好词的words列表来做停用词过滤。
另外,你的代码还有个前置bug:file变量根本没定义!你只做了编码检测,但没实际把CSV文件读取成DataFrame,这会导致前面的file_band = file[file['article'].str.contains("first time")]直接报错。
修正后的完整代码
import unicodecsv as csv import nltk import pandas as pd import chardet from nltk.corpus import stopwords # 新增:导入需要的分词函数word_tokenize from nltk.tokenize import sent_tokenize, word_tokenize # 第一次运行时需要下载nltk的资源包,之后可以注释掉 nltk.download('punkt') nltk.download('stopwords') # 修正:用chardet检测到的编码读取CSV文件 with open('data.csv','rb') as f: result = chardet.detect(f.read()) # 把文件读取成DataFrame,定义file变量 file = pd.read_csv('data.csv', encoding=result['encoding']) # 筛选包含"first time"的文章,加上na=False处理空值避免报错 file_band = file[file['article'].str.contains("first time", na=False)] file.loc[:,'extracted'] = file_band['article'] top_N = 200 # 拼接所有文本并做预处理,加上regex=True确保正则替换生效 a = file_band['extracted'].str.lower().replace(r'\|', ' ', regex=True).str.cat(sep=' ') words = word_tokenize(a) # 这里已经完成分词,得到单词列表 # 统计原始词频 word_dist = nltk.FreqDist(words) print("原始词频统计:") print(word_dist) # 过滤停用词 stop_words = set(stopwords.words('english')) # 直接用已有的单词列表过滤,加上w.isalpha()过滤标点、数字等非单词内容 filtered_words = [w for w in words if w not in stop_words and w.isalpha()] # 重新统计过滤后的词频 filtered_dist = nltk.FreqDist(filtered_words) print("\n过滤停用词后的词频统计:") print(filtered_dist) print("\n过滤后的单词列表:") print(filtered_words)
关键修正点说明
- 补充
word_tokenize的导入,直接解决NameError - 新增CSV文件读取逻辑,定义了缺失的
file变量 - 过滤停用词时使用已分词的
words列表,而非错误传入词频对象word_dist - 加入
na=False处理空值,避免字符串匹配时报错 - 新增
w.isalpha()过滤规则,清理掉标点、数字等无效内容 - 加入nltk资源下载代码,确保第一次运行时能获取分词和停用词库
内容的提问来源于stack exchange,提问作者Cat.J
相关产品推荐
相关产品推荐

