分享一篇文章潮罪,原文位于:用Python。
常聽說(shuō),現(xiàn)在的代碼嫉到,就和唐朝的詩(shī)一樣重要沃暗。
可對(duì)我們來(lái)說(shuō),寫幾行代碼沒什么何恶,但是孽锥,要讓我們真正地去寫一首唐詩(shī),那可就頭大了细层。惜辑。既然如此,為何不干脆用代碼寫一首唐詩(shī)疫赎?
準(zhǔn)備:
- python3.6環(huán)境
- 推薦使用anaconda管理python包盛撑,可以對(duì)于每個(gè)項(xiàng)目,創(chuàng)建環(huán)境虚缎,并在該環(huán)境下下載項(xiàng)目需要的包撵彻。
- 推薦使用pycharm作為編譯器钓株。
GitHub代碼:
具體步驟:
使用爬蟲爬取全唐詩(shī)实牡,總共抓取了71000首。
#使用urllib3的內(nèi)置函數(shù)構(gòu)建爬蟲的安全驗(yàn)證轴合,來(lái)應(yīng)對(duì)網(wǎng)站的反爬蟲機(jī)制
#python學(xué)習(xí)交流群:516107834
http = urllib3.PoolManager(
cert_reqs='CERT_REQUIRED',
ca_certs=certifi.where())
#爬蟲的目標(biāo)網(wǎng)站
r = http.request('GET', url)
#爬蟲獲取的html數(shù)據(jù)
soup = BeautifulSoup(r.data, 'html.parser')
content = soup.find('div', class_="contson")
使用正則表達(dá)式對(duì)爬取的數(shù)據(jù)進(jìn)行處理
p1 = r"[一-龥]{5,7}[创坞。|,]" #[漢字]{重復(fù)5-7次}[中文句號(hào)|中文逗號(hào)]
pattern1 = re.compile(p1) #編譯正則表達(dá)式
result = pattern1.findall(poemfile) #搜索匹配的字符串受葛,得到匹配列表
對(duì)詩(shī)詞正文進(jìn)行分詞操作
#使用jieba中文分詞庫(kù)的textRank算法來(lái)找出各個(gè)詞性的高頻詞
for x in jieba.analyse.textrank(content, topK=600, allowPOS=('n', 'nr', 'ns', 'nt', 'nz', 'm')):
唐詩(shī)生成题涨,處理韻腳
#使用pinyin庫(kù)
pip install pinyin
verse = pinyin.get("天", format="strip")
#輸出:tian
對(duì)于韻腳,本來(lái)是想找出所有的韻腳并做成字典形式存儲(chǔ)起來(lái)总滩,但韻腳總共有20多個(gè)纲堵, 后來(lái)發(fā)現(xiàn)其實(shí)20多個(gè)韻腳都是以元音字母開始的,我們可以基于這個(gè)規(guī)則來(lái)判斷:
rhythm = ""
rhythmList = ["a", "e", "i", "o", "u"]
verse = pinyin.get(nounlist[i1][1], format="strip")
#韻腳在每個(gè)pinyin倒敘最后一個(gè)元音字母處截止
for p in range(len(verse)-1, -1, -1):
if verse[p] in rhythmList:
ind = p
rhythm = verse[ind:len(verse)]
目前是最初級(jí)的五言律詩(shī)闰渔,且為名動(dòng)名句式
rhythm = ""
rhythmList = ["a", "e", "i", "o", "u"]
while num < 4:
#python學(xué)習(xí)交流群:516107834
#生成隨機(jī)數(shù)
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")
#韻腳在每個(gè)pinyin倒敘最后一個(gè)元音字母處截止
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
#隨機(jī)排列組合
print(nounlist[i]+verblist[j][1]+nounlist[i1])
num += 1
藏頭詩(shī)
其實(shí)思路很簡(jiǎn)單冈涧,既然我們有了語(yǔ)料庫(kù)茂附,那么,我們每次在排列組合詞的時(shí)候督弓,只需保證生成每句時(shí)营曼,第一個(gè)名詞的第一個(gè)字,是按序給定四字成語(yǔ)中的即可
for x in range(len(nounlist)):
if nounlist[x][0] == str[num]:
i = x
來(lái)看一下結(jié)果:
四言詩(shī):
所思浮云
關(guān)山車馬
高樓流水
閑人腸斷
五言律詩(shī):
西風(fēng)時(shí)細(xì)雨
山川釣建章
龍門看蕭索
幾年鄉(xiāng)斜陽(yáng)
藏頭詩(shī):
落花流水
落暉首南宮
花枝成公子
流水名朝廷
水聲勝白石
參考:
當(dāng)然愚隧,現(xiàn)在生成的唐詩(shī)還是比較低級(jí)的蒂阱,屬于基礎(chǔ)的古詩(shī)文詞語(yǔ)排列組合。 接下來(lái)考慮優(yōu)化模版,提取五言和七言常用句式作為模版录煤。 另外考慮使用機(jī)器學(xué)習(xí)的方法虱痕,寫RNN來(lái)讓計(jì)算機(jī)自動(dòng)生成充滿韻味的詩(shī)。