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 模型非常适用。其线性核函数能够快速找到最佳分隔超平面,并且能较好地处理二分类问题。

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

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

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

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

相关文章

.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时,报错 : System.Drawing.Common is not supported on this platform 平台特定实现: 对于Windows平台,System.Drawing.C…

【Unity3D】实现可视化链式结构数据(节点数据)

关键词:UnityEditor、可视化节点编辑、Unity编辑器自定义窗口工具 使用Newtonsoft.Json、UnityEditor相关接口实现 主要代码: Handles.DrawBezier(起点,终点,起点切线向量,终点切线向量,颜色,n…

6UCPCI板卡设计方案:8-基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台

基于双TMS320C6678 XC7K420T的6U CPCI Express高速数据处理平台 1、板卡概述 板卡由我公司自主研发,基于6UCPCI架构,处理板包含双片TI DSP TMS320C6678芯片;一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片;六个千兆网口&#xff…

【Go学习】Go context 对HTTP请求的影响

一、起因 Go语言中contex是控制协程行为的利器,既然是利器,那么用得好可以取得非常好的效果,用的不好,反手就可能伤了自己。为能使用好它,就需要了解其特性,以及在各种场景下的用法。最近遇到的一个问题&a…

Python + 深度学习从 0 到 1(01 / 99)

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 深度学习之前:机器学习简史 什么要了解…

丹摩|丹摩助力selenium实现大麦网抢票

丹摩|丹摩助力selenium实现大麦网抢票 声明:非广告,为用户体验 1.引言 在人工智能飞速发展的今天,丹摩智算平台(DAMODEL)以其卓越的AI算力服务脱颖而出,为开发者提供了一个简化AI开发流程的强…

企业内训|高智能数据构建、Agent研发及AI测评技术内训-吉林省某汽车厂商

吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力,举办本次为期8天的综合培训课程。本课程分为两大部分:面向全体团队成员的AI大模型技术结构与行业应用,以及针对技术团队的高智能数据构建与Agent研发。课程内容涵盖非结构化数…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.gitcd LLaMA-Factorypip install -e ".[torch,metrics]"pip install deepspeed 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /roo…

uniapp blob格式转换为video .mp4文件使用ffmpeg工具

前言 介绍一下这三种对象使用场景 您前端一旦涉及到文件或图片上传Q到服务器,就势必离不了 Blob/File /base64 三种主流的类型它们之间 互转 也成了常态 Blob - FileBlob -Base64Base64 - BlobFile-Base64Base64 _ File uniapp 上传文件 现在已获取到了blob格式的…

【Rabbitmq篇】RabbitMQ⾼级特性----持久性,发送⽅确认,重试机制

目录 一.持久化 1 .交换机持久化 2 队列持久化 3.消息持久化 测试场景 二.发送⽅确认 1 .confirm确认模式 2 return退回模式 如何保证RabbitMQ消息的可靠传输?(面试重点) 三. 重试机制 一.持久化 我们在前⾯讲了消费端处理消息时,…

android recycleview 中倒计时数据错乱

原因 recyceleview 当页面划出屏幕外后,默认会有两条进入缓存区,这些item的结构会被保存,数据被清除,方便其他新进入屏幕的数据复用item,超过两条外的item会进入缓存池被完全销毁重用。 如果我们的页面上有editText 或…

深度学习之目标检测——RCNN

Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法:穷举法,在原始图片上进行不同尺度不同大小的滑窗,获取每个可能的位置 弊端:计算量大,且尺度不能兼顾 Selective …

Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘

在 Spring Boot 生态中,dynamic-datasource-spring-boot-starter 是一个非常实用的组件,它为我们在多数据源场景下提供了便捷的解决方案。在上一篇文章《一分钟上手:如何创建你的第一个 Spring Boot Starter》中,我们学习了如何创…

linux系统编程(五)

1、信号 信号是事件发生时对进程的通知机制,针对每个信号都定义了一个唯一的整数,这些整数定义在signal.h中。 常见信号如下: SIGABRT:进程调用abort函数,系统向进程发送此信号,终止进程并产生核心转储文…

Flutter环境搭建

1.Flutter 简介 1.1 Flutter 是什么 ? Flutter 是一个 UI SDK(Software Development Kit)跨平台解决方案:可以实现一套代码发布移动端(iOS、Android、HarmonyOS)、Web端、桌面端目前很多公司都在用它&…

安全算法基础(一)

安全算法是算法的分支之一,还的依靠大量的数学基础进行计算,本文参照兜哥的AI安全样本对抗,做一个简单的算法安全概括,从零学习。 最新的安全算法对于我们常规的攻击样本检测,效果是不理想的,为了探究其原…

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…

QtCreator配置github copilot实现AI辅助编程

文章目录 1、概述2、配置环境3、演示 1、概述 新时代的浪潮早就已经来临,上不了船的人终将被抛弃,合理使用AI辅助开发、提升效率是大趋势,注意也不要过于依赖。 2024年12月18日,GitHub 官方宣布了一个激动人心的重大消息&#xf…

ElasticSearch08-分析器详解

零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器(Analyzer)是全文搜索的核心组件,它负责将文本转换为一系列单词(term/token)的过程,也叫分词。 (1&#xff…

数字经济下的 AR 眼镜

目录 1. 📂 AR 眼镜发展历史 1.1 AR 眼镜相关概念 1.2 市面主流 XR 眼镜 1.3 AR 眼镜大事记 1.4 国内外 XR 眼镜 1.5 国内 AR 眼镜四小龙 2. 🔱 关键技术 2.1 AR 眼镜近眼显示原理 2.2 AR 眼镜关键技术 2.3 AR 眼镜技术难点 3. &#x1f4a…