1. 程式人生 > >Python抓取歌詞自制FreeStyle!

Python抓取歌詞自制FreeStyle!

故事的起因是上週六看《中國好聲音》,一個周杰倫戰隊的學員用人工智慧寫的歌詞,於是乎,我也有了這個想法,程式碼的主題思路是看Crossin先生的文章,雖然最後不能寫出一首歌,但是押韻腳這事情分分鐘搞定了

主題的思路,就是先抓取很多首歌曲的歌詞,利用jieba分詞後,將分好的詞按照押韻表進行分類,最後匹配查詢就可以了

準備一:押韻表

這個地方可以去網上搜押韻表(溫馨提示:程式碼可左右滑動)

#引用各種需要的庫
import requests
import jieba
import re
from xpinyin import Pinyin
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 = []
 for i in lst_words:
 while True:
 if not i:
 break
 token = RhymeDct.get(i, None)
 if token:
 r.append(token)
 break
 i = i[1:]
 if len(r) == len(words):
 return '-'.join(r)
 #print( analysis words('兄弟'))

第一步:爬蟲抓取歌詞資訊

這個地方資料爬取的越多,肯定你的詞庫就越壯大,後面分詞也越高,我這裡只爬取了3首歌曲的歌詞,並且最後是儲存到txt中,當然,放資料庫裡就更好了

def GetKeyword():
 #歌曲列表
 # 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']
 #寫入記事本檔案
 with open('keyword.txt','a') as f:
 f.write("[")
 for i in tracks:
 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))
 for i in seg_list:
 #加入判斷,只寫入2個字組成的詞
 if len(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={}
 with open('keyword.txt', 'r') as f:
 list=eval(f.readlines()[0])
 for item in list:
 if item.get(str):
 key=item.get(str)
 number=result.get(key)
 if number !=None and number>=1:
 result[key]=number+1
 else:
 result.update({key:1})
 f.close()
 print(result) 

第四步:程式入口

key=input("請輸入關鍵詞:")
str=_analysis_words(key)
print("匹配押韻的詞:")
Findkey(str)

第五步:創作自己的FreeStyle

# hello 大家好,我的名字叫離島
# 沒事愛在部落格寫寫,這感覺讓我愜愜
# 寫程式碼不是男生的事,女生不是隻能做測試
# 熱愛編碼,沒有辦法
# 他們都叫我是熱愛編碼的Coding女生

進群:960410445 即可獲取數十套PDF!