目录
项目简介
训练一个模型,实现歌词仿写生成
任务类型:文本生成;
数据集是一份歌词语料,训练一个模型仿写歌词。
要求
1.清洗数据。歌词语料中包含韩文等非中英文符号,可对语料做预处理,仅保留中英文与标点符号;
2.训练模型、生成歌词;
3.用Gradio网页展示生成的歌词;
需要考虑的问题
1.使用语料数据集csv:lyric.csv,不用到数据库;
2.硬件使用的gpu是5g的n卡,比较有限,项目本身数据量和模型参数规模都不是特别大;
3.使用tensorflow2.9.1gpu版本的框架进行构建;
4.使用的网络架构,以及每个部分的组件网络、骨干网络等,优先在各个环节选用目前的sota模型;
5.在模型训练过程中要使用tensorboard可视化训练过程;6.对于数据的处理,先对csv进行必要的可视化,然后进行多语言歌词清洗(可参考的步骤:多语言过滤、特殊格式处理、分词策略、序列对齐、同义词替换、句式重组等);7.项目构建严格规范文件架构,做到一个脚本做一个环节(数据预处理脚本、模型构建脚本、训练、测试、推理等等);
04模型验证
对nlp领域的模型验证,我们通常会采用到BLEU,对于这个函数前面有进行简要说明
终端执行
python scripts/04_model_evaluation.py
代码架构核心设计说明
脚本运行架构
评估指标体系:
困惑度 (Perplexity):衡量模型对语言的预测能力,越低表示预测越准确
BLEU 分数:评估生成文本与参考文本的 n-gram 匹配度
生成多样性:包括唯一生成比例和词汇多样性,避免模型生成重复内容
语义连贯性:基于相邻句子词汇重叠的简单语义评估
评估流程控制:
资源统一加载:模型、分词器、配置、测试数据
多维度评估:从多个角度全面衡量模型性能
结果可视化:将评估指标转化为图表便于理解
报告生成:自动生成 Markdown 格式评估报告
生成策略支持:
温度采样 (temperature):控制生成随机性
Top-k 采样:限制候选词范围,提升生成质量
种子文本生成:基于不同主题生成样本
工程化设计:
模块化方法:每个评估指标独立成方法,便于维护
结果持久化:保存评估结果、图表和报告
错误处理:各方法包含异常处理逻辑
# 歌词生成模型评估系统架构
# 1. 核心评估类:LyricModelEvaluator
class LyricModelEvaluator:
成员变量:
- model_path: 模型文件路径
- model: 加载的Keras模型
- tokenizer: 分词器
- config: 模型配置
- test_texts: 测试文本数据
# 初始化与资源加载
方法 __init__(model_path):
设置模型路径
调用load_resources()加载模型、分词器、配置和测试数据
方法 load_resources():
加载Keras模型
加载分词器(pickle)
加载配置文件(json)
加载测试数据(npy)
# 核心评估指标计算
方法 calculate_perplexity(texts, max_samples):
计算模型困惑度(perplexity)
限制样本数量以优化计算
对每个序列计算对数概率并求平均
返回困惑度值
方法 generate_sample_lyrics(seed_text, max_length, temperature, top_k):
基于种子文本生成歌词
使用模型预测下一个词
支持温度采样和Top-k采样策略
返回生成的歌词文本
方法 calculate_bleu_scores(num_samples):
计算BLEU-1/2/4分数
从测试文本中随机采样
用前半部分生成、后半部分作为参考
返回BLEU分数均值和标准差
方法 analyze_generation_diversity(num_generations, seed_texts):
分析生成多样性
使用不同种子和温度生成歌词
计算唯一生成比例和词汇多样性
返回多样性指标和所有生成样本
方法 evaluate_semantic_coherence(generations):
评估语义连贯性(简化版)
基于相邻句子的词汇重叠率
返回平均连贯性分数
# 结果展示与报告生成
方法 generate_evaluation_samples(num_samples):
生成评估用的样本歌词
使用不同种子和温度参数
返回生成样本列表
方法 plot_evaluation_results(results):
可视化评估结果
绘制BLEU分数、多样性等指标图表
保存并显示图表
方法 generate_evaluation_report(results):
生成Markdown格式评估报告
汇总所有评估指标和生成样本
保存报告到文件
方法 run_full_evaluation():
执行完整评估流程
计算困惑度、BLEU、多样性等指标
生成样本和可视化结果
保存结果和报告
返回评估结果字典
# 2. 程序入口
if __name__ == "__main__":
创建日志目录
初始化LyricModelEvaluator实例
调用run_full_evaluation()执行评估
打印完成信息及结果文件路径
进行验证
相关tensorboard在‘03模型构建’中有做说明,便不再赘述,进入logs目录
tensorboard --logdir="C:\Users\user\Desktop\nlp\logs\tensorboard\train"
生成验证数据
05运行推理
终端执行
python scripts/05_gradio_app.py
代码架构核心设计说明
脚本运行架构
模块化分层设计:
模型层:负责加载和使用深度学习模型生成歌词
处理层:包含文本预处理、后处理和参数调整逻辑
界面层:使用 Gradio 构建交互式 Web 界面
历史层:记录生成历史和参数,便于追溯
生成算法核心:
增量生成:基于种子文本逐步预测下一个词
可调采样策略:
温度参数(temperature)控制随机性(低→保守,高→创意)
Top-k 采样限制候选词范围,提升生成质量
停止机制:遇到 padding token 或达到最大长度时终止
用户交互优化:
预设模式:提供 "保守创作" 到 "自由创作" 的预设参数组合
实时反馈:显示生成参数和时间信息
多样本生成:支持同时生成多个版本歌词
结果格式化:自动添加标点和换行,提升可读性
工程化设计:
资源检查:启动时验证模型和配置文件存在性
异常处理:捕获加载和生成过程中的异常
历史记录:保存生成参数和结果到 JSON 文件
性能优化:限制生成长度和样本数量,适配资源约束
# AI歌词生成应用架构(Gradio界面版)
# 1. 核心应用类:LyricGeneratorApp
class LyricGeneratorApp:
成员变量:
- model_path: 模型文件路径
- model: 加载的Keras模型
- tokenizer: 分词器
- config: 模型配置
- seq_len: 模型输入序列长度
- generation_history: 生成历史记录
# 初始化与资源加载
方法 __init__(model_path):
设置模型路径
调用load_model_and_resources()加载模型、分词器、配置
初始化生成历史记录
方法 load_model_and_resources():
加载Keras模型文件
从pickle文件加载分词器
从json文件加载配置
提取模型输入序列长度
处理加载过程中的异常
# 文本处理模块
方法 preprocess_seed_text(seed_text):
清理输入文本(移除特殊字符)
使用jieba分词
返回分词后的tokens列表
方法 postprocess_generated_text(text):
清理重复词语
调用add_punctuation_and_breaks添加标点和换行
返回格式化后的文本
方法 add_punctuation_and_breaks(text):
按词数添加逗号/句号
按词数添加换行
返回格式化后的文本
# 歌词生成核心模块
方法 generate_lyrics(seed_text, max_length, temperature, top_k, num_samples):
预处理种子文本
对每个样本执行:
将种子文本转换为token序列
循环生成max_length步:
填充序列到模型要求的长度
使用模型预测下一个词的概率分布
应用温度参数调整概率分布
使用Top-k采样选择下一个词
停止条件:遇到padding token或达到最大长度
将生成的token序列转换为文本
返回生成的歌词列表
# 历史记录模块
方法 save_generation_history(seed_text, parameters, generated_text):
构建历史记录条目(时间戳、参数、结果)
添加到内存中的历史记录
保存到json文件
# 界面构建模块
方法 create_gradio_interface():
创建Gradio界面实例
添加标题和说明Markdown
定义输入区域:
种子文本输入框
创作模式下拉菜单
高级参数滑块(最大长度、温度、Top-k、样本数)
定义输出区域:
生成歌词文本框
生成信息文本框
绑定事件:
创作模式改变时更新参数滑块
点击生成按钮时调用generate_and_display
添加示例输入
添加页脚说明
返回界面实例
方法 generate_and_display(seed_text, max_length, temperature, top_k, num_samples):
验证和调整参数
调用generate_lyrics生成歌词
格式化输出结果
保存生成历史
返回生成结果和参数信息
# 应用启动模块
方法 launch_app(share, debug, server_port):
检查模型是否加载
创建Gradio界面
启动界面服务
# 2. 程序入口
def main():
检查必要文件是否存在(模型、分词器、配置)
若文件缺失,提示用户先运行数据预处理和模型训练脚本
否则:
创建LyricGeneratorApp实例
启动应用(设置端口、共享选项等)
处理键盘中断和异常
# 3. 交互流程概览
用户输入种子文本 → 预处理 → 模型生成歌词 → 后处理格式化 → 显示结果 → 保存历史记录
运行应用网站
注意,要在浏览器输入:http://localhost:7860
演示效果(图片、视频)
项目展望
现阶段,项目的架构流程已经跑通,接下来重点要做的是模型调优,以及优化前段展示等工作,希望基于本项目,可以带动大家学习人工智能NLP领域的兴趣和积极性,一起完善、共建这个项目,开发一个app来实现个性化的歌词生成!