目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的诗歌情感分类系统
课题背景和意义
诗歌是人类文化的重要组成部分,具有丰富的情感表达。通过对诗歌的情感分类,我们可以更好地理解和欣赏不同诗人的创作,同时也可以挖掘诗歌中蕴含的情感主题和文化价值。深度学习在自然语言处理领域取得了巨大的进展,尤其是在文本分类任务中。通过利用深度学习模型,可以从大量的诗歌文本中学习情感特征,并自动识别和分类诗歌的情感。
实现技术思路
一、算法理论基础
在情感分析任务上,研究人员通过将情感词、强度词、否定词等信息整合到神经网络中,通过GRU网络获取句子语义信息,构建出多情感资源增强的注意力网络MEAN。相比传统的深度学习方法,该方法取得了更好的效果。此外,研究人员还提出了其他方法,如注意力编码器网络(AEN)、多头自我注意(MHSA)的局部上下文关注(LCF)机制、图卷积神经网络(GCN)等,用于解决基于目标的情感分类任务。近年来,基于深度学习的情感分析方法在各个领域得到广泛应用,具有自动提取文本和语义特征的优势。然而,对于语料规模小、表达含蓄的诗歌文本等情况,传统的深度学习算法较难获取足够的语义信息,因此引入意象特征的深度学习模型可以用于诗歌的情感分类。
BERT是一种基于Transformer架构的预训练模型。BERT的目标是通过大规模的无监督学习从大量文本数据中学习通用的语言表示。与传统的语言模型只使用左侧或右侧的上下文进行预测不同,BERT模型采用了双向的上下文建模,即同时考虑前后的上下文信息。这使得BERT模型能够更好地捕捉词语在句子中的语义和语境,从而提供更丰富的语言表示。
BERT的训练过程包括两个阶段:预训练和微调。在预训练阶段,BERT模型通过对大规模文本数据进行遮蔽(Masked Language Model)和下句预测(Next Sentence Prediction)的任务进行训练,从而学习到丰富的语言表示。在微调阶段,BERT模型在特定的下游任务上进行微调,例如文本分类、命名实体识别等,以适应具体的任务要求。
将诗歌中的意象和文化元素作为重要的特征,将其与情感标签关联起来。通过对意象的分析和文化知识的应用,模型可以更好地理解诗歌中的情感表达,并将其归类为积极、消极或中性等情感类别。这种基于意象文化认知属性知识的诗歌情感分类模型在文学研究、情感分析和创作辅助等领域具有重要的应用价值。它不仅能够提高情感分类的准确性,还能够帮助读者更好地理解和欣赏诗歌作品的情感内涵。
注意力机制的起源是模仿人类的生理机制,即当人类观察某一事物时,会进行快速浏览,并对重要的信息给予更多的关注。基于这种理念,学者们提出了注意力机制,用于在特征信息中提取更为重要的信息。在自然语言处理领域,注意力机制可以提高文本中关键信息的特征权重,让神经网络模型关注文本中的重点信息,忽略不重要的区域信息,从而提高模型的性能。
- 在自然语言处理领域,注意力机制常被应用于机器翻译、文本摘要、问答系统等任务中。下面是一个简单的注意力机制的介绍:
- 输入表示:首先,将输入数据(如句子、序列等)通过神经网络进行编码,得到表示向量序列。
- 查询向量:生成一个查询向量,通常是通过将输入数据经过一层全连接网络得到,用于表示模型关注的目标。
- 分数计算:计算每个输入表示向量与查询向量的相似度得分。常用的计算方法包括点积(dot product)、缩放点积(scaled dot product)和双线性(bilinear)等。
- 注意力权重:将相似度得分通过一种激活函数(如Softmax)转化为注意力权重,表示模型对每个输入表示的重要程度。
- 加权求和:将注意力权重与输入表示向量相乘,并对所有加权结果进行求和,得到注意力机制下的上下文向量。
- 输出计算:将上下文向量输入到后续的神经网络层中进行进一步的计算和处理,用于任务的下一步处理或最终的输出。
三元情感分类是将文本分为正面、负面和中性情感类别的任务。在深度学习中,可以使用卷积神经网络、递归神经网络或预训练的语言模型等方法进行分类。这些模型可以捕捉文本的局部特征、上下文信息和丰富的语义表示。然而,情感分类是主观的任务,需要根据具体情境和应用场景定义情感类别,并使用带有标签的训练数据进行模型训练和评估。
二、 数据集
由于网络上没有现有的合适的数据集,我决定自己收集并制作了一个全新的数据集。为了提高标注的准确性,我们还借助诗歌翻译和赏析工具进行辅助标注。整个数据集被随机分为训练集、验证集和测试集,以确保模型的可靠性。通过这个数据集,我们期望建立一个能够准确分类诗歌情感的模型,为文学研究和诗歌爱好者提供更全面的参考和分析依据。
利用英文预训练模型生成了一个包含17个数据集的文本模态的特征向量。同时,我们设置了最大图片个数s=l,最大句子长度n=64。目标词文本的最大长度设置为16,学习批次设为32,多头自注意力机制中注意力头的个数m=12。此外,我们设置Dropout参数为0.1来防止过拟合,学习率lr设为5x10^-5,训练轮次为20。
import pandas as pd
from sklearn.model_selection import train_test_split
# 读取已标注的数据文件
data = pd.read_csv('poetry_dataset.csv')
# 划分训练集、验证集和测试集
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
train_data, val_data = train_test_split(train_data, test_size=0.2, random_state=42)
# 保存划分后的数据集
train_data.to_csv('train.csv', index=False)
val_data.to_csv('validation.csv', index=False)
test_data.to_csv('test.csv', index=False)
三、实验及结果分析
3.1 实验环境搭建
3.2 模型训练
在模型训练过程中,使用训练数据集对模型进行训练是关键步骤之一。训练的目标是通过调整模型的参数,使其能够对输入数据做出准确的预测。
梯度下降法是一种常用的优化算法,用于最小化模型的损失函数。其核心思想是通过计算损失函数对模型参数的梯度(导数),来确定参数的更新方向。梯度的反方向指向了损失函数下降最快的方向,因此通过不断迭代更新参数,可以逐渐降低损失函数的值。
在梯度下降法的基础上,有几种常见的变种方法可以用于模型训练:
-
批量梯度下降(Batch Gradient Descent):在每一次迭代中,使用全部的训练数据来计算梯度,并更新模型参数。批量梯度下降的优势是每次参数更新的方向更准确,但计算梯度的代价较高,尤其是在大规模数据集上。
-
随机梯度下降(Stochastic Gradient Descent):在每一次迭代中,仅使用一个样本来计算梯度,并更新模型参数。由于每次更新只考虑一个样本,随机梯度下降的计算速度较快,但由于样本的随机性,参数更新方向可能不够准确。
-
小批量梯度下降(Mini-batch Gradient Descent):结合了批量梯度下降和随机梯度下降的优点。在每一次迭代中,使用一小批样本(通常是2到256个)来计算梯度,并更新模型参数。小批量梯度下降同时考虑了样本随机性和梯度准确性,因此在实践中被广泛应用。
weights = np.random.randn(10) # 初始化参数
learning_rate = 0.01 # 学习率
# 定义训练数据集
X_train = np.random.randn(100, 10) # 输入特征
y_train = np.random.randint(0, 2, size=100) # 标签
# 定义损失函数
def compute_loss(X, y, weights):
logits = np.dot(X, weights)
preds = 1 / (1 + np.exp(-logits))
loss = -np.mean(y * np.log(preds) + (1 - y) * np.log(1 - preds))
return loss
# 定义梯度计算函数
def compute_gradient(X, y, weights):
logits = np.dot(X, weights)
preds = 1 / (1 + np.exp(-logits))
gradient = np.dot(X.T, preds - y) / len(X)
return gradient
# 批量梯度下降
def batch_gradient_descent(X, y, weights, learning_rate, num_epochs):
for epoch in range(num_epochs):
gradient = compute_gradient(X, y, weights)
weights -= learning_rate * gradient
loss = compute_loss(X, y, weights)
print(f"Epoch {epoch+1}, Loss: {loss:.4f}")
# 随机梯度下降
def stochastic_gradient_descent(X, y, weights, learning_rate, num_epochs):
for epoch in range(num_epochs):
for i in range(len(X)):
gradient = compute_gradient(X[i], y[i], weights)
weights -= learning_rate * gradient
loss = compute_loss(X, y, weights)
print(f"Epoch {epoch+1}, Loss: {loss:.4f}")
最后
我是海浪学长,创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!