python程序写诗_用Python作诗,生活仍有诗和远方
原標題:用Python作詩,生活仍有詩和遠方
報 名
來源:TheodoreXu鏈接:
https://segmentfault.com/a/1190000013154329
常聽說,現在的代碼,就和唐朝的詩一樣重要。
可對我們來說,寫幾行代碼沒什么,但是,要讓我們真正地去寫一首唐詩,那可就頭大了。。既然如此,為何不干脆用代碼寫一首唐詩?
準備:
python3.6環境
推薦使用anaconda管理python包,可以對于每個項目,創建環境,并在該環境下下載項目需要的包。
推薦使用pycharm作為編譯器。
GitHub代碼:
https://github.com/theodore3131/TangshiGenerator
具體步驟:
使用爬蟲爬取全唐詩,總共抓取了71000首。
#使用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")
使用正則表達式對爬取的數據進行處理
p1 = r"[u4e00-u9fa5]{5,7}[u3002|uff0c]"#[漢字]{重復5-7次}[中文句號|中文逗號]
pattern1 = re.compile(p1) #編譯正則表達式
result = pattern1.findall(poemfile) #搜索匹配的字符串,得到匹配列表
對詩詞正文進行分詞操作
#使用jieba中文分詞庫的textRank算法來找出各個詞性的高頻詞
forx injieba.analyse.textrank(content, topK= 600, allowPOS=( 'n', 'nr', 'ns', 'nt', 'nz', 'm')):
唐詩生成,處理韻腳
#使用pinyin庫
pip install pinyin
verse = pinyin.get( "天", format= "strip")
#輸出:tian
對于韻腳,本來是想找出所有的韻腳并做成字典形式存儲起來,但韻腳總共有20多個,
后來發現其實20多個韻腳都是以元音字母開始的,我們可以基于這個規則來判斷:
rhythm = ""
rhythmList = [ "a", "e", "i", "o", "u"]
verse = pinyin.get(nounlist[i1][ 1], format= "strip")
#韻腳在每個pinyin倒敘最后一個元音字母處截止
forp inrange(len(verse)- 1, - 1, - 1):
ifverse[p] inrhythmList:
ind = p
rhythm = verse[ind:len(verse)]
目前是最初級的五言律詩,且為名動名句式
rhythm = ""
rhythmList = [ "a", "e", "i", "o", "u"]
whilenum < 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倒敘最后一個元音字母處截止
forp inrange(len(verse)- 1, - 1, - 1):
ifverse[p] inrhythmList:
ind = p
rhythm = verse[ind:len(verse)]
#確保2,4句的韻腳相同,保證押韻
if(num == 3):
ind1 = 0
verse1 = pinyin.get(nounlist[i1][ 1], format= "strip")
forp inrange(len(verse1)- 1, - 1, - 1):
ifverse1[p] inrhythmList:
ind1 = p
whileverse1[ind1: len(verse1)] != rhythm:
i1 = random.randint( 1, len(nounlist)- 1)
verse1 = pinyin.get(nounlist[i1][ 1], format= "strip")
forp inrange(len(verse1)- 1, - 1, - 1):
ifverse1[p] inrhythmList:
ind1 = p
#隨機排列組合
print(nounlist[i]+verblist[j][ 1]+nounlist[i1])
num += 1藏頭詩
其實思路很簡單,既然我們有了語料庫,那么,我們每次在排列組合詞的時候,只需保證生成每句時,第一個名詞的第一個字,是按序給定四字成語中的即可
forx inrange(len(nounlist)):
ifnounlist[x][ 0] == str[num]:
i = x
來看一下結果:
四言詩:
所思浮云
關山車馬
高樓流水
閑人腸斷
五言律詩:
西風時細雨
山川釣建章
龍門看蕭索
幾年鄉斜陽
藏頭詩:
落花流水
落暉首南宮
花枝成公子
流水名朝廷
水聲勝白石
參考:
https://segmentfault.com/a/1190000004571958
當然,現在生成的唐詩還是比較低級的,屬于基礎的古詩文詞語排列組合。
接下來考慮優化模版,提取五言和七言常用句式作為模版。
另外考慮使用機器學習的方法,寫RNN來讓計算機自動生成充滿韻味的詩。
(完)
圖文來自網絡、如涉及版權問題,請聯系我們以便處理。文章內容純屬作者個人觀點,不代表本網觀點。
責任編輯:
總結
以上是生活随笔為你收集整理的python程序写诗_用Python作诗,生活仍有诗和远方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 考研班一般多少钱啊?
- 下一篇: caffe安装_目标检测之caffe-s