常聽說(shuō)睹晒,現(xiàn)在的代碼九火,就和唐朝的詩(shī)一樣重要。
可對(duì)我們來(lái)說(shuō)册招,寫幾行代碼沒什么岔激,但是,要讓我們真正地去寫一首唐詩(shī)是掰,那可就頭大了虑鼎。。既然如此键痛,為何不干脆用代碼寫一首唐詩(shī)炫彩?
準(zhǔn)備:
python3.6環(huán)境推薦使用anaconda管理python包,可以對(duì)于每個(gè)項(xiàng)目絮短,創(chuàng)建環(huán)境江兢,并在該環(huán)境下下載項(xiàng)目需要的包。推薦使用pycharm作為編譯器丁频。
GitHub代碼:
theodore3131/TangshiGenerator
具體步驟:
使用爬蟲爬取全唐詩(shī)杉允,總共抓取了71000首。
#使用urllib3的內(nèi)置函數(shù)構(gòu)建爬蟲的安全驗(yàn)證席里,來(lái)應(yīng)對(duì)網(wǎng)站的反爬蟲機(jī)制http = urllib3.PoolManager( cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())#爬蟲的目標(biāo)網(wǎng)站r = http.request('GET', url)#爬蟲獲取的html數(shù)據(jù)soup = BeautifulSoup(r.data, 'html.parser')content = soup.find('div', class_="contson")
使用正則表達(dá)式對(duì)爬取的數(shù)據(jù)進(jìn)行處理
p1 =r"[一-龥]{5,7}[叔磷。|,]"#[漢字]{重復(fù)5-7次}[中文句號(hào)|中文逗號(hào)]pattern1 = re.compile(p1)#編譯正則表達(dá)式result = pattern1.findall(poemfile)#搜索匹配的字符串奖磁,得到匹配列表
對(duì)詩(shī)詞正文進(jìn)行分詞操作
#使用jieba中文分詞庫(kù)的textRank算法來(lái)找出各個(gè)詞性的高頻詞forxinjieba.analyse.textrank(content, topK=600, allowPOS=('n','nr','ns','nt','nz','m')):
唐詩(shī)生成改基,處理韻腳
#使用pinyin庫(kù)pip install pinyinverse = pinyin.get("天",format="strip")#輸出:tian
對(duì)于韻腳,本來(lái)是想找出所有的韻腳并做成字典形式存儲(chǔ)起來(lái)咖为,但韻腳總共有20多個(gè)秕狰, 后來(lái)發(fā)現(xiàn)其實(shí)20多個(gè)韻腳都是以元音字母開始的稠腊,我們可以基于這個(gè)規(guī)則來(lái)判斷:
rhythm =""rhythmList = ["a","e","i","o","u"]verse = pinyin.get(nounlist[i1][1],format="strip")#韻腳在每個(gè)pinyin倒敘最后一個(gè)元音字母處截止forpinrange(len(verse)-1, -1, -1):ifverse[p]inrhythmList: ind = p rhythm = verse[ind:len(verse)]
目前是最初級(jí)的五言律詩(shī),且為名動(dòng)名句式
rhythm =""rhythmList = ["a","e","i","o","u"]whilenum<4:#生成隨機(jī)數(shù)i =random.randint(1,len(nounlist)-1) i1 =random.randint(1,len(nounlist)-1) j =random.randint(1,len(verblist)-1)#記錄韻腳ind =0ind1 =0if(num==1): rhythm =""verse = pinyin.get(nounlist[i1][1],format="strip")#韻腳在每個(gè)pinyin倒敘最后一個(gè)元音字母處截止forpinrange(len(verse)-1,-1,-1):ifverse[p]inrhythmList: ind = p rhythm = verse[ind:len(verse)]#確保2鸣哀,4句的韻腳相同架忌,保證押韻if(num==3): ind1 =0verse1 = pinyin.get(nounlist[i1][1],format="strip")forpinrange(len(verse1)-1,-1,-1):ifverse1[p]inrhythmList: ind1 = pwhileverse1[ind1:len(verse1)] != rhythm: i1 =random.randint(1,len(nounlist)-1) verse1 = pinyin.get(nounlist[i1][1],format="strip")forpinrange(len(verse1)-1,-1,-1):ifverse1[p]inrhythmList: ind1 = p#隨機(jī)排列組合print(nounlist[i]+verblist[j][1]+nounlist[i1])num+=1
藏頭詩(shī)
其實(shí)思路很簡(jiǎn)單,既然我們有了語(yǔ)料庫(kù)诺舔,那么,我們每次在排列組合詞的時(shí)候备畦,只需保證生成每句時(shí)低飒,第一個(gè)名詞的第一個(gè)字,是按序給定四字成語(yǔ)中的即可
for x in range(len(nounlist)): if nounlist[x][0] == str[num]: i = x
來(lái)看一下結(jié)果:
四言詩(shī):
所思浮云
關(guān)山車馬
高樓流水
閑人腸斷
五言律詩(shī):
西風(fēng)時(shí)細(xì)雨
山川釣建章
龍門看蕭索
幾年鄉(xiāng)斜陽(yáng)
藏頭詩(shī):
落花流水
落暉首南宮
花枝成公子
流水名朝廷
水聲勝白石
參考:
人類身份驗(yàn)
當(dāng)然懂盐,現(xiàn)在生成的唐詩(shī)還是比較低級(jí)的褥赊,屬于基礎(chǔ)的古詩(shī)文詞語(yǔ)排列組合。 接下來(lái)考慮優(yōu)化模版莉恼,提取五言和七言常用句式作為模版拌喉。 另外考慮使用機(jī)器學(xué)習(xí)的方法,寫RNN來(lái)讓計(jì)算機(jī)自動(dòng)生成充滿韻味的詩(shī)俐银。
最后小編自己也是一個(gè)有著6年工作經(jīng)驗(yàn)的工程師尿背,關(guān)于python編程,自己有做材料的整合捶惜,一個(gè)完整的python編程學(xué)習(xí)路線田藐,學(xué)習(xí)資料和工具。想要這些資料的可以關(guān)注小編吱七,加入python學(xué)習(xí)交流Q群735967233汽久。