【深度学习】基于SVM的文本情感分类模型---应用(附源代码+数据集)

【深度学习】基于SVM的文本情感分类模型—应用(附源代码+数据集)

一、SVM介绍

支持向量机(Support Vector Machine, SVM)是一种强大且灵活的分类工具,广泛用于分类和回归任务适用于各种复杂的分类问题。SVM的核心思想是寻找一个最佳的超平面,将不同类别的样本分隔开。

1.1 SVM的基本概念

1.分类

  • 线性分类:在二维空间中,SVM试图找到一条直线(在高维空间中是一个超平面),使得样本点的分类间隔最大化。这个超平面将数据分为两个类别,并且距离超平面最近的样本点称为支持向量。
  • 非线性分类:对于无法用线性超平面分隔的数据,SVM可以通过核函数将数据映射到高维空间,使得在高维空间中可以用线性超平面分隔。

2.最大间隔

  • SVM的目标是找到一个能够最大化两个类别之间的间隔(即支持向量到超平面的距离)的超平面。这个间隔越大,模型的泛化能力通常越强。

3.核函数

  • 线性核:当数据在原空间中是线性可分时使用。
  • 多项式核:用于处理数据在高维空间中的非线性关系。
  • 高斯径向基核(RBF):通过非线性变换将数据映射到无限维的特征空间。
  • Sigmoid核:类似于神经网络的激活函数。

1.2 SVM的优点、缺点

1.2.1 优点
  • 有效性:在高维空间中表现良好。
  • 灵活性:通过核函数可以处理非线性分类问题。
  • 稳定性:在样本数量较小的情况下,也能稳定地进行训练。
1.2.2 缺点
  • 计算复杂度:对于大规模数据集,训练时间和计算复杂度较高。
  • 参数选择:需要选择合适的核函数和调参,可能需要进行大量的实验。

1.3 SVM的应用场景

二、基于SVM的文本情感分类模型

本文提出一种基于支持向量机(Support Vector Machine, SVM)的机器学习模型来实现文本情感分类。以下是整体设计思路。

2.1 文本情感分类任务

2.1.1 任务介绍

文本情感分类(Text Sentiment Classification)是一种自然语言处理(NLP)任务,其目标是确定给定文本的情感倾向。这种分类通常包括以下几类:

情感分类
正面情感(Positive Sentiment)文本表达了积极的情绪或观点,例如快乐、满意、赞扬等。
负面情感(Negative Sentiment)文本表达了消极的情绪或观点,例如愤怒、不满、批评等。
中性情感(Neutral Sentiment)文本既不表达强烈的正面情绪,也不表达强烈的负面情绪,通常是客观陈述。
其他情感类别(Optional)一些任务可能包括更多细分类别,例如愤怒、悲伤、惊喜等。
2.1.2 应用场景

文本情感分类在各种应用场景中有着广泛的应用,包括但不限于:

场景
产品评价分析分析用户对产品或服务的评价,以了解用户满意度。
社会媒体监控监控社交媒体上的情感倾向,了解公众舆论。
市场研究评估市场反馈,帮助企业进行市场决策。
客服自动化识别客户情感,以便更好地提供支持和服务。

2.2 模型模块化设计

2.2.1 导入必要的库
  • csv: 用于读取CSV文件。
  • random: 用于打乱数据。
  • pandas: 用于数据处理。
  • sklearn: 提供机器学习模型和工具,包括数据划分、特征提取、模型训练和评估。
  • matplotlib.pyplot 和 seaborn: 用于绘制混淆矩阵等图形。
  • jieba: 中文分词工具,用于处理中文文本。
import csv
import random
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import jieba
2.2.2 读取和处理数据
  • 读取CSV文件:

从指定文件中读取评论和标签数据,并存储到 comments_data 列表中。

  • 数据预处理:
  • 仅保留前1000条数据(可以根据实际需求调整)。
  • 打乱数据以避免顺序对模型训练的影响。
  • 删除重复的评论。
  • 调用 clean_labels 函数处理标签。
""" 设计数据集 """
def read_file(file_name):
    print("开始读取文件...")
    comments_data = None
    with open(file_name, 'r', encoding='UTF-8') as f:
        reader = csv.reader(f)
        comments_data=[]
        for line in reader:
            if len(line[0]) > 0:
                comments_data.append([line[0], line[1]])

    # 只取读取前1000条数据
    comments_data = comments_data[:1000]
    
    # 打乱数据集,并删除重复项
    random.shuffle(comments_data)
    data = pd.DataFrame(comments_data, columns=['Comment', 'Label'])
    data = data.drop_duplicates()
    data = clean_labels(data)
    print("文件读取完成.")
    return data

2.2.3 清理标签

将标签转换为数值型,并删除无效的标签数据(如无法转换的值)。打印清理后的标签,以便确认处理结果。


""" 定义清理标签函数 """
def clean_labels(df):
    df['label'] = pd.to_numeric(df['Label'], errors='coerce')
    df = df.dropna(subset=['Label'])
    df['Label'] = df['Label'].astype(int)
    print("清理后的标签:")
    print(df['Label'].unique())
    return df
2.2.4 中文分词

使用 jieba 对中文评论进行分词,以适应TF-IDF特征提取。

""" 定义中文分词函数"""
def Chinese_tokenizer(text):
    return ' '.join(jieba.cut(text))
2.2.5 训练和评估模型
  • 数据准备:
  • 将评论分词并存储在 Comment 列中。
  • 使用 train_test_split 划分数据集,同时保留原始评论数据。
  • 特征提取:

使用 TfidfVectorizer 将文本数据转化为TF-IDF特征。

  • 模型训练:

使用逻辑回归进行训练。

  • 评估模型:
  • 计算训练集和测试集的准确率。
  • 打印测试集的分类报告。
  • 绘制混淆矩阵,以可视化模型的分类效果。
  • 打印测试集中的每个评论的原始文本、实际标签和预测标签。

""" 定义中文分词函数"""
def Chinese_tokenizer(text):
    return ' '.join(jieba.cut(text))


""" 设置训练和评估函数 """
def train_and_evaluate_SVM(data):
    Comment = data['Comment'].apply(Chinese_tokenizer)
    Label = data['Label']
    original_comments = data['Comment']
    Comment_train, Comment_test, Label_train, Label_test, original_comments_train, original_comments_test = train_test_split(Comment, Label, original_comments, test_size=0.2, random_state=42
    )
    # 特征提取 (TF-IDF)
    tfidf = TfidfVectorizer(max_features=2000)
    X_train_tfidf = tfidf.fit_transform(Comment_train)
    X_test_tfidf = tfidf.transform(Comment_test)

    # 训练逻辑回归分类器
    clf = LogisticRegression(random_state=1)
    clf.fit(X_train_tfidf, Label_train)

    # 预测和评估模型
    y_pred_train = clf.predict(X_train_tfidf)
    y_pred_test  = clf.predict(X_test_tfidf)

    print('训练集准确率: %.2f' % accuracy_score(Label_train, y_pred_train))
    print('测试集准确率: %.2f' % accuracy_score(Label_test, y_pred_test))

    print('测试集分类报告:')
    print(classification_report(Label_test, y_pred_test))

    # 生成混淆矩阵
    conf_mat = confusion_matrix(Label_test, y_pred_test)
    plt.figure(figsize=(10, 7))
    sns.heatmap(conf_mat, annot=True, fmt='d', xticklabels=clf.classes_, yticklabels=clf.classes_)
    plt.xlabel('Predicted')
    plt.ylabel('Actual')
    plt.title('Confusion Matrix')
    plt.show()

    # 打印所有预测结果
    print("\n所有预测结果:")
    for i in range(len(original_comments_test)):  # 打印所有测试集样本
        print(f"评论: {original_comments_test.iloc[i]}")
        print(f"实际标签: {Label_test.iloc[i]}")
        print(f"预测标签: {y_pred_test[i]}")
        print("---------")
2.2.6 主函数

读取数据文件,调用 read_file 函数获取数据,然后调用 train_and_evaluate_SVM 函数进行模型训练和评估。

""" 主函数 """
if __name__ == "__main__":
    file_path = "D:/Python Project_2024_7_20_BERT/comments.csv"
    comments_data =read_file(file_path)
    train_and_evaluate_SVM(comments_data)

2.3 模型实现完整代码及运行结果

完整代码

import csv
import random
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import jieba

""" 设计数据集 """
def read_file(file_name):
    print("开始读取文件...")
    comments_data = None
    with open(file_name, 'r', encoding='UTF-8') as f:
        reader = csv.reader(f)
        comments_data=[]
        for line in reader:
            if len(line[0]) > 0:
                comments_data.append([line[0], line[1]])

    # 只取读取前1000条数据
    comments_data = comments_data[:1000]

    # 打乱数据集,并删除重复项
    random.shuffle(comments_data)
    data = pd.DataFrame(comments_data, columns=['Comment', 'Label'])
    data = data.drop_duplicates()
    data = clean_labels(data)
    print("文件读取完成.")
    return data


""" 定义清理标签函数 """
def clean_labels(df):
    df['label'] = pd.to_numeric(df['Label'], errors='coerce')
    df = df.dropna(subset=['Label'])
    df['Label'] = df['Label'].astype(int)
    print("清理后的标签:")
    print(df['Label'].unique())
    return df


""" 定义中文分词函数"""
def Chinese_tokenizer(text):
    return ' '.join(jieba.cut(text))


""" 设置训练和评估函数 """
def train_and_evaluate_SVM(data):
    Comment = data['Comment'].apply(Chinese_tokenizer)
    Label = data['Label']
    original_comments = data['Comment']
    Comment_train, Comment_test, Label_train, Label_test, original_comments_train, original_comments_test = train_test_split(Comment, Label, original_comments, test_size=0.2, random_state=42
    )
    # 特征提取 (TF-IDF)
    tfidf = TfidfVectorizer(max_features=2000)
    X_train_tfidf = tfidf.fit_transform(Comment_train)
    X_test_tfidf = tfidf.transform(Comment_test)

    # 训练逻辑回归分类器
    clf = LogisticRegression(random_state=1)
    clf.fit(X_train_tfidf, Label_train)

    # 预测和评估模型
    y_pred_train = clf.predict(X_train_tfidf)
    y_pred_test  = clf.predict(X_test_tfidf)

    print('训练集准确率: %.2f' % accuracy_score(Label_train, y_pred_train))
    print('测试集准确率: %.2f' % accuracy_score(Label_test, y_pred_test))

    print('测试集分类报告:')
    print(classification_report(Label_test, y_pred_test))

    # 生成混淆矩阵
    conf_mat = confusion_matrix(Label_test, y_pred_test)
    plt.figure(figsize=(10, 7))
    sns.heatmap(conf_mat, annot=True, fmt='d', xticklabels=clf.classes_, yticklabels=clf.classes_)
    plt.xlabel('Predicted')
    plt.ylabel('Actual')
    plt.title('Confusion Matrix')
    plt.show()

    # 打印所有预测结果
    print("\n所有预测结果:")
    for i in range(len(original_comments_test)):  # 打印所有测试集样本
        print(f"评论: {original_comments_test.iloc[i]}")
        print(f"实际标签: {Label_test.iloc[i]}")
        print(f"预测标签: {y_pred_test[i]}")
        print("---------")

""" 主函数 """
if __name__ == "__main__":
    file_path = "D:/Python Project_2024_7_20_BERT/comments.csv"
    comments_data =read_file(file_path)
    train_and_evaluate_SVM(comments_data)

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、附件:代码运行参考指南

3.1 数据集文件

准备18多万条手机评论信息和对应的情感标签," 0、1、2 "代表差中好评。(文件下载地址在评论区)

3.2 代码补充说明

有任何问题可以联系我:lsc202731497@163.com

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值