宋无涯出同
唐暗水才阳
楼粒甫关尽
头心雨上人‘
公众号:我将在南极找寻你
后台回复“写诗”即可获取源码和用到的文本文件。
今天咱们的主题是教写诗,不过不是我们写,而是教计算机写,想写几首写几首,先来看一下效果
本次利用python来实现自动写诗,需要安装“jieba”库,直接‘pip install jieba’就可以啦
第一步. 下载训练文本
这一步大家都会,从网上下载古诗素材即可,我下载了一个文本文件,将其命名为“poem.txt”,其内容如图所示
第二步. 读取文本数据poem=open("/home/fantasy/Downloads/poems.txt",'r+')
fr0=poem.read()
在Python终端键入“fr0”,效果如图则表示已经读入
第三步. 文本处理
由于文本中包含书名号和问号和换行符等不需要的字符,所以需要将它们删掉(替换为空)
首先去掉书名号和问号:
fr1=re.sub('《.*?》','',fr0)
fr2=re.sub('.*?(/?).*?','',fr1)
然后进行分词:
words=jieba.cut(fr2)
c=','.join(words)
cc=c.split(',')
接下来去掉其它我们不需要的特殊字符串:
word=[]
for i in cc:
if i=='?':
del i
elif i=='。':
del i
elif i==' ':
del i
elif i==',':
del i
elif i=='\n':
del i
elif i=='\u3000':
del i
else:
word.append(i)
到现在为止,文本文件变成了如下图所示的样子
第四步. 拆词成字
将所有的词拆开,提取出所有的汉字存入w列表中:
w=[]
for i in range(len(word)):
for j in word[i]:
w.append(j)
第五步. 开始写诗啦
定义一个写诗的函数,命名为“writepoem”:
def writepoem():
poe=[]
for lensen in range(4):
x=random.sample(w,5)
one=''.join(x)
poe.append(one)
poe=','.join(poe)
return poe
第六步. 调用写诗函数进行创作
def itemsnum():
N=input('想写几首呢,告诉我吧:')
for i in range(1,int(N)+1):
print('~~~~~~~第',i,'首~~~~~~~~')
print(writepoem())
print('~~~~~最后一首了呢~~~~~~')
以上便完成了机器写诗的全部步骤,现在我们来运行一下
运行程序,在IDLE调用itemsnum函数写3首诗:
是不是很有意思呢,嘿嘿。
不过目前的程序还比较笨,不会押韵,下次可以考虑把相同韵脚的字放在一起,把意象相同的词放在一起,从而使诗句更有韵味。
最后附上完整代码,大家也可以在公众号后台回复“写诗”获取源码和文本文件
"""
运行本脚本,在你的IDE终端输入“itemsnum()”
来调用写诗函数进行创作
"""
print(__doc__)
#导入用到的库
import re #正则匹配
import jieba #分词
import random #随机选取
#读取文本文件
poem=open("/home/fantasy/Downloads/poems.txt",'r+') #这是我的文件路径,你在使用时需要改动此项为你的路径fr0=poem.read().strip()#去掉书名号和?fr1=re.sub('《.*?》','',fr0)
fr2=re.sub('.*?(/?).*?','',fr1)
#分词
words=jieba.cut(fr2)
c=','.join(words)
cc=c.split(',')
#去深度删除特殊字符串,代码写的有些鸡肋,大佬莫喷哈
word=[]for i in cc:
if i=='?':
del i
elif i=='。':
del i
elif i==' ':
del i
elif i==',':
del i
elif i=='\n':
del i
elif i=='\u3000':
del i
else:
word.append(i)
#拆词为字
w=[]
for i in range(len(word)):
for j in word[i]:
w.append(j)
#开始写诗
def writepoem():
poe=[]
for lensen in range(4):
x=random.sample(w,5)
one=''.join(x)
poe.append(one)
poe=','.join(poe)
return poe
#调用写诗函数
def itemsnum():
N=input('想写几首呢,告诉我吧:')
for i in range(1,int(N)+1):
print('~~~~~~~~~~~~~~~~~第',i,'首~~~~~~~~~~~~~~~~~~')
print(writepoem())
print('~~~~~~~~~~~~~~~~~最后一首了呢~~~~~~~~~~~~~~~~~~')

592

被折叠的 条评论
为什么被折叠?



