用Python,生活仍有詩和遠方

2021-09-24 03:28:49 字數 2821 閱讀 8577

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

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

準備:github**:

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"[一-龥][。|,]" #[漢字][中文句號|中文逗號] 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
來看一下結果:

四言詩:

所思浮雲 關山車馬 高樓流水 閒人腸斷
五言律詩:

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

落花流水

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

人類身份驗

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

用python,生活仍有詩和遠方

常聽說,現在的 就和唐朝的詩一樣重要。可對我們來說,寫幾行 沒什麼,但是,要讓我們真正地去寫一首唐詩,那可就頭大了。既然如此,為何不乾脆用 寫一首唐詩?github github theodore3131 tangshigenerator 使用urllib3的內建函式構建爬蟲的安全驗證,來應對 的反...

用Python,生活仍有詩和遠方

常聽說,現在的 就和唐朝的詩一樣重要。可對我們來說,寫幾行 沒什麼,但是,要讓我們真正地去寫一首唐詩,那可就頭大了。既然如此,為何不乾脆用 寫一首唐詩?準備 github theodore3131 tangshigenerator 具體步驟 使用爬蟲爬取全唐詩,總共抓取了71000首。使用urlli...

生活不止眼前的苟且,還有詩和遠方!

作為一名技術開發者,優秀的技術是我們吃飯的基本工具。但是在我們鑽研技術的時候,可能很多人都會有同樣的感覺,就是執著於技術 痴迷於技術。俗話說 生活不只是眼前的苟且,還有詩和遠方!作為大多數 程式猿 的我們,一天大腦中時時刻刻都在想著技術,想著問題,甚至連睡覺做夢的時候也在想著如何攻克難題。可能很多程...