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

基于Matlab fitcnb的书籍文本分类策略有效性及优化咨询

关于朴素贝叶斯书籍分类策略的可行性与准确率提升分析

首先直接给结论:你的核心分类策略是可行的——用朴素贝叶斯做文本分类、基于词汇特征区分书籍类别的方向没问题,但当前的实现细节和特征设计有明显优化空间,这也是你准确率不佳的主要原因。至于扩大训练集到50或100本,只要训练集质量达标,肯定会显著提升准确率,但前提是先把现有策略的漏洞补上。

下面分点拆解问题和优化建议:

一、当前策略的核心问题

你的特征是“指定词汇在书中出现的行数”,这个设计有两个硬伤:

  • 同一行里可能多次出现同一个关键词(比如烹饪书里某行反复提tomato),但你只计数1次,丢失了关键的频次信息
  • 手动维护一堆regexp判断不仅效率低,还容易漏写或出错,而且没有考虑词汇的区分度(比如有些词在两类书里出现频率差不多,反而会干扰模型)

另外,你选择的Distribution='mvmn'(多元正态分布)不太适配你的计数型特征——正态分布针对连续数值,而你的特征是离散的计数数据,这会影响模型的拟合效果。

二、扩大训练集的作用

30本训练样本确实太少了,尤其是当两类书籍的样本不均衡(比如金融书远多于烹饪书)或者样本覆盖不够(比如只选了西餐烹饪书、只选了股票类金融书)时,模型的泛化能力会很差。

如果能把训练集扩到50甚至100本,同时保证:

  • 两类样本数量尽量均衡(比如4:6以内的比例)
  • 样本覆盖足够的子类别(比如烹饪书包含中餐、西餐、烘焙;金融书包含股票、理财、保险)
  • 标签完全准确

那么模型的准确率会有明显提升——更多的样本能让模型更准确地学习到两类书籍的词汇分布规律。

三、具体优化建议(附改进代码)

1. 优化特征设计

把“出现行数”改成词频(TF)或TF-IDF,后者能自动给区分度高的词汇更高权重。同时用Matlab内置的文本处理工具替代手动regexp计数,更高效规范。

2. 调整朴素贝叶斯的分布参数

针对计数型特征,选择Distribution='mn'(多元朴素贝叶斯)或者'poisson'(泊松分布),比多元正态分布更适配。另外用内置的Smoothing参数做平滑,不用手动加0.001。

改进后的示例代码

% ---------------------- 训练阶段 ----------------------
% 实际场景中可通过dir函数批量读取训练集文本路径,这里用模拟文本示例
trainTexts = [
    "rich investment fund stock profit dividend",  % 金融书文本片段
    "bank loan interest market finance mortgage",
    "tomato pasta recipe cooking oven seasoning",  % 烹饪书文本片段
    "salt sugar baking cake dough ingredient"
];
Y = [1;1;2;2];  % 1=金融类,2=烹饪类

% 文本预处理+生成词袋特征
docs = tokenizedDocument(trainTexts);
% 移除停用词(如the/and这类无区分度的词)
docs = removeStopWords(docs);
bag = bagOfWords(docs);
% 过滤低频词,减少噪声干扰
bag = removeInfrequentWords(bag, 2);
% 转换为TF-IDF特征(比单纯词频的区分度更高)
X = tfidf(bag);

% 训练适配计数特征的朴素贝叶斯模型
Mdl = fitcnb(X, Y, 'Distribution', 'mn', 'Smoothing', 0.001);

% ---------------------- 预测阶段 ----------------------
% 读取待预测文本文件
fid = fopen('D:\ksiazki\ksiazki kucharskie\txt\1.txt','rt');
if fid < 0 
    error('Error loading file'); 
end
predText = fread(fid, '*char')';
fclose(fid);

% 转换为与训练集一致的特征格式
predDoc = tokenizedDocument(predText);
predDoc = removeStopWords(predDoc);
predBag = bagOfWords(predDoc, 'Vocabulary', bag.Vocabulary);
predX = tfidf(predBag);

% 执行预测
label = predict(Mdl, predX);
disp(['预测书籍类别:', num2str(label)]);

3. 额外小技巧

  • 做特征筛选:用mutualInfo函数计算每个词汇和类别的互信息,只保留互信息高的词汇,减少冗余特征
  • 交叉验证:用crossval做5折交叉验证,能更准确地评估模型的真实泛化能力,而不是只看训练集准确率
  • 文本标准化:统一转小写、移除标点符号,减少特征的无效差异

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:35:53