ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

中文歌词语料库ChineseLyrics:NLP数据构建与实验实战

2026/9/8 5:01:32 拓冰建站 浏览量
中文歌词语料库ChineseLyrics:NLP数据构建与实验实战 简介这是一份面向自然语言处理与数据分析场景的中文歌词数据集适合自然语言处理研究者、文本挖掘爱好者及相关领域开发者用于词频统计、押韵分析、歌手风格对比、情感分析等任务。压缩包共6个文件以5个JSON数据文件与1个Markdown说明文档组成容量仅34.15MB结构清晰每个JSON条目均包含歌名、歌手、歌词三字段便于程序直接读取。数据集收录4019位歌手在2019年之前的102197首歌曲平均每人25.4首并按歌手聚类、按作品数降序排列同时提供词频排序、句子开头词语排序及基于拼音统计的押韵表能直接用于语料构建、文本生成或音乐文本分析实验。目前已有1065人学习/下载对入门歌词语料研究或需要快速获取大规模中文文本数据的朋友来说性价比高、实用性强。 做中文NLP项目的人手头一定都攒了不少数据集。新闻、微博、评论我都折腾过但真正让我觉得“顺手”的反而是一套从歌词入手的中文语料库——ChineseLyrics中文歌词数据库。它解决的不只是“没数据可用”的问题更让我在情感分析、文本生成这些任务上第一次跑通了完整链路。这套数据集的定位很明确把中文歌词和歌曲元信息整理成结构化的干净文本供NLP自然语言处理任务直接使用。比起动辄几个TB的通用语料歌词这种中短文本有情绪更浓、句式更灵活、标注信息更丰富的特点特别适合做情感分析、文本分类、风格迁移和歌词生成实验。这篇文章会从数据处理、字段设计到底层踩坑把整个项目摊开讲一遍。如果你准备做中文文本挖掘又不想一直用新闻语料凑合这篇内容应该能帮你省下不少时间。1. 项目定位ChineseLyrics到底是个什么样的数据集1.1 为什么选歌词而不是新闻或微博最开始我也走了弯路直接拿新闻语料跑模型后来发现新闻写得太“规矩”了句式完整、用词标准模型学出来的表达一板一眼。换到歌词之后整个情感特征一下子丰富起来生成任务也变得有意思得多。歌词本身有几个天然优势情感密度高几乎每一句都带着明确情绪倾向非常适合做情感分类和情绪分析。文本长度适中平均在几十到几百字之间既不会像长文那样处理耗时又比短评论更有上下文信息。自带丰富元数据比如歌手、专辑、发行时间、曲风这些字段天然就是多标签分类的良好标注来源。口语化与书面语混合有叠词、倒装、语气词、哲理句语料多样性明显能让模型见到更多真实表达。歌词数据还有一个很多通用语料不具备的特性韵律。歌词本身是押韵的短文本训练出的模型在生成任务里更容易输出节奏感强的句子这一点对文本生成实验非常加分。1.2 适用人群和适用场景这个数据集不是做一个完整产品而是定位成“AI训练和文本分析用的中文资源”。所以更适合这几类人刚入门NLP的学生或开发者需要一个规模适中、容易处理的中文语料。做情感分析、文本分类研究的算法工程师想找一个新闻和微博之外的差异化数据源。做音乐相关应用的团队比如歌词检索、歌手风格分析、歌曲相似度推荐。对文本生成感兴趣的人用歌词训练写词模型或者做风格模仿实验。当然也要说清楚局限性。歌词本质上是一种半创作化的文体不是严格意义上的日常口语用它训练对话系统显然不合适做意图识别也有点浪费。它的优势集中在情绪理解、风格建模、创作生成这些方向。明确这一点后面所有实验才不会跑偏。2. 数据构建全流程从爬虫到清洗2.1 采集策略别让爬虫成为风险点数据来源部分很多人第一反应是去爬各种歌词站点。这个思路没问题但一定要控制好节奏。我的做法是先找一个公开的歌词聚合平台确认页面结构稳定之后再设计采集逻辑。不推荐一上来就全站扫数据而是按歌手或专辑ID分批拉取。每首歌的信息包括歌名、歌手、专辑、作词作曲、发行日期、歌词正文。为了方便断点续采每抓到一条就写一行JSON到本地文件而不是等所有请求结束再统一保存。import json import random import time def fetch_lyrics(song_id): # 每次请求之间做随机延时降低对方服务器压力 time.sleep(random.uniform(0.5, 1.5)) # 这里省略具体请求和解析逻辑 data { song_id: song_id, title: ..., artist: ..., lyrics: ... } return data with open(raw_lyrics.jsonl, a, encodingutf-8) as f: for sid in song_id_list: item fetch_lyrics(sid) f.write(json.dumps(item, ensure_asciiFalse) \n)采集过程中最容易忽略的是异常处理。网络波动、页面结构变化、接口限流都会导致单条失败所以我会把失败的song_id记录下来全部跑完后统一重试。同时要设置合理的请求头和User-Agent不要让自己暴露成典型的爬虫特征。提示爬虫只能用于个人学习和研究必须遵守目标网站的robots协议和服务条款。歌词文本大多有版权完整数据不建议直接打包公开。后面我会专门讲版权边界。2.2 清洗和去重保数据质量的核心环节原始数据拿到手之后问题相当多。第一个问题是“空歌词”有些歌曲页只有一句“暂无歌词”或者只有纯音乐标记。第二个问题是“翻译版本”同一首歌可能同时收录中文原版和英文翻译版对NLP实验来说会造成标签噪声。我的清洗流程分为四步剔除非法记录包括空歌词、缺失歌名、歌曲时长异常的数据。统一编码把所有文本转为UTF-8去除不可见字符和多余空白。删除明显的垃圾行比如“作曲”“作词”“制作人”等歌曲信息标注保留歌词正文。去重先用MD5做完全匹配再用文本相似度处理“同曲不同版本”的问题。这里重点说一下相似度去重。不同网页的排版会导致同一段歌词中间多了个空格或换行MD5完全匹配查不出来。我采用了一个简单的方案对歌词做分词取词集合的杰卡德相似度大于0.9就视为重复。这个阈值在实测中对翻唱、Live版和录音室版的判断很准。def jaccard_similarity(text_a, text_b): set_a set(jieba.lcut(text_a)) set_b set(jieba.lcut(text_b)) intersection len(set_a set_b) union len(set_a | set_b) return intersection / union if union else 02.3 简繁转换、分词与标注经验中文语料一定逃不开简繁问题。歌词站的数据很多来自港台渠道繁体比例不低。我直接用OpenCC把繁体统一转成简体同时保留原始文本到一个单独字段后续做繁体语料实验时还能用上。分词是中文NLP的老祖宗问题。我默认用jieba但不会直接裸跑。歌词里有大量歌手名、歌曲名、古风词汇比如“烬”“长庚”“斟”这些词很容易被拆碎。我的做法是让jieba支持自定义词典把歌手列表、专辑列表和常见歌词术语加进去。更关键的是歌词里的语气词和叠词。“啊”“喔”“啦”“呜呜”这些词对情感分析有影响但不大对分词却会造成大量无效token。我的经验是保留它们但在字段上打标比如用interjection占位等真正做语义分析时可以选择性丢弃。歌词的反复结构也很麻烦副歌部分会完整重复好几遍训练生成模型时反而让模型学会“复读机”这一点我在生成章节会继续展开。3. 数据集结构与使用方式3.1 核心字段和格式设计数据集最初是我自用的结构很随意后来发现不同模型需要不同字段才开始认真设计格式。现在的稳定版使用JSON行格式一行一首歌字段如下字段名类型说明lyrics_idstring歌曲唯一IDtitlestring歌曲名artiststring歌手或乐队albumstring专辑名称release_datestring发行日期languagestring语种多数为中文genrestring曲风标签lyriciststring作词人composerstring作曲人lyricstext清洗后的歌词正文raw_lyricstext原始歌词source_urlstring数据来源链接字段设计有两点值得解释。一是lyrics和raw_lyrics分开存这样数据清洗流程可追溯后面发现清洗逻辑有问题时不需要重新爬。二是保留lyricist和composer歌词风格和作词人高度相关做风格迁移实验时这两个字段非常有用。3.2 数据规模与质量指标我本地维护的版本目前大约有20万首歌曲经过清洗和去重后保留下来13万首左右文本总量约1.5GB。这个规模对深度学习来说不算大但做情感分析、主题分类和风格模型的实验足够了。质量指标上我主要看三个数字字段完整率一首歌的标题、歌手、歌词必须都在完整率保持在98%以上。去重率清洗前后减少的样本比例我的在35%左右说明原始数据重复非常严重。人工抽检通过率每批次随机抽200条由人工判断歌词与歌手是否匹配、内容是否完整通过率通常要求不低于95%。歌词数据的分布天然不均衡老歌和流行情歌数量占大头古风和民谣相对少。做分类任务时要注意这一点否则模型会对高频风格产生偏见后面我在实验章节会给出应对方式。3.3 加载数据的参考代码数据集使用起来很简单一个脚本就能完成加载和基础统计。下面是我常用的加载方式import json import pandas as pd with open(chinese_lyrics.jsonl, r, encodingutf-8) as f: lines [json.loads(line) for line in f if line.strip()] df pd.DataFrame(lines) print(df.shape) print(df[genre].value_counts().head(10)) print(df.iloc[0][lyrics][:200])加载过程中最容易遇到的坑是字段里混入异常类型。比如某个版本把release_date解析成了数字或者genre出现了空值。建议读取后先跑一遍df.info()确认字段类型符合预期再进入建模阶段这个习惯帮我省过很多次返工。4. 基于该数据的NLP实验记录4.1 情感分析歌词的情绪分布先用歌词做情感分析是最自然的想法。我最初用SnowNLP直接打分发现处理歌词时问题很多。SnowNLP的训练语料偏向评论对歌词这种有韵律的短文本经常给出偏中性的分数哪怕是“我爱你爱得心碎”这种句子也只能拿到0.55。于是我自己标注了一批训练数据。从数据集中随机抽取5000首按整首歌的情感倾向标记为积极、中性和消极人工标注后训了一个fastText分类器做baseline测试集上的F1大概在0.72。换成中文预训练模型之后F1提到0.84左右提升非常明显。这里有一个关键经验歌词的情感往往不是单标签一首歌可能前半段悲伤后半段释然整首标记成“消极”会丢失细节。如果做更细的情绪分析把歌词按段落或句子切分再标注会更合理。4.2 歌词主题分类如何定义标签主题分类比情感分析更细。我把歌词分成情歌、励志、古风、民谣、电子、说唱等标签允许一首歌同时属于多个类别所以这是个多标签分类任务。基线模型选的是TF-IDF加SVM对短文本来说效果还不错。后来换成TextCNN窗口大小设为3、4、5分类效果稳定提升。训练时要注意样本不均衡电子和说唱类样本少我用过采样和类权重两种方式类权重更省事。歌词主题分类和普通文本分类有一点不同很多类别是靠标志性词汇撑起来的比如“武侠”“江湖”大多出现在古风歌里“梦想”“奔跑”出现在励志歌里。为了避免模型只记住关键词我会在预处理阶段把歌名、歌手名这些强特征去掉一部分强制模型去学真正的语义结构而不只是记住标题。4.3 歌词生成与风格复制最后说说最有意思的歌词生成。中文歌词生成常见的做法有两种一种是用马尔可夫链一阶随机转移另一种是用预训练模型微调。马尔可夫链简单、快、不依赖GPU但生成的句子前后逻辑很弱。我试过用3-gram马尔可夫链输出经常是“月光 / 泪光 / 时光”堆叠只适合做灵感拼接。微调方案我选择了中文版的GPT模型把“歌名 歌手 曲风”作为前缀后面接歌词正文。训练以后生成的歌词确实能模仿特定歌手的措辞习惯但很容易出现整段重复尤其副歌部分模型会反复输出同一句话。解决这个问题有几个有效手段训练时去除副歌重复段落只保留一遍。生成时开启重复惩罚参数把重复n-gram的分数压低。降低学习率歌词语料数量少微调步子太大会很快过拟合。我的实测结果里单首歌歌词作为训练样本太短效果不稳定。好的做法是把同一歌手的多首歌曲拼在一起用分隔符标记让模型学会跨歌曲的风格特征。歌词生成本身还没有黄金标准我自己主要看三个方面语法通顺度、主题相关性和押韵密度三者结合才能判断模型有没有学到东西。5. 实战中踩过的坑与排查方法5.1 版权与合规红线这是最重要的一条。歌词不是无主数据词曲版权通常归唱片公司或著作权人所有。很多公开网站允许浏览不代表你可以把全量打包分发。我的处理方式是数据集的完整版本仅本地使用不公开全量歌词文件。对外分享时只展示字段结构、样例文本和处理代码。如果别人想复现实验就提供一部分自制的模拟歌词或者直接引导对方去授权平台获取数据。千万不要因为打着“开源数据集”的旗号就把所有歌词一股脑传到公开仓库这是最容易踩的红线。5.2 高频数据质量问题数据清洗做得再细也还是会有漏网之鱼。我整理了经常遇到的问题同一首歌在不同网站上的作词人字段不一致有的写“佚名”有的写“未知”。专辑和发行日期不匹配尤其是翻唱版和Live版。歌词正文混入广告词比如“欢迎收藏本站”。繁体转简体后部分词义被错误转换比如“里”和“裡”在歌词里需要根据语境判断。面对这类问题我的经验是不要追求100%干净而是给每首歌增加一个quality_score字段由清洗规则自动打分。低分数据不删除但标记出来后续实验按质量过滤这样做比一刀切更灵活。5.3 常见问题速查表下面是一张我在项目过程中总结的FAQ表遇到类似问题可以直接对照处理问题可能原因解决方法分词结果太碎歌词含古风词和叠词添加自定义词典保留语气词标记情感分数普遍偏低预训练情感模型偏向评论语料重新标注训练数据或做分数校准生成歌词出现大量重复副歌重复训练样本过多去除重复段开启重复惩罚CSV读出来乱码字段中混入特殊字符统一UTF-8用enginepython读取去重率过高不同来源的歌词排版不同用杰卡德相似度代替MD5去重词云全是“爱情”“眼泪”语料情感特征过于集中按曲风分层抽样后再做可视化5.4 后续还能往哪个方向扩展ChineseLyrics这套数据目前已经能支撑不少常规NLP任务但我自己还在继续丰富它。目前在做的是给每首歌补充拼音和韵脚信息这对歌词生成和音乐检索都很有用。另一个方向是把歌词和音频特征对齐做一个真正多模态的歌曲理解数据集比如用音频段落对应的歌词做情感标签这样训练出来的模型会比单文本模型更接近真实场景。我自己的体会是做NLP数据集工程细节决定了你用起来顺不顺手。ChineseLyrics 这套歌词库从最早的两千首测试小道扩展到现在能直接支撑模型训练的规模中间踩过的坑基本都是数据质量坑。最后再提醒一句如果你也想做类似项目一定要在采集阶段就考虑版权边界别把公开爬取的内容当成无主内容使用。数据清洗、字段设计这些细节做得越扎实后面训练模型就越省心。本文还有配套的精品资源点击获取