本项目一共分析了 459 首不重复的歌曲,歌手与网易歌单ID分别为:
- 红花会: 799977314
- PGone : 447516565
- VaVa : 808488091
- 艾福杰尼: 510860563
- BooM黄旭: 714593343
- Bridge: 639741735
- GAI爷: 557229147
- TizzyT: 462399965
- JonyJ: 49527655
- 小青龙:808976784
- 辉子: 714778058
- 孙八一:776141176
- 谢帝: 55433749
- 马思维: 155059572
- Mc光光:126482980
- 满舒克:110228333
以上 ID 为手动在网易云上查找获取。
分析过后共产生了 21206 个词汇 以及 2845 个韵脚
settings.py
一些通用的设置,涵盖了数据库名 歌单ID 最后的产出文件名
models.py
数据库设置文件 使用 peewee 建立需要的表和字段
rhyme_index.py
包含预设的韵脚
spider.py
爬歌词文件,分两部进行
- 爬取每个歌单内歌曲名 ID
- 爬取每个歌曲歌词 保存到数据库
analysis.py
分析歌词
- 逐行导入歌词
- 使用 jieba 切割歌词为词汇,同时也取每行歌词后两词添加到歌词中
- 使用 rhyme_index 文件中的预设韵脚匹配词汇
- 匹配后保存到数据库
extract.py
根据韵脚提取押韵词汇,集合到一个 txt 文件中
utils.py
调试阶段使用的工具函数
rhymewords-2.txt/ rhymewords-3.txt 分别包含双押以及三押以上词汇 words-frequency-n.txt / words-frequency-v.txt 分别为名词以及动词词频排行榜
自定义分析歌词,可以按照以下顺序运行
- 自定义 settings.py 中的设置
- 运行 spider.py 文件
- 运行 analysis.py 文件
- 运行 extract.py 文件
到此,可到当前文件夹下查看生成的 txt 文件, analysis.py 的运行时间可能稍长,耐心等待. 注意: 如果需对歌词重新分析,只需运行 utils.py 文件即可,该文件会删除现有的分析结果,但不会删除已经下载的歌词.
1、请求网易云 api 接口
本项目使用到了歌单接口,以及歌词接口,使用方法如下:
请求歌单
分别去请求我们手动获取的歌单 ID, 得到歌单内所有歌曲的 ID
import requests
# 实际使用时修改歌单 id 即可
url = 'http://music.163.com/api/playlist/detail?id=402614161'
req = requests.get(url)
data = req.json()
print(data)
请求 歌词
从上一步请求歌单的结果中可以提取歌单内所以歌曲的ID,继续请求获取歌词
import requests
# 实际使用时修改歌曲 id 即可
url = 'http://music.163.com/api/song/lyric?os=pc&id=411988938&lv=-1&kv=-1&tv=-1'
req = requests.get(url)
data = req.json()
print(data)
2、peewee 处理数据库部分
如果你也厌倦了写原生的 sql 语句,在简单的项目中, 使用 peewee 是较好的选择.
简单的建表流程如下
from peewee import *
db = SqliteDatabase('peewee.db')
# 歌词
class Lrc(Model):
# 音乐ID
music_id = IntegerField()
# 音乐名
music_name = CharField()
# 歌手
singer = CharField()
# 歌词
lrc = TextField()
class Meta:
database = db
db.connect()
db.create_tables([Lrc])
运行以上代码就在 peewee.db 数据库文件中建立好了一张表.更详细的用法参考文档,以及本项目中的代码
3 jieba 分词处理
jieba 是一个非常好用的中文分词库,简单的示例代码如下
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
'''
结果:
【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
【精确模式】: 我/ 来到/ 北京/ 清华大学
'''
4 xpinyin 转换文字为拼音
点我:官方文档 xpinyin 是一个中文文字拼音转换库,使用方法如下
>>> from xpinyin import Pinyin
>>> p = Pinyin()
>>> # default splitter is `-`
>>> p.get_pinyin(u"上海")
'shang-hai'