【NLP项目-01】手把手教你基于TF-IDF提取向量+贝叶斯或者随机森林进行文本分类

本文主要是介绍【NLP项目-01】手把手教你基于TF-IDF提取向量+贝叶斯或者随机森林进行文本分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【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=log1+j:tidjD
    T F − I D F i , j = t f i , j ∗ i d f i TF-IDF_{i,j}=tf_{i,j}*idf_i TFIDFi,j=tfi,jidfi

💡 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
25环海棠公社230-2902居准现房98折优惠	房产	东 5 环 海棠 公社 230 - 2902 居 准现房 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_dfx_train[:5]195436               评论 : 买房 别 拿 通货膨胀 做 理由
133504                       诺安 旗下 两 基金 分红
193602        《 恶魔城 》 系列 新作 公布   支持 6 人 游戏
29919      组图 : 蔡健雅 许茹芸 苏慧伦 齐聚   合开 演唱会 有谱
21642     上海 2010 年 高考 成绩 626 日晚 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   support0       0.68      0.87      0.76      48621       0.76      0.71      0.73      50362       0.89      0.81      0.85      49673       0.87      0.90      0.89      50684       0.78      0.78      0.78      50725       0.83      0.79      0.81      49076       0.77      0.80      0.79      49537       0.81      0.70      0.75      50938       0.72      0.73      0.73      50639       0.80      0.79      0.80      4979accuracy                           0.79     50000macro 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方法提取文本特征,并使用贝叶斯或随机森林分类器进行文本分类。预处理和特征提取是文本分类任务中的关键步骤,选择合适的模型和评估方法对于获得良好性能至关重要。

这篇关于【NLP项目-01】手把手教你基于TF-IDF提取向量+贝叶斯或者随机森林进行文本分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071343

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py