【深度学习】基于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