NLP学习笔记03:文本分类——从 TF-IDF 到 BERT

张开发
2026/4/16 1:13:43 15 分钟阅读

分享文章

NLP学习笔记03:文本分类——从 TF-IDF 到 BERT
NLP学习笔记03文本分类——从 TF-IDF 到 BERT作者Ye Shun日期2026-04-15一、前言文本分类Text Classification是自然语言处理NLP中最基础、也最常见的任务之一。它的目标是将一段给定文本自动归类到一个或多个预定义类别中。如果把它类比成现实中的场景就像图书管理员需要根据书的内容把书放到不同书架上在计算机中我们则希望模型能够“读懂”文本并自动判断它属于哪个类别。虽然文本分类听起来简单但它几乎覆盖了 NLP 中最核心的一条主线从文本预处理、特征提取到模型训练、效果评估再到模型优化很多经典方法都可以在这个任务里找到落点。这篇笔记会围绕下面几个问题展开文本分类到底在解决什么问题一个完整的文本分类系统通常包含哪些步骤如何用 Python 实现一个简单可运行的文本分类示例文本分类实践中常见的挑战有哪些二、什么是文本分类文本分类的本质是一个监督学习任务。我们需要准备一批已经标注好类别的文本作为训练数据让模型学习“文本特征”和“类别标签”之间的对应关系。训练完成后模型就可以对新的未标注文本进行预测。比如“这家餐厅太好吃了下次还来” → 正面情感“恭喜您中奖请点击链接领取奖金” → 垃圾信息“苹果发布了最新款芯片” → 科技新闻从这个角度看文本分类做的事情其实就是给文本贴标签。常见应用场景文本分类在实际业务中非常常见例如情感分析判断评论是正面、负面还是中性垃圾邮件过滤区分正常邮件和垃圾邮件新闻分类将新闻归类到体育、财经、科技等栏目意图识别识别用户输入是“咨询”“投诉”还是“购买”医疗辅助分析根据症状描述预测疾病类型法律文书分类自动识别案件类别或文书类型可以说只要“文本最终要被归类”背后大概率就是文本分类问题。三、文本分类的基本流程一个完整的文本分类系统通常包含以下几个环节文本预处理特征提取或文本表示模型选择与训练测试集预测与效果评估误差分析与优化这几个步骤看起来简单但每一步都会直接影响最终效果。1. 文本预处理原始文本通常不能直接拿来训练模型需要先做基础清洗例如小写化去除特殊字符和数字分词去除停用词词干提取或词形还原下面是一个典型的英文预处理示例importrefromnltk.corpusimportstopwordsfromnltk.stemimportPorterStemmerdefpreprocess_text(text):texttext.lower()textre.sub(r[^a-zA-Z\s],,text)wordstext.split()stop_wordsset(stopwords.words(english))words[wordforwordinwordsifwordnotinstop_words]stemmerPorterStemmer()words[stemmer.stem(word)forwordinwords]return .join(words)不过在真正写实验代码时要注意nltk的停用词资源往往需要额外下载。如果只是做一个纯本地、可快速运行的版本也可以先用scikit-learn内置停用词减少环境依赖。2. 特征提取文本不能直接送入传统机器学习模型需要先转成数值特征。常见做法包括方法描述优点缺点词袋模型BoW统计词频简单直观忽略词序和语义TF-IDF加入词重要性权重比 BoW 更实用仍缺少上下文Word2Vec稠密词向量能表示语义相似性无法区分多义词BERT上下文嵌入表示能力强计算成本高在入门阶段最常见也最稳妥的路线通常是TF-IDF 传统分类器这套组合简单、高效、容易解释也很适合作为基线模型。3. 分类模型选择在特征表示确定以后就要选择分类器。常见方法大致分为两类传统机器学习方法朴素贝叶斯支持向量机SVM逻辑回归随机森林深度学习方法CNNRNN / LSTMTransformer / BERT对于刚入门文本分类的人来说建议先把TF-IDF 逻辑回归或TF-IDF SVM跑通。因为它们不仅实现简单而且在很多中小规模任务上效果并不差。四、实践示例新闻分类下面用一个经典思路来演示文本分类任务。原始材料中提到的是20 Newsgroups数据集它确实是很经典的新闻分类数据集。不过由于在线下载数据集有时会受环境影响本文会分两种思路理解标准做法使用20 Newsgroups稳定演示版使用本地构造的小样本数据1. 标准做法20 Newsgroups如果环境允许联网和下载数据可以这样加载数据集fromsklearn.datasetsimportfetch_20newsgroups categories[alt.atheism,soc.religion.christian,comp.graphics,sci.med]newsgroups_trainfetch_20newsgroups(subsettrain,categoriescategories)newsgroups_testfetch_20newsgroups(subsettest,categoriescategories)print(f训练集样本数:{len(newsgroups_train.data)})print(f测试集样本数:{len(newsgroups_test.data)})之后使用 TF-IDF 进行特征提取fromsklearn.feature_extraction.textimportTfidfVectorizer vectorizerTfidfVectorizer(max_features5000)X_trainvectorizer.fit_transform(newsgroups_train.data)X_testvectorizer.transform(newsgroups_test.data)y_trainnewsgroups_train.target y_testnewsgroups_test.target再用逻辑回归进行训练和评估fromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_score,classification_report modelLogisticRegression(max_iter1000)model.fit(X_train,y_train)y_predmodel.predict(X_test)print(f准确率:{accuracy_score(y_test,y_pred):.2f})print(classification_report(y_test,y_pred,target_namesnewsgroups_test.target_names))这是一个非常经典的文本分类入门流程。2. 稳定演示版本地小样本分类如果只是想先验证流程而不依赖外部数据集可以自己构造一个小型语料做实验。比如把文本分成四类计算机图形医学宗教无神论先准备文本和标签再使用TfidfVectorizer进行向量化最后训练逻辑回归模型。这样做虽然数据量小但足以帮助我们理解完整分类流程。相比直接跑大型数据集这种方式有两个明显优点不依赖网络下载更容易观察每一步在做什么五、模型评估如何判断分类器好不好文本分类并不是只看预测结果对不对更重要的是通过评估指标全面理解模型表现。1. 准确率Accuracy准确率是最直观的指标准确率 预测正确的样本数 / 总样本数它适合类别分布相对均衡的情况。2. Precision、Recall 和 F1-score在很多真实任务中仅看准确率是不够的。比如垃圾邮件检测中误把正常邮件当垃圾邮件代价可能很大医疗场景中漏判阳性样本代价也很高。因此通常还要关注Precision精确率预测为某类的样本中有多少是真的Recall召回率真实属于某类的样本中有多少被找出来了F1-score精确率和召回率的综合平衡classification_report就会输出这些指标。3. 混淆矩阵混淆矩阵可以帮助我们分析哪些类别最容易混淆错误主要集中在哪些方向模型是否偏向某些大类很多时候提升模型效果的关键不是盲目换模型而是先看清楚模型“错在哪里”。六、进阶技巧与常见挑战文本分类在真实项目中并不总是像教学示例那样顺利常见挑战很多。1. 类别不平衡如果某些类别样本远多于其他类别模型可能会偏向大类。常见解决方法包括过采样少数类欠采样多数类使用类别权重用 F1-score 代替单纯准确率2. 特征工程优化可以尝试从特征侧提升效果例如调整n-gram范围增减最大特征数使用词性特征引入词向量或上下文表示3. 模型优化常见思路包括网格搜索或随机搜索超参数模型集成从逻辑回归切换到 SVM、朴素贝叶斯或深度学习模型4. 数据增强当标注数据不足时可以尝试同义词替换回译Back Translation规则改写5. 真实业务中的更复杂任务文本分类还会遇到一些更复杂的变体多标签分类一条文本可能属于多个类别领域迁移训练集和测试集来自不同领域小样本学习标注数据很少可解释性要求高需要说明模型为什么这样判所以文本分类看似基础实际上能一路延伸到非常深入的研究与工程问题。七、从传统方法到深度学习如果把文本分类方法做一个大致分层可以理解为1. 传统方法典型组合TF-IDF 朴素贝叶斯TF-IDF SVMTF-IDF 逻辑回归优点是简单稳定易于解释适合小中型数据2. 词向量方法例如Word2Vec 平均池化 分类器FastText优点是比稀疏特征更有语义信息向量维度更低但也存在静态表示的局限。3. 深度学习方法例如CNN 文本分类LSTM 文本分类BERT 微调分类优点是表示能力更强能利用上下文在复杂任务上通常效果更好缺点是计算成本更高训练和调参更复杂因此实际项目中并不是“越新越好”而是要结合数据规模、资源条件和效果要求来选。八、学习建议如果想系统学习文本分类我比较推荐按下面的顺序来先跑通TF-IDF 逻辑回归或TF-IDF SVM理解词袋模型、TF-IDF、N-gram 等基础表示学习词向量和句向量进一步接触 CNN、LSTM 等神经网络分类模型最后再深入 BERT、RoBERTa 等预训练语言模型这样学的好处是能先把“文本分类的本质”看清楚而不是一开始就只会调用高级模型接口。九、总结文本分类是 NLP 中最经典的任务之一也是很多更复杂任务的基础。通过文本分类我们可以把一整套 NLP 流程串起来预处理、特征提取、建模、评估和优化。从方法上看传统方法简单高效是很好的入门路线词向量方法让模型开始具备语义表达能力深度学习和预训练模型进一步提升了上下文理解能力在实践中建议先从稳定、简单、可解释的方案开始再逐步过渡到更复杂的模型。真正重要的不只是把代码跑出来而是理解每一步为什么这样做。

更多文章