故事的原由是上週六看《中國好聲音》,一個周杰倫戰隊的學員用人工智能寫的歌詞,因而乎,我也有了這個想法,代碼的主題思路是看Crossin先生的文章,雖然最後不能寫出一首歌,可是押韻腳這事情分分鐘搞定了
主題的思路,就是先抓取不少首歌曲的歌詞,利用jieba分詞後,將分好的詞按照押韻表進行分類,最後匹配查詢就能夠了數據庫
這個地方能夠去網上搜押韻表json
#引用各類須要的庫 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」,就等於你給每一個詞都貼了一個標籤,這樣你之後想搜索的時候,就能夠根據標籤找到這些詞了api
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中,固然,放數據庫裏就更好了app
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()
def Findkey(str): result={} with open('keyword.txt', 'r') as f: # print(f.readlines()) 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)
# hello 你們好,個人名字叫離島 # 沒事愛在博客寫寫,這感受讓我愜愜 # 寫代碼不是男生的事,女生不是隻能作測試 # 熱愛編碼,沒有辦法 # 他們都叫我是熱愛編碼的Coding女生