当前位置: 首页 > news >正文

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。

一、概念温习

支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。

它的核心思想是通过在高维空间中寻找一个超平面,将数据分成不同的类别。SVM 通过最大化类间的边界(即间隔)来提高模型的泛化能力,尤其适合处理小样本和高维数据。

SVM 在文本情感分析中的作用尤为突出,因为文本数据通常具有高维特征(例如词汇表的大小),而 SVM 擅长于处理这种维度较高的稀疏数据。

通过将文本转化为数值特征(如 TF-IDF),SVM 能有效地在情感分类任务中学习到情感标签与文本内容之间的关系。尤其在情感分析中,SVM 能够识别出情感倾向的关键特征,从而准确地对文本进行分类(如“积极”或“消极”)。其优越的分类性能和对高维数据的适应性使得 SVM 成为情感分析中常用的算法。

图1. 支持向量机的特点 

二、实现逻辑

一个用Python 和支持向量机(SVM)实现的情感分析主要逻辑是这样的:

  • 首先,脚本加载一个包含文本和标签(“Positive”或“Negative”)的 JSON 数据集,并将标签转换为二元分类(1 为积极,0 为消极)。
  • 接着,使用 TfidfVectorizer 将文本数据转换为数值特征,去除常见的停用词并限制特征维度。
  • 然后,使用 SVM 模型(线性核)对训练集进行训练,评估其在测试集上的表现,输出分类报告。
  • 训练完成后,模型和 TF-IDF 向量化器被保存为文件,以便后续加载使用。
  • 我们还需要一个调用函数 可以命名为:predict_sentiment,用于加载保存的模型并对新输入的文本进行情感预测。整个流程为文本情感分类任务提供了一个标准的解决方案。

我们可以用这样一个流程框图来描述整个过程:(点击放大查看)

图2. 案例实现逻辑 

 三、训练数据准备

在机器学习中,数据是模型训练的基础,直接影响模型的性能和准确性。对于文本情感分析任务,data.json 中的训练数据至关重要。该数据集包含大量标注了情感标签(“Positive”和“Negative”)的文本,能够为模型提供学习情感分类的实例。

通过这些带标签的文本,支持向量机(SVM)可以识别文本中的情感特征,并学会区分不同情感类别。在情感分析中,数据的质量和多样性决定了模型的泛化能力。如果数据集中的文本种类丰富、情感标签明确且分布均匀,模型能够更好地捕捉到情感表达的细微差异。此外,适当的训练数据量能帮助减少过拟合,提升模型在新数据上的表现。因此,data.json 提供的训练素材为模型提供了必要的输入和监督信息,是模型准确预测情感的重要保障。

在案例中,我的素材内包括了50个短句和与之对应的标签,以供模型训练使用,我将这个标签文件放在了素材中,需要的可自行下载。 

SVM 是一种非常适合文本分类的算法,尤其是当文本数据不太多且维度较高时。下面是一个完整的步骤说明,帮助你使用 Python 实现 SVM 来训练和保存一个情感分析模型。

四、实现步骤概述:

  1. 数据预处理:加载数据,进行必要的文本处理(如分词、去除停用词等)。
  2. 特征提取:将文本数据转换为数值形式(通常使用 TF-IDF)。
  3. 训练模型:使用支持向量机(SVM)来训练情感分析模型。
  4. 模型保存:将训练好的模型保存,以便以后使用。
  5. 模型调用:加载保存的模型并进行预测。

1. 安装必要的库

首先,确保你安装了必要的 Python 库。你可以使用以下命令安装:

pip install scikit-learn numpy pandas joblib

2. 数据加载与预处理

假设你已经将数据保存到 data.json 文件中,首先加载数据,并对文本进行预处理。(data.json 我已经放在本文的资源中)

import json
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.metrics import classification_report
import joblib# 加载 JSON 数据
with open('data.json', 'r') as file:data = json.load(file)# 创建 DataFrame
df = pd.DataFrame({'text': data['text'],'label': data['label']
})# 将标签转换为数字,'Positive' -> 1, 'Negative' -> 0
df['label'] = df['label'].apply(lambda x: 1 if x == 'Positive' else 0)# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df['text'], df['label'], test_size=0.3, random_state=42)# 显示数据分割情况
print(f"训练集大小: {len(X_train)}, 测试集大小: {len(X_test)}")

3. 特征提取(使用 TF-IDF)

我们将使用 TF-IDF 来将文本数据转换为数值特征。TF-IDF 是一种常见的文本特征提取方法,它考虑了词频和逆文档频率。

# 创建 TF-IDF 向量化器
tfidf_vectorizer = TfidfVectorizer(stop_words='english', max_features=5000)# 训练 TF-IDF 向量化器并转换训练集和测试集
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)

4. 训练支持向量机(SVM)模型

现在,我们可以训练一个支持向量机(SVM)模型,进行文本分类。

# 创建 SVM 分类器
svm_classifier = SVC(kernel='linear')  # 使用线性核函数# 训练模型
svm_classifier.fit(X_train_tfidf, y_train)# 预测
y_pred = svm_classifier.predict(X_test_tfidf)# 输出模型性能评估
print(classification_report(y_test, y_pred))

5. 保存模型

训练完成后,我们可以将模型保存为一个文件,以便以后加载并使用。

# 保存 SVM 模型和 TF-IDF 向量化器
joblib.dump(svm_classifier, 'svm_sentiment_model.pkl')
joblib.dump(tfidf_vectorizer, 'tfidf_vectorizer.pkl')print("模型已保存!")

6. 加载模型并进行预测

按照上面的操作以后,你可以随时加载保存的模型来进行预测。以下是如何加载并使用保存的模型:

# 加载已保存的模型和 TF-IDF 向量化器
svm_model = joblib.load('svm_sentiment_model.pkl')
tfidf_vectorizer = joblib.load('tfidf_vectorizer.pkl')# 示例预测
def predict_sentiment(text):# 将文本转换为 TF-IDF 特征text_tfidf = tfidf_vectorizer.transform([text])# 使用模型进行预测prediction = svm_model.predict(text_tfidf)return "Positive" if prediction[0] == 1 else "Negative"# 测试预测
sample_text = "I am so happy with my new job!"
result = predict_sentiment(sample_text)
print(f"预测情感: {result}")

五、完整代码总结:

import json
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.metrics import classification_report
import joblib# 加载 JSON 数据
with open('data.json', 'r') as file:data = json.load(file)# 创建 DataFrame
df = pd.DataFrame({'text': data['text'],'label': data['label']
})# 将标签转换为数字
df['label'] = df['label'].apply(lambda x: 1 if x == 'Positive' else 0)# 分割数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df['text'], df['label'], test_size=0.3, random_state=42)# TF-IDF 向量化
tfidf_vectorizer = TfidfVectorizer(stop_words='english', max_features=5000)
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)# 训练 SVM 模型
svm_classifier = SVC(kernel='linear')
svm_classifier.fit(X_train_tfidf, y_train)# 预测
y_pred = svm_classifier.predict(X_test_tfidf)
print(classification_report(y_test, y_pred))# 保存模型
joblib.dump(svm_classifier, 'svm_sentiment_model.pkl')
joblib.dump(tfidf_vectorizer, 'tfidf_vectorizer.pkl')# 加载模型并进行预测
def predict_sentiment(text):text_tfidf = tfidf_vectorizer.transform([text])prediction = svm_classifier.predict(text_tfidf)return "Positive" if prediction[0] == 1 else "Negative"sample_text = "I am so happy with my new job!"
result = predict_sentiment(sample_text)
print(f"预测情感: {result}")

这样我们就可以用训练好的 SVM 模型来进行文本情感分析了!

六、测似结果

负面文本测试结果:

正面文本测试结果:

 

需要注意的是:实际上,训练数据中的50条样本,远远不足以训练出一个可以真实应用的模型,因此才测试的时候,你可以将数据中的原文短句进行测试,这样准确率会很高。

七、应用场景 

虽然这个模型看起来很简单,能处理的情感维度也比较低,但是在实践中,是有很多这样的应用场景的,以下是一些适用场景:

1. 小型文本数据集

当训练数据集相对较小且标注数据有限时,SVM 模型能够有效工作。它通过最大化类别间的间隔,能够在样本较少的情况下提供较好的泛化能力。因此,对于一些规模较小的情感分析任务,这种简单模型非常适用。

2. 情感分类任务

适用于较为简单的情感分类任务,比如判断用户评价、评论或社交媒体帖子中的情感倾向(如正面或负面)。如果文本内容较短,特征维度不高,SVM 能够较好地学习文本的情感模式。

3. 低资源环境

在硬件或计算资源受限的环境下,SVM 由于其相对较小的内存需求和计算复杂度,适合在资源有限的设备上运行,比如移动端或边缘计算设备。

4. 不需要深度语义理解的应用

当任务的文本情感较为直接和明显时,简单的 SVM 模型能够有效分类。例如,用户评论中的情感一般较为直接(如“这款产品太好用了” vs “这个产品太差了”)。这类场景不需要复杂的深度学习模型,SVM 可以提供足够的准确性。

5. 需要快速部署和预测的场景

在需要快速部署并进行情感分类的场景中,简单的 SVM 模型可以快速训练并进行预测。由于模型较小,训练和推理速度较快,非常适合实时情感分析系统(如实时监测社交媒体评论或产品评价)。

6. 应用于情感标签较少的任务

如果情感分类任务中的标签较少(比如只有正面和负面两个情感类别),SVM 模型非常适用。其线性核函数能够快速找到最佳分隔超平面,并且能较好地处理二分类问题。

这次的模型训练主要是为了讲解如何实现的方法。有问题可以留言我们一起讨论!

谢谢观看本文!感谢点赞关注!

相关文章:

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。 它的核心思想是通过…...

torch.unsqueeze:灵活调整张量维度的利器

在深度学习框架PyTorch中,张量(Tensor)是最基本的数据结构,它类似于NumPy中的数组,但可以在GPU上运行。在日常的深度学习编程中,我们经常需要调整张量的维度以适应不同的操作和层。torch.unsqueeze函数就是…...

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例 每个 WPS 程序的功能程序1:geogrid程序2:ungrib程序3:metgrid WPS运行(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extract…...

SD ComfyUI工作流 根据图像生成线稿草图

文章目录 线稿草图生成SD模型Node节点工作流程工作流下载效果展示线稿草图生成 该工作流的设计目标是将输入的图像转换为高质量的线稿风格输出。其主要流程基于 Stable Diffusion 技术,结合文本和图像条件,精确生成符合预期的线条艺术图像。工作流的核心是通过模型的条件设置…...

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串

一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&#xff…...

git中的多人协作

目录 1.1多人协作1.1.1创建仓库1.1.2协作处理1.1.3冲突处理 1.2分支推送协作1.3分支拉取协作1.4远程分支的删除 1.1多人协作 1.1.1创建仓库 新建两个文件夹,不需要初始化为git仓库,直接克隆远程仓库命名testGit1,testGit2 指定本地仓库级别…...

解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题

原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件....

Elasticsearch:什么是查询语言?

查询语言定义 查询语言包括数据库查询语言 (database query language - DQL),是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口,使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…...

均值聚类算法

K-均值聚类算法是一种常用的无监督学习算法,用于将数据集划分为 K 个簇。它基于以下的思想:通过计算数据点与各个簇中心之间的距离来确定数据点所属的簇,并更新簇中心来最小化簇内数据点的平方误差。K-均值算法的步骤如下: 1. 选…...

MySQL 中快速插入大量数据

在 MySQL 中快速插入大量数据(例如 20 万条记录)可以通过多种方法实现。以下是一些优化技巧和步骤,可以帮助你高效地插入大量数据: 1. 禁用索引和约束(如果可能) 在插入大量数据之前,禁用索引和…...

腾讯云智能结构化OCR:以多模态大模型技术为核心,推动跨行业高效精准的文档处理与数据提取新时代

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…...

最大似然检测在通信解调中的应用

最大似然检测(Maximum Likelihood Detection,MLD),也称为最大似然序列估计(Maximum Likelihood Sequence Estimation,MLSE),是一种在通信系统中广泛应用的解调方法。其核心思想是在给…...

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址:https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具,包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息,因此从古代岩画到现代建筑图纸,素描在世界各地被用于各种用途。儿童…...

[JAVA备忘录] Lambda 表达式简单介绍

目录 前言 函数式接口 Lambda 表达式使用实例 简单示例 1. 无参数,无返回值 2. 有参数,无返回值 3. 无参数,有返回值 4. 有参数,有返回值 解释: 集合框架 1.forEach:遍历集合 2.排序&#xff1…...

[python]使用flask-caching缓存数据

简介 Flask-Caching 是 Flask 的一个扩展,为任何 Flask 应用程序添加了对各种后端的缓存支持。它基于 cachelib 运行,并通过统一的 API 支持 werkzeug 的所有原始缓存后端。开发者还可以通过继承 flask_caching.backends.base.BaseCache 类来开发自己的…...

裸机按键输入实验

一、硬件原理分析 按键就两个状态:按下或弹起,将按键连接到一个 IO 上,通过读取这个 IO 的值就知道按 键是按下的还是弹起的。至于按键按下的时候是高电平还是低电平要根据实际电路来判断。前 面几章我们都是讲解 I.MX6U 的 GPIO 作为输出使用…...

GaussDB运维管理工具(二)

GaussDB运维管理工具(二) 集群管理组件cm_ctl工具介绍cm_ctl工具使用查询集群状态启停集群主备切换重建备DN检测进程运行查看实例配置文件手动剔除故障CNCM参数获取和配置停止仲裁 Cluster Manager(缩写为CM)是GaussDB的集群管理工…...

【HarmonyOS之旅】HarmonyOS开发基础知识(一)

目录 1 -> 应用基础知识 1.1 -> 用户应用程序 1.2 -> 用户应用程序包结构 1.3 -> Ability 1.4 -> 库文件 1.5 -> 资源文件 1.6 -> 配置文件 1.7 -> pack.info 1.8 -> HAR 2 -> 配置文件简介 2.1 -> 配置文件的组成 3 -> 配置文…...

Mysql数据究竟是如何存储的

Mysql行列式 开篇 ​ 笔者这几日在学习mysql是这么运行的这本书,感觉书中的内容受益匪浅,想整理成自己的话分享给大家,平时大家工作和生活中可能没有时间去专心投入读取一本书,而mysql是这么运行的这本书需要投入大量的时间的学…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Vue ③-生命周期 || 脚手架

生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

sshd代码修改banner

sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...