【NLP项目-01】手把手教你基于TF-IDF提取向量+贝叶斯或者随机森林进行文本分类
本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 相关内容文档获取 微信公众号
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
🌵文章目录🌵
- 🎯 1. 基本介绍
- 1.1 TF-IDF介绍
- 💡 2. 使用方法
- 2.1 英文数据准备
- 2.2 项目数据介绍
- 2.3 项目数据处理
- 2.4 文本向量化
- 2.5 文本分类
- 🔍 3. 高级用法
- 🔍 4. 注意事项
- 🔧 5. 总结
下滑查看解决方法
🎯 1. 基本介绍
文本分类是自然语言处理(NLP)中的一项基础任务,其目标是将文本数据自动归类到预定义的类别中。TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本向量化方法,它能够衡量一个词语对于一个文档集或一个语料库中的其中一份文档的重要性。
1.1 TF-IDF介绍
- 作用:用来计算一个词在文档中的权重大小,通常用来计算词权重方法之一
- TF:一个词在文档中的频次
- IDF:逆文档频率,一个关键词w在dw个文档中出现的次数
- TF-IDF的计算公式如下所示:
T F i , j = n i , j ∑ k n k , j TF_{i,j}=\frac{n_{i,j}}{\sum_k n_{k,j}} TFi,j=∑knk,jni,j , I D F i = l o g ∣ D ∣ ∣ 1 + j : t i ∈ d j ∣ IDF_i=log\frac{|D|}{|{1+j:t_i\in d_j}|} IDFi=log∣1+j:ti∈dj∣∣D∣
T F − I D F i , j = t f i , j ∗ i d f i TF-IDF_{i,j}=tf_{i,j}*idf_i TF−IDFi,j=tfi,j∗idfi
💡 2. 使用方法
2.1 英文数据准备
使用tf-idf进行文本向量化时,我们需要注意中文和英文的处理方法不一致的问题,对于中文的文本数据需要对其进行切词,对于英文只需要对其进行判断即可。
对于英文数据的处理的代码示例如下所示:
from sklearn.feature_extraction.text import TfidfVectorizer
# 假设我们有以下文本数据
texts = [
"The sky is blue.",
"The sun is bright.",
"The sun in the sky is bright.",
"We can see the shining sun, the bright sun."
]
# 初始化TF-IDF向量化器
vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = vectorizer.fit_transform(texts)
# 查看向量化结果
print(tfidf_matrix.toarray())
[[0.78528828 0. 0. 0.6191303 0. ]
[0. 0.70710678 0. 0. 0.70710678]
[0. 0.53256952 0. 0.65782931 0.53256952]
[0. 0.36626037 0.57381765 0. 0.73252075]]
2.2 项目数据介绍
本项目中的数据为中文的历史上用户的评价中文数据,具体的数据格式为:
其中text为输入的文本,flag为文本的标签
2.3 项目数据处理
通过jieba分词器对中文数据进行切词处理,具体的代码如下所示:
data['cus_comment']= data['text'].apply(lambda x: ' '.join(list(jieba.cut(x))))
category_mapping = {
"体育": 0,
"娱乐": 1,
"房产": 2,
"教育": 3,
"时政": 4,
"游戏": 5,
"社会": 6,
"科技": 7,
"股票": 8,
"财经": 9
}
#特征值转换
data['target'] = data['flag'].map(category_mapping)
data.head()
text flag cus_comment target
0 中华女子学院:本科层次仅1专业招男生 教育 中华 女子 学院 : 本科 层次 仅 1 专业 招 男生 3
1 两天价网站背后重重迷雾:做个网站究竟要多少钱 科技 两天 价 网站 背后 重重 迷雾 : 做个 网站 究竟 要 多少 钱 7
2 东5环海棠公社230-290平2居准现房98折优惠 房产 东 5 环 海棠 公社 230 - 290 平 2 居 准现房 98 折 优惠 2
3 卡佩罗:告诉你德国脚生猛的原因 不希望英德战踢点球 体育 卡佩罗 : 告诉 你 德国 脚 生猛 的 原因 不 希望 英德 战 踢 点球 0
4 82岁老太为学生做饭扫地44年获授港大荣誉院士 社会 82 岁 老太 为 学生 做饭 扫地 44 年 获授 港大 荣誉 院士 6
2.4 文本向量化
为了使得特征不向量穿越,这个时候需要先对其进行训练数据、测试数据的划分,具体的代码如下所示:
#切分测试集、训练集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(data['cus_comment'], data['target'], random_state=3, test_size=0.25)
#引入停用词
infile = open("stop_word.txt",encoding='utf-8')
stopwords_lst = infile.readlines()
stopwords = [x.strip() for x in stopwords_lst]
#中文分词
def fenci(train_data):
words_df = train_data.apply(lambda x:' '.join(jieba.cut(x)))
return words_df
x_train[:5]
195436 评论 : 买房 别 拿 通货膨胀 做 理由
133504 诺安 旗下 两 基金 分红
193602 《 恶魔城 》 系列 新作 公布 支持 6 人 游戏
29919 组图 : 蔡健雅 许茹芸 苏慧伦 齐聚 合开 演唱会 有谱
21642 上海 2010 年 高考 成绩 6 月 26 日晚 8 点 可查
Name: cus_comment, dtype: object
中文文本特征处理,需要进行中文分词,jieba分词库简单好用。接下来需要过滤停用词,最后就要进行文本转向量,有词库表示法、TF-IDF、word2vec等,这里我们使用sklearn库的TF-IDF工具进行文本特征提取。
#使用TF-IDF进行文本转向量处理
from sklearn.feature_extraction.text import TfidfVectorizer
tv = TfidfVectorizer(stop_words=stopwords, max_features=3000, ngram_range=(1,2))
tv.fit(x_train)
tv.transform(x_train)
<150000x3000 sparse matrix of type '<class 'numpy.float64'>'
with 510413 stored elements in Compressed Sparse Row format>
从上可以得出,将文本吹成了3000维的向量表示
2.5 文本分类
特征和标签已经准备好了,接下来就是建模了。这里我们使用文本分类的经典算法朴素贝叶斯算法,而且朴素贝叶斯算法的计算量较少,具体的代码如下所示:
#计算分类效果的准确率
from sklearn.naive_bayes import MultinomialNB
import numpy as np
from sklearn.metrics import roc_auc_score, f1_score, classification_report
classifier = MultinomialNB()
classifier.fit(tv.transform(x_train), y_train)
print(classification_report(y_test, [np.argmax(i) for i in classifier.predict_proba(tv.transform(x_test))]))
precision recall f1-score support
0 0.68 0.87 0.76 4862
1 0.76 0.71 0.73 5036
2 0.89 0.81 0.85 4967
3 0.87 0.90 0.89 5068
4 0.78 0.78 0.78 5072
5 0.83 0.79 0.81 4907
6 0.77 0.80 0.79 4953
7 0.81 0.70 0.75 5093
8 0.72 0.73 0.73 5063
9 0.80 0.79 0.80 4979
accuracy 0.79 50000
macro avg 0.79 0.79 0.79 50000
weighted avg 0.79 0.79 0.79 50000
🔍 3. 高级用法
使用tfidf进行机器学习分类分类是,特征的提取向量决定了最终模型的效果上线,对于sklearn中的tfidf算法,文本特征向量表达效果的好坏取决于滑动窗口的大小,具体的参数如下所示:
- tv = TfidfVectorizer(stop_words=stopwords, max_features=3000, ngram_range=(1,2))
起绝对性因素的两个参数为max_feature
得大小,但是ngram_range
参数的区间如果变大的话可以使得整个文本提取的表达能力达到最优的状态。
🔍 4. 注意事项
- 数据清洗:确保文本数据是干净的,去除无关字符和噪声,如HTML标签、特殊符号等。
- 文本标准化:将所有文本转换为统一的小写形式,以避免大小写引起的差异。
- 停用词过滤:去除常见的停用词,如“the”,“is”,“in”等,因为这些词通常对文本的语义贡献不大。
- 词干提取或词形还原:根据需要选择是否进行词干提取或词形还原,以减少词形变化带来的影响。
- 特征选择:TF-IDF可能会生成大量的特征,考虑使用特征选择技术来减少特征维度,提高模型性能。
- 参数调优:对于贝叶斯和随机森林分类器,需要调整模型参数以获得最佳性能,如随机森林中的树的数量和深度。
- 避免数据泄露:在划分训练集和测试集时,确保训练集和测试集之间没有信息泄露。
- 模型评估:使用适当的评估指标,如准确率、召回率、F1分数等,来全面评估模型性能。
- 交叉验证:使用交叉验证来评估模型的稳定性和泛化能力。
- 类别不平衡:如果数据集中的类别分布不均匀,考虑使用重采样技术或调整分类阈值。
🔧 5. 总结
在本教程中,我们学习了如何使用TF-IDF方法提取文本特征,并使用贝叶斯或随机森林分类器进行文本分类。预处理和特征提取是文本分类任务中的关键步骤,选择合适的模型和评估方法对于获得良好性能至关重要。