Python抓取歌詞自制FreeStyle

故事的原由是上週六看《中國好聲音》,一個周杰倫戰隊的學員用人工智能寫的歌詞,因而乎,我也有了這個想法,代碼的主題思路是看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()

第三步:分析分詞後的txt

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)

第五步:創做本身的FreeStyle

# hello 你們好,個人名字叫離島
# 沒事愛在博客寫寫,這感受讓我愜愜
# 寫代碼不是男生的事,女生不是隻能作測試
# 熱愛編碼,沒有辦法
# 他們都叫我是熱愛編碼的Coding女生
相關文章
相關標籤/搜索