【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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(