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

news2024/11/26 13:58:07

【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_df
 
x_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   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方法提取文本特征,并使用贝叶斯或随机森林分类器进行文本分类。预处理和特征提取是文本分类任务中的关键步骤,选择合适的模型和评估方法对于获得良好性能至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1832569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

List, Set, Map, Queue介绍

Java集合框架是一组接口和实现这些接口的类的集合&#xff0c;它提供了对数据集合的高效率存储和操作。以下是Java集合框架中一些核心接口的介绍&#xff1a; 1.List&#xff1a; List是一个有序的集合&#xff0c;允许包含重复的元素。它提供了按插入顺序访问元素的方法&…

【5.x】ELK日志分析、集群部署

ELK日志分析 一、ELK概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch、Logstash和Kiabana三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求。 一个完整的集中式日志系统&#xff0c;需要包含以下几个主…

数据库原理(关系数据库规范化理论)——(4)

一、关系模式规范化的必要性 1.关系可能出现的问题 数据冗余大&#xff1b;插入异常&#xff1b;删除异常&#xff1b;更新异常&#xff1b; 2.关系模式应满足的基本要求 元组的每个分量必须是不可分割的数据项&#xff1b;数据库中的数据冗余应尽可能少&#xff1b;不要出…

AcWing 1273:天才的记忆 ← ST算法求解RMQ问题

【题目来源】https://www.acwing.com/problem/content/1275/【题目描述】 从前有个人名叫 WNB&#xff0c;他有着天才般的记忆力&#xff0c;他珍藏了许多许多的宝藏。 在他离世之后留给后人一个难题&#xff08;专门考验记忆力的啊&#xff01;&#xff09;&#xff0c;如果谁…

【深度学习】GPT1,提高语言理解的生成预训练方法

论文&#xff1a; https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf 文章目录 提高语言理解的生成预训练方法摘要引言相关工作自然语言处理的半监督学习无监督预训练辅助训练目标 框架无监督预训练有…

基于jeecgboot-vue3的Flowable流程-所有任务

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 这个部分主要讲所有任务的功能 1、主要列表界面如下&#xff1a; <template><div class"p-2"><!--查询区域--><div class"jeecg-basic-table-form-…

纯css星空动画

让大家实现一个这样的星空动画效果,大家会怎么做? js,不! 其实使用css就能写 我也不藏着掖着,源码直接放下面了 <script setup></script><template><div class"box"><div v-for"i in 5" :key"i" :class"layer…

函数递归

哈喽啊各位&#xff0c;真是&#xff0c;好久好久好久不见。这段时间实在是太过忙碌了昂&#xff0c;还望诸君见谅&#xff0c;接下来时间会松很多&#xff0c;咱们也会恢复正常更新速度啦 小希在这里祝诸君&#xff1a;期末不挂科&#xff0c;四六级都过&#xff01;功不唐捐…

玩转Word域代码,再也不担心引用多个文献时的排版

文章目录 序列域代码星号和井号多个参考文献交叉引用 在Word中&#xff0c;域代码是一种特殊的文本&#xff0c;可在文档中插入动态内容&#xff0c;而无需手动输入。熟练掌握域代码的基本原理&#xff0c;可以在Word排版时事半功倍。 序列域代码 【CtlF9】会显式出花括号&am…

【一】【QT开发应用】QT开发环境配置,安装QT应用

下载QT软件 点击网址链接&#xff0c;QT下载网址 下载vsaddin插件 点击网址链接&#xff0c;QT下载网址 根据自己的vs版本下载对应的文件. 安装QT 用命令行打开安装程序 找到直接路径, D:\Software\QT\qt-unified-windows-x86-4.3.0-1-online.exe 利用WindowsPowe…

tyflow线相关教程二

线条生长一 生长静脉二 绳索动画三 两个球线连接四 扫帚五

PFA可溶性聚四氟乙烯晶圆盒培养皿一体成型

PFA可溶性聚四氟乙烯晶圆盒培养皿一体成型 PFA培养皿由一个盖子和一个底组成&#xff0c;独特的加工技术&#xff0c;底部圆弧好&#xff0c;经过磨光处理&#xff0c;表面平滑不挂水&#xff0c;无划痕。多用于实验室接种、划线、培养细菌、分离细菌等&#xff0c;尤其是成膜…

RPC框架知识学习

RPC框架介绍 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架是一种允许程序调用位于另一台计算机上的程序的技术。这种调用看起来就像是调用本地程序一样&#xff0c;但实际上是通过网络进行的。RPC框架使得分布式系统的开发变得更加简单&…

简单几步把完整的Windows塞进U盘,小白都能看懂

前言 小白之前写过相似的文章&#xff0c;但教程是通过WinPE操作实现的。 把Windows系统装进U盘&#xff0c;从此到哪都有属于你自己的电脑系统 有些小伙伴反馈教程写得很复杂&#xff0c;简直生涩难懂。 为啥要写得这么复杂呢&#xff1f;小白是想让小伙伴们多了解一些不同…

【尚庭公寓SpringBoot + Vue 项目实战】用户管理(十五)

【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09;1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

++++++局部变量、全局变量及变量的存储类别++++====+++指针+++

局部变量、全局变量及变量的存储类别 局部变量与全局变量的基本概念 局部变量&#xff1a;在函数内部定义的变量称为局部变量&#xff0c;也称为内部变量。它们只在定义它们的函数内部有效&#xff0c;即只有在这个函数被调用时&#xff0c;局部变量才会被分配内存空间&#x…

从根源解决问题:构建体系化BOM管理机制与解决方案

BOM&#xff08;物料清单&#xff09;是设计与生产间的纽带&#xff0c;其准确及时对企业的竞争力至关重要。然而&#xff0c;维护BOM数据时&#xff0c;常遇到录入错误、信息孤岛及跨部门沟通障碍等难题&#xff0c;直接影响生产效率和成本。为此&#xff0c;道合顺将探讨确保…

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

MTANet: 多任务注意力网络,用于自动医学图像分割和分类| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 MTANet: Multi-Task Attention Network for Automatic Medical Image Segmentation and Classification MTANet: 多任务注意力网络&#xff0c;用于自动医学图像分割和分类 01 文献速递介绍 医学图像分割和分类是当前临床实践中的两个关键步骤&#xff0c;其准…

BRAVE:扩展视觉编码能力,推动视觉-语言模型发展

视觉-语言模型&#xff08;VLMs&#xff09;在理解和生成涉及视觉与文本的任务上取得了显著进展&#xff0c;它们在理解和生成结合视觉与文本信息的任务中扮演着重要角色。然而&#xff0c;这些模型的性能往往受限于其视觉编码器的能力。例如&#xff0c;现有的一些模型可能对某…