NLTK自定义分类语料库无法读取文件,调用categories无返回求助
解决自定义分类语料库加载问题并实现朴素贝叶斯分类
一、排查语料库加载失败的问题
你的问题大概率是语料库读取器的初始化参数不正确,导致NLTK无法识别neg和pos分类目录。按照以下步骤修正:
1. 确认语料库目录结构
确保你的语料库结构严格如下(文件夹名称需完全匹配neg和pos):
my_reviews/ neg/ review_001.txt review_002.txt ... pos/ review_001.txt review_002.txt ...
2. 正确初始化CategorizedPlaintextCorpusReader
使用NLTK专门的分类文本读取器,并指定分类目录参数:
import nltk from nltk.corpus.reader import CategorizedPlaintextCorpusReader # 替换为你的语料库根目录路径(Windows用原始字符串r"路径",Linux/macOS直接写) corpus_root = "/home/you/my_reviews" # 初始化读取器:指定分类目录为neg和pos,匹配所有txt文件 mr = CategorizedPlaintextCorpusReader( corpus_root, r".*\.txt", # 正则匹配所有后缀为txt的文件 cat_dirs=["neg", "pos"], # 关键:告诉读取器分类在这两个子目录里 encoding="utf-8" # 如果你的txt文件有中文或特殊编码,可改为gbk等 )
3. 验证加载是否成功
执行以下代码测试:
print("可用分类:", mr.categories()) # 应输出 ['neg', 'pos'] print("分类数量:", len(mr.categories())) # 应输出 2 print("neg类文档数:", len(mr.fileids("neg"))) print("pos类文档数:", len(mr.fileids("pos")))
如果以上输出正常,说明语料库加载成功。
二、基于语料库实现朴素贝叶斯分类
加载成功后,我们可以一步步实现分类模型:
1. 定义特征提取函数
这里使用词袋模型,过滤停用词和非字母字符:
# 先下载NLTK停用词(仅第一次运行需要) nltk.download("stopwords") from nltk.corpus import stopwords def extract_features(word_list): # 过滤停用词、非字母字符,转小写 stop_words = set(stopwords.words("english")) filtered_words = [ word.lower() for word in word_list if word.isalpha() and word.lower() not in stop_words ] # 返回词袋特征:{单词: True} return dict([(word, True) for word in filtered_words])
2. 准备训练与测试数据集
将语料转换为模型可接受的特征集,并划分训练/测试集:
# 生成(文档单词列表, 分类标签)的数据集 documents = [ (list(mr.words(fileid)), category) for category in mr.categories() for fileid in mr.fileids(category) ] # 打乱数据集,避免顺序偏差 import random random.shuffle(documents) # 转换为特征集:(特征字典, 分类标签) feature_sets = [(extract_features(doc), label) for (doc, label) in documents] # 划分训练集(80%)和测试集(20%) train_size = int(len(feature_sets) * 0.8) train_set, test_set = feature_sets[:train_size], feature_sets[train_size:]
3. 训练朴素贝叶斯分类器
from nltk.classify import NaiveBayesClassifier # 训练模型 classifier = NaiveBayesClassifier.train(train_set) # 测试模型准确率 print(f"分类器测试准确率:{nltk.classify.accuracy(classifier, test_set):.2f}") # 查看最具信息量的特征(前10个) classifier.show_most_informative_features(10)
4. 使用分类器预测新文本
def predict_review(text): # 预处理文本:分词、提取特征 words = nltk.word_tokenize(text) features = extract_features(words) # 预测分类 return classifier.classify(features) # 测试示例 test_text = "This movie is fantastic! The acting was brilliant and the plot kept me engaged." print(f"预测结果:{predict_review(test_text)}") # 应输出 pos test_text = "Terrible film, boring story and bad acting. I wasted two hours watching it." print(f"预测结果:{predict_review(test_text)}") # 应输出 neg
常见问题排查
- 如果读取文件时出现编码错误:调整
CategorizedPlaintextCorpusReader的encoding参数(比如encoding="gbk"或encoding="utf-8-sig")。 - 如果准确率过低:可以优化特征提取(比如加入n-gram特征、词频统计),或者扩充语料库规模。
- 如果
mr.categories()仍无返回:检查目录路径是否正确、文件夹名称是否和cat_dirs参数完全一致(大小写敏感)。
内容的提问来源于stack exchange,提问作者Yunter
相关产品推荐
相关产品推荐

