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作诗,生活仍有诗和远方相关推荐
- 编写python程序的步骤_编写python程序和运行.py文件的方法步骤
前提:已安装好 Subliume Test 3 且已经添加好python编译系统,已安装好python3.7 一.新建一个文本文档,将后缀名改为.py 二.使用 Subliume Test 3 打开该 ...
- python程序运行原理_谈谈 Python 程序的运行原理
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...
- python程序写蛇_如何用Python画一条蛇
先上效果图 最近又打算重新学习Python了, 之前也入门过Python, 但是弄完Python的开发环境后, 停留在print("hello world")阶段 非科班出身, 没 ...
- python获取藏头诗内容_用Python作诗,生活仍有诗和远方
具体步骤: 使用爬虫爬取全唐诗,总共抓取了71000首. #使用urllib3的内置函数构建爬虫的安全验证,来应对网站的反爬虫机制 http = urllib3.PoolManager( cert_r ...
- 用python做炒股软件-python程序源码_基于python的炒股软件
股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...
- python程序员现状_天才Python程序员身价上亿却被说挫,6个月减90斤,逆袭成文艺范男神!...
image 你对程序猿的印象是怎么样? 你所知道的程序员,是一种自嘲为码农的猿类 学习Python中有不明白推荐加入交流群 号:864573496 群里有志同道合的小伙伴,互帮互助, 群里有不错的视频 ...
- 如何为python程序设置使用次数_提升Python程序性能的7个习惯
Python不以性能见长,但掌握一些技巧,也可尽量提高程序性能,避免不必要的资源浪费. 1.使用局部变量 尽量使用局部变量代替全局变量:便于维护,提高性能并节省内存. 使用局部变量替换模块名字空间中的 ...
- python程序如何循环_在Python的一段程序中如何使用多次事件循环详解
背景 本文主要给大家介绍了关于在Python一段程序中使用多次事件循环的相关内容,我们在Python异步程序编写中经常要用到如下的结构 import asyncio async def doAsync ...
- python如何写日志_【Python】教你如何在python中添加日志
背景 起因是这次的项目用thrift来连接算法(python)和业务逻辑(java),因此有必要在python中添加日志来记录传入的参数.这样,当算法端没有正确响应时,就能方便地排查原因. 简易版实现 ...
最新文章
- 【动态规划专题】最长上升子序列模型
- python3 urllib
- 《解释的工具:生活中的经济学原理 读书笔记6》
- 希尔排序-Java二
- SpringBoot_配置-properties配置文件编码问题
- mac懒人版_这些实用的Mac软件你迟早会用到,建议收藏!
- pandas之数值计算与统计
- it运维中faq_如何编写系统FAQ
- 1433 mssql 安全_mssqlsql2008安全配置又一给力教程
- html5系列:notification api升级——从webkitNotifications到Notification
- 积累的VC编程小技巧之工具条和状态条
- Java、JSP电子政务系统
- 华为路由器用Linux开发,华为路由交换设备配置综合实验(实验六合一)
- Scala中fold()操作和reduce()操作的区别
- GB28181语音对讲/摄像头公网对讲指挥
- EclipseSVN更新和提交
- Htmlunit模拟登陆蓝墨云
- 【视频分享】尚硅谷Java视频教程_Spring注解驱动开发视频教程
- mysql修改密码报错:Your password does not satisfy the current policy requirements
- C++ OpenCV无法调用视频的问题
热门文章
- C++:vector中的resize()函数 VS reserve()函数
- php 数组移除指定健,php删除数组指定键的方法
- java导出jar带第三方库_在.jar文件中导出java库
- enum 定义3个属性_和平精英:合金龙骨有3个隐藏属性,比玛莎“水下无敌”还唬人...
- 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验
- Bash脚本教程之引号和转义
- 华三ospf联动bfd_HCIE2020__路由交换专家__BFD综合实验
- linux内存剩余量为什么这么少,为什么我的Linux系统中空闲内存如此之少?
- 实时监听input输入框value的变化:
- 腾讯TBS X5 WebView的简单使用