【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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac