我分析了2837首歌曲,做了个信息检索与信息抽取系统

我的简书地址,欢迎关注:

https://www.jianshu.com/u/524cf64f28b5

写在前面

首先,作者受到 《我分析了42万字的歌词,为了搞清楚民谣歌手们在唱些什么》 这篇文章的影响,加上自己也是一个音乐爱好者,所以决定做一个网易云热门歌手歌词信息检索与信息抽取系统。

通过爬取 网易云音乐 60位热门歌手,每位歌手50首左右的热门歌词。根据输入的关键字,检索出相关性最高的10首歌,并能够从歌曲中抽取出歌名、演唱、作词、作曲、季节、情绪、个性化标签等结构化信息。

实现思路(非技术人员可以跳过此小节)

(1) 爬取歌词信息,生成文档数据集;
(2) 对所有文档进行分词处理;
(3) 构造“词-文档流”倒排索引;
(4) 利用向量空间模型技术,检索出相关度排名前十的歌曲;
(5) 分析歌词数据,从歌词中抽取出有效的结构化信息;
(6) 搭建B/S系统,进行结果展示。

流程图

实现环境(非技术人员可以跳过此小节)

(1)操作系统:Windows10 x64
(2)后端:Anaconda3(64-bit),Python3.6,Flask框架
(3)前端:HTML,CSS,JavaScript,JQuery,BootStrasp,Chrome

好了,进入正题,预备,开始……

我把目标锁定在网易云音乐热门的华语男歌手、华语女歌手以及华语组合/乐队,每一类爬取20个热门歌手,这样我就有了60位歌手的信息。
网易云歌手 爬取的歌手个人信息

有了歌手信息,我就可以爬取歌手的歌曲了,每个歌手大概都可以爬取50首左右,因此最终我获得了2837首歌曲。
爬取歌词过程 结果1
结果2
我们以周杰伦的歌曲为例,看一下爬取的结果。
周杰伦歌曲 告白气球

有了这些数据,按照实现思路,就可以搭建信息检索与信息抽取系统了。(非技术人员可以跳过此小节)

(1)使用“jieba”中文分词库对歌词数据进行分词处理;
(2)计算每首歌词中每个词的TF-IDF值,构建字典集;
(3)在用户输入后,构建查询向量,利用向量空间模型,计算查询向量和文档向量的相似度,取排序前十名的歌曲;
(4)进行结构化信息抽取,抽取出歌曲的歌名、演唱、作曲、作词、季节、情绪,个性化标签;
(5)搭建B/S展示系统,在web端接收用户输入,并将检索和抽取结果在web端显示,使用Flask进行前端和Python后端数据交互。

网易云热门歌手歌词信息检索与信息抽取系统

展示系统做的有些简单,欢迎各位吐槽。首先,进入主界面:
主界面

我们在检索框中输入想要检索的内容。比如,我们输入“确认过眼神,才能够遇到对的人”,点击检索一下,就可以得到检索结果:
检索结果
如图,检索框那一行显示的是检索时间为2.4秒,下面列出按相似度得分从大到小排序的前10篇歌词文档,包括排名、歌曲名、演唱歌手以及相似度得分。同时,每一个歌曲名是一个链接,可以点击。

以点击排名第一的歌词文档《醉赤壁》链接为例,跳转链接:
醉赤壁
左侧显示的是《醉赤壁》这首歌的歌词内容,右侧显示的是抽取的结构化信息。

观察左侧的歌词:
醉赤壁歌词
这些红色框中的歌词“确认过眼神 我遇上对的人”与我们的输入“确认过眼神,才能够遇到对的人”不完全相同,但还是检索了出来,说明与我们想要检索的内容相关性较高。

观察右侧抽取的结构化信息:
醉赤壁抽取的结构化信息
我们发现,歌词中并没有出现有关“秋天”的字样,但是还是提取出了季节为秋天这个信息。而《醉赤壁》这首歌描述的正是秋天的景象,这说明我们系统有较强的信息抽取能力。同时,我们给这首歌计算了一个情绪值,为-4,表示这首歌是有点负面的。通过对歌词的分析,发现这首歌的气氛是比较凄凉的,所以我们的抽取还是很准确的。但是,在抽取个性化标签时,第一个标签“情极”貌似不是一个词。当然,这个取决于“jieba”中文分词库,它把“情极”作为了一个词。因为它在这首歌的出现率还是很高的,所以作为了个性化标签。如果分词的结果更准确一些,我们的提取也将更准确。

总结

本次分析使用了一些机器学习及自然语言处理(NLP)的知识。由于本人是研究图像处理的,对NLP也是初次尝试,加之时间有限,做得稍微粗糙了一些,如有错误欢迎指正。

最后的最后,喜欢的可以加一波关注哦~
### 如何用Python实现歌曲节奏检测识别 #### 方法概述 为了实现歌曲节奏的检测识别,可以利用音频处理库来分析音乐文件中的节拍特征。通常的法是从音频数据中提取出时间域和频率域的信息,并通过特定算法计算出BPM(每分钟节拍数),进而判断音乐的速度感。 #### 使用PyDub预处理音频文件 `pydub` 是一个易于使用的音频处理包,在读取不同格式的声音文件方面非常方便。它允许开发者轻松加载各种类型的音频文件并转换成适合进一步处理的形式。 ```python from pydub import AudioSegment audio = AudioSegment.from_file("song.mp3", format="mp3") samples = audio.get_array_of_samples() ``` #### 利用Librosa进行特征提取 `librosa` 库提供了丰富的工具用于音乐信息检索任务,包括但不限于节奏估计、旋律跟踪等。对于节奏检测来说,可以从音频片段里抽取短期傅立叶变换 (STFT),再由其推导出瞬时频率轨迹;或者直接调用内置函数 `tempo()` 来获取 BPM 估值。 ```python import librosa y, sr = librosa.load('path_to_audiofile', sr=None) bpm, beats_frames = librosa.beat.beat_track(y=y, sr=sr) print(f'Track tempo: {bpm:.2f} BPM') ``` 上述代码展示了如何使用 Librosa 加载一首歌并将采样率设置为原始值 (`sr=None`) ,接着调用了 `beat_track()` 函数返回估算出来的 BPM 和对应的帧索引列表[^1]。 #### 结合Madmom提升精度 虽然 Librosa 已经很好用了,但是有时候还需要更精确的结果。这时就可以考虑引入专门针对音乐信号处理而开发的专业级开源项目 MadMom 。这个框架不仅支持多种输入形式(如numpy数组或wav文件路径),而且内部实现了许多先进的模型结构,比如 CRF 或 RNNs 网络架构,有助于提高预测性能。 ```python from madmom.features.tempo import TempoEstimationProcessor from madmom.models import TEMPO_RNN processor = TempoEstimationProcessor(fps=100) act = processor(TEMPO_RNN.process_online('your_song.wav')) tempi = act.argmax(-1).mean(axis=-1)[None] print(f'Estimated tempos with Madmom: {tempi}') ``` 这段脚本先创建了一个处理器实例,指定了输出的时间分辨率参数 fps ; 接着应用了训练好的RNN模型对给定曲目进行了在线处理; 最终打印出了平均后的多尺度速度向量作为最终结果[^3].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值