1. 程式人生 > >文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

概述

 

學習Python中有不明白推薦加入交流群
                號:516107834
                群裡有志同道合的小夥伴,互幫互助,
                群裡有不錯的學習教程!

 

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

  • 前言
  • 準備工作
  • 具體步驟
  • 唐詩生成
  • 藏頭詩規則
  • 結果
  • 阿廣說
  • 群聊交流
  • 福利一刻
  • 推薦閱讀

前言

很從小到大,我們讀過太多的古詩,愛國詩、緬懷詩、相思詩等等。古往今來,我的認知中,李白是個好人!往往一個女的說一個男的是一個好人,那就證明她不愛他。不,阿廣是愛李白的,不為別的,只為他給天下愛酒之人找到了古往今來最佳的喝酒理由。

有一年重陽節,陶淵明家裡沒酒了,只好坐在家門口發呆,無聊的採了一把菊花,聞聞花香過癮。正在無比煩惱的時候,忽見門外來了穿白衣的人,說奉王弘之命前來送酒。陶淵明大喜,菊花也不要了。拿過酒來,一飲而盡。於是又創作了一首流傳千古的古詩。

我想大家都學過“類比”的思想,阿廣也不例外。於是我也在重陽節那天,假裝自己家中沒酒了,坐在家門口同樣發呆,甚至還想抽兩口香菸,無聊的時候採了一把貼著“我正在午睡,請勿踐踏”的小草,偶爾聞聞草的青澀。正準備抽兩口香菸排解心頭之感的時候,並未迎來奉命之人送來作詩之酒。小悲之後,拿過82年的優酸乳一飲而盡。於是,又創作了一個永垂不朽的基於Python的唐詩生成器。

準備工作

環境:Python3.6

包:anaconda管理Python包

編譯器:Pycharm

具體步驟

爬取7w餘首唐詩

#使用urllib3的內建函式構建爬蟲的安全驗證,來應對網站的反爬蟲機制
http = urllib3.PoolManager(
 cert_reqs='CERT_REQUIRED',
 ca_certs=certifi.where())
#爬蟲的目標網站
r = http.request('GET', url)
#爬蟲獲取的html資料
soup = BeautifulSoup(r.data, 'html.parser')
content = soup.find('div', class_="contson")

 

RE對資料進行處理

p1 = r"[\u4e00-\u9fa5]{5,7}[\u3002|\uff0c]" #[漢字]{重複5-7次}[中文句號|中文逗號]
pattern1 = re.compile(p1) #編譯正則表示式
result = pattern1.findall(poemfile) #搜尋匹配的字串,得到匹配列表

 

分詞操作

#使用jieba中文分詞庫的textRank演算法來找出各個詞性的高頻詞
for x in jieba.analyse.textrank(content, topK=600, allowPOS=('n', 'nr', 'ns', 'nt', 'nz', 'm')):

唐詩生成

使用pinyin庫對韻腳進行處理

pip install pinyin
verse = pinyin.get("天", format="strip")
#輸出:tian

 

韻腳數量為20+,且都是以母音字母開始,所以可以根據規則判斷

rhythm = ""
rhythmList = ["a", "e", "i", "o", "u"]
verse = pinyin.get(nounlist[i1][1], format="strip")
#韻腳在每個pinyin倒敘最後一個母音字母處截止
 for p in range(len(verse)-1, -1, -1):
 if verse[p] in rhythmList:
 ind = p
 rhythm = verse[ind:len(verse)]

 

五言律詩,名動名句式

rhythm = ""
rhythmList = ["a", "e", "i", "o", "u"]
while num < 4:
#生成隨機數
 i = random.randint(1, len(nounlist)-1)
 i1 = random.randint(1, len(nounlist)-1)
 j = random.randint(1, len(verblist)-1)
#記錄韻腳
 ind = 0
 ind1 = 0
 if (num == 1):
 rhythm = ""
 verse = pinyin.get(nounlist[i1][1], format="strip")
#韻腳在每個pinyin倒敘最後一個母音字母處截止
 for p in range(len(verse)-1, -1, -1):
 if verse[p] in rhythmList:
 ind = p
 rhythm = verse[ind:len(verse)]
#確保2,4句的韻腳相同,保證押韻
 if (num == 3):
 ind1 = 0
 verse1 = pinyin.get(nounlist[i1][1], format="strip")
 for p in range(len(verse1)-1, -1, -1):
 if verse1[p] in rhythmList:
 ind1 = p
 while verse1[ind1: len(verse1)] != rhythm:
 i1 = random.randint(1, len(nounlist)-1)
 verse1 = pinyin.get(nounlist[i1][1], format="strip")
 for p in range(len(verse1)-1, -1, -1):
 if verse1[p] in rhythmList:
 ind1 = p
#隨機排列組合
 print(nounlist[i]+verblist[j][1]+nounlist[i1])
 num += 1

 

https://github.com/zandaoguang/poem

藏頭詩規則

對語料庫進行排列組合,但需保證每次在排列組合詞的時候,生成的每句話,第一個名詞的第一個字是按照序給定的四字成語即可。

for x in range(len(nounlist)):
 if nounlist[x][0] == str[num]:
 i = x

 

結果

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

五言律詩(以生成的三篇律詩為例):

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

蕭索來千年

重陽頭故國

萬年憂童子

白髮顧舊國

 

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

青樓到一行

高臺手子孫

鳳凰風冠蓋

玉壺意浮雲

 

 

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

嬋娟向古人

五湖夜子孫

東風心月光

銀河道浮雲

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

四言詩:

 

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

所思浮雲

關山車馬

高樓流水

閒人腸斷

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

藏頭詩(落花流水):

 

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

落暉首南宮

花枝成公子

流水名朝廷

水聲勝白石

 

阿廣說

記阿廣平淡而不平凡,簡約而不簡單的一天,感嘆於酒是最好的詩,詩是最好的酒。

國無人莫我知兮

華亭鶴唳詎可聞

幄籠輕日護香霞

奈此朱樑跋扈何

霓為衣兮風為馬

 

千年逢緣得相聚,夢亦人生筱雨飛。

九天散盡群星爠,路盡蕭歌憶具灰。

梅寒一季風散雪,冰藏百丈芬幽勁。

殘陽溺雪煙消幕,月光疊水虛此行?

文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!

 

 

我希望我們能夠在一起研究學術、探討生活、能夠談天說低,我希望我們能夠分享各自的生活和趣事,所以我建立了兩個群,為讀者提供了分享知識、傳遞正能量的平臺