文藝程式設計師丨基於Python的詩和遠方,我有python也有詩!
概述
學習Python中有不明白推薦加入交流群
號:516107834
群裡有志同道合的小夥伴,互幫互助,
群裡有不錯的學習教程!
- 前言
- 準備工作
- 具體步驟
- 唐詩生成
- 藏頭詩規則
- 結果
- 阿廣說
- 群聊交流
- 福利一刻
- 推薦閱讀
前言
很從小到大,我們讀過太多的古詩,愛國詩、緬懷詩、相思詩等等。古往今來,我的認知中,李白是個好人!往往一個女的說一個男的是一個好人,那就證明她不愛他。不,阿廣是愛李白的,不為別的,只為他給天下愛酒之人找到了古往今來最佳的喝酒理由。
有一年重陽節,陶淵明家裡沒酒了,只好坐在家門口發呆,無聊的採了一把菊花,聞聞花香過癮。正在無比煩惱的時候,忽見門外來了穿白衣的人,說奉王弘之命前來送酒。陶淵明大喜,菊花也不要了。拿過酒來,一飲而盡。於是又創作了一首流傳千古的古詩。
我想大家都學過“類比”的思想,阿廣也不例外。於是我也在重陽節那天,假裝自己家中沒酒了,坐在家門口同樣發呆,甚至還想抽兩口香菸,無聊的時候採了一把貼著“我正在午睡,請勿踐踏”的小草,偶爾聞聞草的青澀。正準備抽兩口香菸排解心頭之感的時候,並未迎來奉命之人送來作詩之酒。小悲之後,拿過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
結果
五言律詩(以生成的三篇律詩為例):
蕭索來千年
重陽頭故國
萬年憂童子
白髮顧舊國
青樓到一行
高臺手子孫
鳳凰風冠蓋
玉壺意浮雲
嬋娟向古人
五湖夜子孫
東風心月光
銀河道浮雲
四言詩:
所思浮雲
關山車馬
高樓流水
閒人腸斷
藏頭詩(落花流水):
落暉首南宮
花枝成公子
流水名朝廷
水聲勝白石
阿廣說
記阿廣平淡而不平凡,簡約而不簡單的一天,感嘆於酒是最好的詩,詩是最好的酒。
國無人莫我知兮
華亭鶴唳詎可聞
幄籠輕日護香霞
奈此朱樑跋扈何
霓為衣兮風為馬
千年逢緣得相聚,夢亦人生筱雨飛。
九天散盡群星爠,路盡蕭歌憶具灰。
梅寒一季風散雪,冰藏百丈芬幽勁。
殘陽溺雪煙消幕,月光疊水虛此行?
我希望我們能夠在一起研究學術、探討生活、能夠談天說低,我希望我們能夠分享各自的生活和趣事,所以我建立了兩個群,為讀者提供了分享知識、傳遞正能量的平臺