【NLP】自然语言项目设计04

发布于:2025-06-30 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

04模型验证

代码架构核心设计说明

05运行推理

代码架构核心设计说明

项目展望


项目简介
训练一个模型,实现歌词仿写生成

任务类型:文本生成;

数据集是一份歌词语料,训练一个模型仿写歌词。

要求
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来实现个性化的歌词生成!