歡迎光臨
每天分享高質量文章

用Python,生活仍有詩和遠方

常聽說,現在的程式碼,就和唐朝的詩一樣重要。

可對我們來說,寫幾行程式碼沒什麼,但是,要讓我們真正地去寫一首唐詩,那可就頭大了。。既然如此,為何不乾脆用程式碼寫一首唐詩?


準備:

  • 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"[一-龥]{5,7}[。|,]"  #[漢字]{重覆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多個,
後來發現其實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

藏頭詩

其實思路很簡單,既然我們有了語料庫,那麼,我們每次在排列組合詞的時候,只需保證生成每句時,第一個名詞的第一個字,是按序給定四字成語中的即可

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

來看一下結果:

四言詩:

所思浮雲
關山車馬
高樓流水
閑人腸斷

五言律詩:

西風時細雨
山川釣建章
龍門看蕭索
幾年鄉斜陽

藏頭詩:

落花流水

落暉首南宮
花枝成公子
流水名朝廷
水聲勝白石

參考:


https://segmentfault.com/a/1190000004571958

當然,現在生成的唐詩還是比較低階的,屬於基礎的古詩文詞語排列組合。
接下來考慮最佳化模版,提取五言和七言常用句式作為模版。
另外考慮使用機器學習的方法,寫RNN來讓計算機自動生成充滿韻味的詩。

(完)

來源:TheodoreXu     連結:

https://segmentfault.com/a/1190000013154329


《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~


*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

– END –




更多Python好文請點選【閱讀原文】哦

↓↓↓

贊(0)

分享創造快樂