You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:35:22