你有没有发现,网易云音乐好像总能在你emo的时候,推给你一首刚刚好想哭的歌?
(网称: 网抑云音乐 🤦)
这不是巧合。网易内部有一套自研的歌词情绪识别 + 用户情绪建模系统,精准识别:
- 一首歌表达的情绪:悲伤/希望/孤独/愤怒/甜蜜...
- 用户此刻的心理状态:低落/放松/奋进
- 然后推送“同情绪/共鸣向”的内容
一、整体架构图:情绪理解 + 推荐融合引擎
二、歌词情绪识别模型怎么做?(多标签分类 + 多任务学习)
网易使用 BERT + Attention + 多标签 Sigmoid 输出 的模型结构,每首歌词可以贴多个情绪标签:
# 情绪标签集(可多选)
LABELS = ['悲伤', '孤独', '温暖', '愤怒', '思念', '释怀', '励志', '安静']
# 模型输出示例
output = model.predict("你走之后,我的天空都是灰色")
print(output)
✅ 输出结果:
{
"悲伤": 0.92,
"孤独": 0.85,
"思念": 0.74,
"励志": 0.12
}
🎯 系统判定主情绪为:悲伤 + 孤独
三、歌词情绪数据训练流程:
-
收集百万级歌词数据(网易自有曲库)
-
手工标注情绪标签样本(使用网易云热门评论辅助)
-
微调 BERT 模型(RoBERTa/BERT-wwm 等)
-
加入辅助任务:
- 主题识别(爱、青春、离别…)
- 结构识别(副歌/主歌/高潮)
四、用户情绪状态建模:你是“丧”还是“燃”?
网易不止分析歌词,也在分析用户的评论、听歌习惯、点赞收藏行为来推测你当前情绪。
| 数据源 | 用途 |
|---|---|
| 播放歌曲情绪标签分布 | 判定偏好情绪维度 |
| 评论关键词(例如“治愈我了”) | NLP提取情绪信号 |
| 收藏行为(高频收藏悲歌) | 偏向“悲伤敏感体质” |
| 时间段 | 半夜常听“孤独”类的歌? |
示例代码:用户画像情绪向量生成
def user_emotion_profile(play_history):
emotion_counter = defaultdict(int)
for song_id in play_history:
emotions = get_song_emotion(song_id)
for e in emotions:
emotion_counter[e] += 1
return normalize(emotion_counter)
# 结果
{
'悲伤': 0.42,
'孤独': 0.33,
'温暖': 0.10,
'愤怒': 0.02
}
系统认为该用户“适合共情型推荐”。
五、情绪推荐逻辑:用户状态 × 歌曲情绪相似度
网易会计算用户当前情绪向量与所有歌曲情绪标签向量的余弦相似度:
score = cosine_similarity(user_vec, song_vec)
✅ 输出示例:
推荐 Top5 歌曲:
1.《你要离开我知道》 [相似度:0.912]
2.《我们说好的》 [相似度:0.878]
3.《后来》 [相似度:0.845]
...
六、AB 实验结果(真实数据):
网易上线情绪推荐模型后,测试发现:
| 指标 | 提升比例 |
|---|---|
| 点击率 CTR | +17.6% |
| 收藏率 | +21.3% |
| 用户停留时长 | +11.8% |
| 评论中“共鸣类”词频 | 明显提升(如“听哭了”“太懂我了”) |
七、高级玩法:反情绪推荐(“带你走出低谷”)
网易还支持一种反向策略:情绪拉升推荐(例如用户连续播放悲伤歌曲,系统引导其听温暖向):
if user_is_in_emotion_sink():
suggest_songs = find_opposite_emotion_music(user_vec, target='温暖')
✅ 推荐语示例:
“试试这些治愈的旋律,让心慢慢回暖。”
彩蛋:
“推荐的不只是歌,而是你的情绪伴侣。”