首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

人工智能写歌词?看我是如何用Python来C位出道的……

源/ 离岛

故事的起因是上周六看《中国好声音》,一个周杰伦战队的学员用人工智能写的歌词。

我们关注的是第三期清华博士宿涵改编了周杰伦的《止战之殇》和埃米纳姆的作品《Rap God》收获导师四转,重点是他用 AI 写词这事上了热搜。

宿涵在节目中介绍,他的《止战之殇》主歌歌词是由 AI 写成,当他给机器喂了“深渊、噩梦、绝望、战争”这些意象词后,AI 就重组了一首新词。虽然有人对 AI 写词缺乏逻辑和“人情味”表达了不屑,但宿涵认为 AI 会写出‘讽刺挂满美丽的太阳’这样的金句,这在体现反战主题的题材里还是很有深度的歌词。

于是乎,我也有了这个想法,代码的主题思路是看Crossin先生的文章,虽然最后不能写出一首歌,但是押韵脚这事情分分钟搞定了。

主题的思路,就是先抓取很多首歌曲的歌词,利用jieba分词后,将分好的词按照押韵表进行分类,最后匹配查询就可以了

准备一:押韵表

这个地方可以去网上搜押韵表

#引用各种需要的库

importrequests

importjieba

importre

fromxpinyinimportPinyin

p = Pinyin()

RhymeIndex = [('1', ['a','ia','ua']), ('2', ['ai','uai']), ('3', ['an','ian','uan']),

('4', ['ang','iang','uang']), ('5', ['ao','iao']), ('6', ['e','o','uo']), ('7', ['ei','ui']),

('8', ['en','in','un']), ('9', ['eng','ing','ong','iong']), ('10', ['er']), ('11', ['i']),

('12', ['ie','ye']), ('13', ['ou','iu']), ('14', ['u']), ('16', ['ue']), ('15', ['qu','xu','yu'])]

RhymeDct = {'ui':'7','uan':'3','ian':'3','iu':'13','en':'8','ue':'16','ing':'9','a':'1','ei':'7',

'eng':'9','uo':'6','ye':'12','in':'8','ou':'13','ao':'5','uang':'4','ong':'9','ang':'4',

'ai':'2','ua':'1','uai':'2','an':'3','iao':'5','ia':'1','ie':'12','iong':'9','i':'11',

'er':'10','e':'6','u':'14','un':'8','iang':'4','o':'6','qu':'15','xu':'15','yu':'15'}

准备二:分词对应押韵表编码

分好的词与押韵表对应起来,举个栗子,比如“没有”对应的是“7-13”,就等于你给每个词都贴了一个标签,这样你以后想搜索的时候,就可以根据标签找到这些词了。

def_analysis_words(words):

word_py =p.get_pinyin((u'{}'.format(words)))

lst_words = word_py.split('-')

r = []

foriinlst_words:

whileTrue:

ifnoti:

break

token = RhymeDct.get(i,None)

iftoken:

r.append(token)

break

i = i[1:]

iflen(r) == len(words):

return'-'.join(r)

# print(_analysis_words('兄弟'))

第一步:爬虫抓取歌词信息

这个地方数据爬取的越多,肯定你的词库就越壮大,后面分词也越高,我这里只爬取了3首歌曲的歌词,并且最后是存储到txt中,当然,放数据库里就更好了。

defGetKeyword():

#歌曲列表

# url = 'http://music.163.com/api/playlist/detail?id=808976784'

# req = requests.get(url)

# data = req.json()

# print(data['result']['tracks'] )

# tracks =data['result']['tracks'] #歌曲列表

tracks=["431795900",'33850315','430053482']

#写入记事本文件

withopen('keyword.txt','a')asf:

f.write("[")

foriintracks:

print(111)

#歌词

# lrcurl = "http://music.163.com/api/song/lyric?os=pc&id="+str(i['id'])+"&lv=-1&kv=-1&tv=-1"

lrcurl ="http://music.163.com/api/song/lyric?os=pc&id="+str(i)+"&lv=-1&kv=-1&tv=-1"

lrcreq = requests.get(lrcurl)

dt = lrcreq.json()

lrc=re.sub(u"\\[.*?]","", dt['lrc']['lyric'])

#jieba分词

seg_list = list(jieba.cut(lrc, cut_all=True))

foriinseg_list:

#加入判断,只写入2个字组成的词

iflen(i)==2:

#写入格式:{'7-13':'追求'}

if_analysis_words(i)!=None:

f.write("{'"+_analysis_words(i)+"':'"+i+"'},")

f.write("]")

f.close()

第二步:调用分词的方法

GetKeyword()

第三步:分析分词后的txt

def Findkey(str):

result={}

withopen('keyword.txt','r')asf:

#print(f.readlines())

list=eval(f.readlines()[])

foritem in list:

ifitem.get(str):

key=item.get(str)

number=result.get(key)

#如果一个词出现多次,进行次数累加,用来表示频次

ifnumber!=Noneandnumber>=1:

result[key]=number+1

else:

result.update()

f.close()

print(result)

第四步:程序入口

key=input("请输入关键词:")

str=_analysis_words(key)

print("匹配押韵的词:")

Findkey(str)

第五步:创作自己的FreeStyle

#hello 大家好,我的名字叫离岛

#没事爱在博客写写,这感觉让我惬惬

#写代码不是男生的事,女生不是只能做测试

#热爱编码,没有办法

#他们都叫我是热爱编码的Coding女生

来源: 离岛链接:https://segmentfault.com/a/1190000015932069

- END-

转载声明:本文转载自「离岛」,搜索链接即可关注。

◆◆◆◆◆

现在人工智能爆发,Python是一门脚本语言,它更适合去做人工智能这个领域,在人工智能上使用Python比其他编程语言有更大的优势。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180815B0OYI400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券