共计 2213 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
中文诗歌生成是自然语言处理中一个有趣但充满挑战的任务。与普通文本相比,诗歌具有严格的格律、押韵要求和高度凝练的语言特点。Chinese-Poetry 数据集包含了大量古典诗歌,这为训练生成对抗网络 (GAN) 提供了丰富的素材,但也带来了一些特有的挑战。

- 数据稀疏性:古典诗歌用词精炼,导致词汇表较小但组合方式复杂
- 结构约束:需要处理平仄、对仗等传统诗歌特有的结构特征
- 语义连贯性:短文本中保持意境连贯比长文本更困难
- 评估困难:传统评估指标如 BLEU 难以准确衡量诗歌质量
数据预处理
处理 Chinese-Poetry 数据集的关键步骤:
- 数据清洗:去除残缺诗歌和现代注释,保留原始文本
- 分词处理:使用 jieba 分词并添加特殊标记表示诗句边界
- 构建词汇表:统计词频,过滤低频词(出现次数 <5)
- 向量化表示:将分词结果转换为词索引序列
- 数据增强:通过调换诗句顺序创造更多训练样本
# 示例:数据预处理核心代码
import jieba
from collections import Counter
# 加载原始数据
def load_poems(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if len(line) > 10]
# 分词和构建词汇表
def build_vocab(poems, min_count=5):
word_counts = Counter()
for poem in poems:
words = jieba.lcut(poem)
word_counts.update(words)
vocab = {'<PAD>':0, '<UNK>':1, '<START>':2, '<END>':3}
idx = 4
for word, count in word_counts.items():
if count >= min_count:
vocab[word] = idx
idx += 1
return vocab
模型架构选择
我们对比了三种常见 GAN 架构在诗歌生成任务中的表现:
- Vanilla GAN:基础架构,生成效果不稳定
- DCGAN:使用卷积层,适合局部特征捕捉
- SeqGAN:结合强化学习,在序列生成上表现优异
实验表明,针对中文诗歌生成,改进版的 SeqGAN 效果最佳。我们在生成器中采用双向 LSTM 捕捉上下文关系,判别器使用 CNN 提取 n -gram 特征。
核心代码实现
以下是生成器的 PyTorch 实现关键部分:
import torch
import torch.nn as nn
class PoetryGenerator(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim, bidirectional=True)
self.linear = nn.Linear(hidden_dim*2, vocab_size)
def forward(self, x, hidden=None):
# x: (seq_len, batch_size)
embedded = self.embedding(x) # (seq_len, batch_size, embedding_dim)
output, hidden = self.lstm(embedded, hidden)
logits = self.linear(output) # (seq_len, batch_size, vocab_size)
return logits, hidden
训练技巧
提高 GAN 训练稳定性的实用方法:
- 渐进式训练:先训练短诗,逐步增加长度
- 标签平滑:判别器目标标签使用 0.9/0.1 代替 1 /0
- 梯度惩罚:使用 WGAN-GP 避免梯度消失
- 课程学习:按难度分级训练样本
- 温度采样:在推理时调整 softmax 温度控制创造性
评估与优化
除了传统指标,我们设计了诗歌特有的评估方法:
- 格律符合度:检查平仄和押韵规则
- 意境连贯性:人工评估诗句间关联
- 新颖性:统计生成结果的 n -gram 重复率
优化策略示例:
# 自定义损失函数加入押韵约束
def rhyme_aware_loss(predictions, targets, rhyme_indices):
ce_loss = F.cross_entropy(predictions, targets)
rhyme_loss = 0
for idx in rhyme_indices:
rhyme_loss += F.mse_loss(predictions[idx], predictions[-1])
return ce_loss + 0.3 * rhyme_loss
常见问题解决
- 模式崩溃:使用 Mini-batch 判别
- 梯度不稳定:采用梯度裁剪
- 生成重复:增加多样性惩罚项
- 训练震荡:动态调整学习率
生成效果展示
经过 50 个 epoch 训练后,模型生成的示例:
输入主题:春天
生成结果:春风拂面柳丝长,燕子归来寻旧梁。花落庭前人不扫,满园香气入衣裳。
进一步思考
- 如何将现代诗歌风格融入古典诗歌生成?
- 能否结合图像生成题画诗?
- 用户反馈如何用于持续改进模型?
希望这篇指南能帮助你构建自己的诗歌生成系统。在实际应用中,不妨尝试结合用户交互,创造更有趣的诗歌创作体验。
正文完
发表至: 未分类
近两天内
