目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的对联(春联)生成算法实现
设计思路
一、课题背景与意义
对联是中国传统文化中的一种艺术形式,具有丰富的文化内涵和审美价值。然而,对联的创作对于大多数人来说是一项具有挑战性的任务。传统的对联生成方法通常基于规则和经验,缺乏自动化和创新性。基于深度学习的对联生成系统的实现为该领域提供了一种全新的解决方案。深度学习技术通过学习大量对联数据和语言模式,能够自动学习对联的特征和规律。这种系统不仅可以生成高质量的对联,还具备创新性和灵活性,能够创造出独特而富有创意的对联作品。
二、算法理论原理
2.1 关键词特征提取
通过采用TextRank算法从用户输入的文本中提取关键词,可以作为对联写作的大纲。TextRank算法基于图排序,可以评估词在一句话或一段话中的重要程度。算法通过构建无向网络图和节点之间的连接关系,根据词的共现次数设置权重。根据TextRank最终得分进行排序,提取用户输入文本中最关键的M个词(M ≤ N)。在构建对联的大纲时,如果从用户输入中提取的关键词M较小于N,需要对关键词进行扩展,扩展出相互之间具有联系的关键词。
对于大纲构建,可以采用基于注意力机制的序列到序列模型进行关键词扩展,训练出用于大纲构建的关键词扩展模型(pkeseq2seq)。对于对联大纲构建,可以采用相同的注意力机制模型进行关键词扩展,训练出用于对联大纲构建的关键词扩展模型(ckeseq2seq)。这些模型能够学习词与词之间的关联,并将具有关联的词扩展出来,为古诗和对联的写作提供大纲和创作灵感。
2.2 对联生成模型
为了融合对联的自动生成,可以引入多任务学习机制。在对联创作中,通常作家会先制定一个简单的大纲,然后进行创作。在计算机创作时,也需要根据大纲信息进行创作。借鉴基于规划的古诗生成模型,将写作大纲融入到生成模型中,提出了一种基于多任务学习的古诗和对联生成模型(mtgseq2seq)。模型的输入由两个不同的序列组成:关键词和所有已生成的句子,模型根据设定的参数输出对应的古诗和对联。
模型的编码器部分共享参数,可以捕捉到古诗和对联共有的语义和语法特征。解码器部分则分别学习古诗和对联的独特特征。通过优化目标函数,模型能够生成最符合条件概率的古诗和对联。这种基于多任务学习的方法可以提高古诗和对联的生成质量和多样性。
相关代码示例:
poem_inputs = tf.placeholder(tf.float32, [batch_size, poem_input_length])
couplet_inputs = tf.placeholder(tf.float32, [batch_size, couplet_input_length])
# 编码器共享参数
with tf.variable_scope("shared_encoder"):
poem_encoder_outputs = poem_encoder(poem_inputs)
couplet_encoder_outputs = couplet_encoder(couplet_inputs)
# 解码器
with tf.variable_scope("decoder"):
poem_outputs = decoder(poem_encoder_outputs, task="poem")
couplet_outputs = decoder(couplet_encoder_outputs, task="couplet")
三、算法实现
3.1 数据集
由于网络上没有现有的合适的数据集,我决定自己进行数据收集,制作一个全新的数据集。这个数据集包含了各种对联的文本样本,其中包括了多样的题材、风格和作者。通过网络爬取的方式,我能够获取到大量真实的对联文本,这将为我的研究提供更广泛、多样的数据。我相信这个自制的数据集将为对联生成研究提供有力的支持,并促进该领域的发展和创新。
3.3 模型训练
对所有语料进行了分词处理,并计算了每个词的TextRank分数。然后,根据TextRank分数选择每个句子中TextRank分数最高的词作为关键词。在对联生成任务中,从一副对联中提取2个关键词。首先利用TextRank算法从上联中提取出一个关键词,然后根据关键词在上联中的位置,从下联中对应的位置提取出相应的关键词。
为了训练生成模型,从绝句的训练语料中提取了289,900个关键词,从对联的训练语料中提取了380,766个关键词。这些关键词根据不同任务的要求,组合成不同的形式,用于训练相应的模型。
模型训练采用交叉熵作为训练的损失函数,使用小批量随机梯度下降算法作为优化器。此外,使用AdaDelta算法对学习率进行调节。最终,根据验证集上的困惑度选择了最优参数。为后续的生成任务提供了更准确和高质量的输出。
相关代码示例:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义模型
model = YourModel() # 替换为实际的模型类
# 定义损失函数
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.1) # 使用小批量随机梯度下降算法
# 定义学习率调节器
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=True)
# 训练循环
for epoch in range(num_epochs):
# 在训练集上进行训练
model.train()
for inputs, labels in train_dataloader: # 遍历训练集的小批量数据
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 在验证集上进行评估
model.eval()
total_loss = 0.0
total_samples = 0
with torch.no_grad():
for inputs, labels in val_dataloader: # 遍历验证集的小批量数据
outputs = model(inputs)
loss = criterion(outputs, labels)
total_loss += loss.item() * inputs.size(0)
total_samples += inputs.size(0)
# 计算平均损失和困惑度
avg_loss = total_loss / total_samples
perplexity = torch.exp(torch.tensor(avg_loss))
# 根据验证集上的困惑度调整学习率
scheduler.step(perplexity)
# 打印训练过程中的信息
print(f"Epoch {epoch+1}/{num_epochs}: Average Loss = {avg_loss:.4f}, Perplexity = {perplexity:.4f}")
# 选择最优参数
best_params = model.parameters()
# 后续使用最优参数进行生成任务
# ...
海浪学长项目示例:
大数据算法项目
机器视觉算法项目
微信小程序项目
Unity3D游戏项目
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!