源 /segmentfault文 /离岛整理/顶级程序员
故事的起因是上周六看《中国好声音》,一个周杰伦战队的学员用人工智能写的歌词,于是乎,我也有了这个想法,代码的主题思路是看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
defFindkey(str):
result={}
withopen('keyword.txt','r')asf:
list=eval(f.readlines()[])
foriteminlist:
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女生
领取专属 10元无门槛券
私享最新 技术干货