一、数据准备:

全唐诗数据集:https://github.com/todototry/AncientChinesePoemsDB
从郑州大学图书馆网站上爬取下来的全唐诗库,收录了唐代诗人2539人的诗作42863首,共计900卷。
该数据集格式为:每首诗一个txt文件,按照卷进行排序和命名。其中有一些为空白文件,总大小为5MB左右。
中华古诗数据集:https://github.com/jackeyGao/chinese-poetry
唐宋两朝14000名古诗人,55000首唐诗,260000首宋词,用数据分析抽丝剥茧文化内涵。
该数据集格式为:每一千首诗词一个json文件,其中包含平仄、作者、诗句和题目。诗句均为繁体。

[{"strains": ["仄仄仄仄平仄仄,平平仄平○仄仄。", "平平仄仄平仄平,仄仄平平?仄仄。"], "author": "宋太祖", "paragraphs": ["欲出未出光辣達,千山萬山如火發。", "須臾走向天上來,逐却殘星趕却月。"], "title": "日詩"}, ...
]

二、全唐诗数据集处理

首先,将4万多个古诗词文件合并为一个大txt,每行一首诗。
为了去除空白文件,将文件读入集合后,将集合元素逐行写入txt中。
如果文件过多或过大,为防止内存溢出,可以使用os.path.getsize('./ks_accumulate.csv')判断文件是否为空,再逐个文件写入大txt。
分析发现部分诗句中含有括号,形如

先生自舞琴。(《三乐达节》)波上人如潘玉儿,掌中花似赵飞燕。(《采莲曲》,以上并见《乐书》)

部分诗句后含有多余文本,形如

弟子已攀桂,先生犹卧云。把得新诗草里论。枯井夜闻邻果落,废巢寒见别禽来。卷六百五十四

用正则表达式对这种文本进行处理,去除括号中的内容和诗句后多余内容。
其中还有少部分问题诗句,如包含多个句号的、有特殊符号的等等。

微官同侍苍龙阙,直谏偏推白马生。。
傩击鼓长笛,瘦鬼染面惟齿白。暗中拽茅鞭,。。倮足朱行戚戚。ń相顾笑声冲庭燎,桃弧射矢时独叫。
卷263_46【九日登高】严维诗家九日怜芳菊,迟客高斋瞰浙江。汉浦浪花摇素壁,西陵树色入秋窗。木奴向熟悬金实,桑落新开泻玉缸。四子醉时争讲德,笑论黄霸屈为邦。
五杂组,四豪客。往复还,阡与陌。不得已,长沙谪。__张荐五杂组,五辛盘。往复还,马上鞍。不得已,左降官。__李崿五杂组,甘咸醋。往复还,乌与兔。不得已,韶光度。__颜真卿五杂组,五色丝。往复还,回文诗。不得已,失喜期。__皎然

进一步分析发现,部分诗句不是以句号结尾的。为了后续任务分析,对感叹号结尾的替换为句号,对没有标点或者多个标点的,去除最后一句,令其句号或问号结尾。但这种语句不多,也可手动处理。

三径何寂寂,主人山上山。亭空檐月在,水落钓矶闲。药院鸡犬静,酒垆苔藓班。知君少机事,当待暮云还
弟兄俱已尽,松柏问何人。闻道茂陵山水好,碧溪流水有桃源。赤城峭壁无人到,丹灶芝田有鹤来。三千宫女露蛾眉,笑煮黄金日月迟。,
浮生共多故,聚宿喜君同。人息时闻磬,灯摇乍有风。霜阶疑水际,夜木似山中。一愿持如意,长来事远公。知

最后从全部诗中提取带有数字的诗句,去除含特殊符号的句子,并将多个句号替换为一个句号。

def MergeTxt(filepath,outfile):poemset = set()for parent, dirnames, filenames in os.walk(filepath):for filepath in filenames:txtPath = os.path.join(parent, filepath)f = open(txtPath)line = f.read()line = line.replace('!', '。')        # 将感叹号替换为句号line = '。'.join(line.split('。')[:-1])+'。'   # 令句子以最后一个句号结尾poem = re.sub("(.*?)", "", line)     # 去除括号里的内容poem = re.sub("。卷.*", "。", poem)    # 去除“卷六百五十四”这种poemset.add(poem)print(len(poemset))k = open(outfile, 'w', encoding='utf-8')for poem in poemset:if poem!='':k.write(poem+"\n")k.close()print("merge finished!")def extractNumberPoemtry(inputfile,outfile):with open(inputfile,'r',encoding="utf-8") as f1, open(outfile,'w') as f2:for line in f1:if '_' in line:continueif re.match(".*[一二三四五六七八九十百千万亿].*",line):f2.write(line.replace('。。','。'))
  • f.read():每次读取整个文件,它通常将读取到底文件内容放到一个字符串变量中。
  • f.readlines():读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。

注意
文件在close()之前只能读取一次,不能f.read()之后再f.readlines(),或f.readlines()f.read()之后再这样将输出为空。

三、中华古诗数据集处理

首先从json中提取诗词,合并为一个大txt,每行一首诗词。
这个数据集全部为繁体字,所以涉及到繁简转换,这里用到的工具是langconv.pyzh_wiki.py,只需要把这两个文件下载下来,保存到与代码同一目录下即可。工具放在我的GitHub里,地址见后文。
这个数据集同样有一些特殊字符,如{},“”,□等。

莽莽荒茨岸,回回乱石滩。雨寒收市早,风急泊舟难。{宀禹}县兵犹鬭,乾坤网正宽。慇懃嘱龙剑,莫久卧波澜。
遥泉滴滴度更迟,秋夜霜天入竹扉。明月自随山影去,清风长送白云归。(同前书卷六)-1033-。
云中古城郁嵯峨,塞上行吟麦秀歌。感时伤古今如此,报主怀恩奈老何!。
子瞻词里贬眉汉,鲁直诗中返哺僧。□□□□□□针,血写南山□□□。□□□□□□□,□□□□□来似。不曾□□□□□,□□□□□□□。
花榭香红烟景迷,满庭芳草绿萋萋,金铺闲掩绣帘底。YY紫燕一双娇语碎,翠屏十二晚峰齐,梦魂消散醉空闺。
金陵朱世英官长沙,或有画箕踞而坐者号大着肚。旧有赞颂皆鄙语,朱为题小诗其上以易之。其尾云“但将贮酒三千锺,莫话容卿数百辈。”馀爱其语有味,更作此诗以广其意。

处理方法类似:

# 合并同一个文件夹下多个txt
def MergeTxt(filepath,outfile):poemset = set()for parent, dirnames, filenames in os.walk(filepath):for filepath in filenames:txtPath = os.path.join(parent, filepath)with open(txtPath, encoding='utf-8') as f:s = json.load(f)for item in s:sentence = ''.join(item["paragraphs"])sentence = Converter('zh-hans').convert(sentence)   # 繁体转简体poem = re.sub("{.*?}", "", sentence)                # 去除{}里的内容poem = re.sub("(.*?)", "", poem)                  # 去除()里的内容poem = re.sub("-.*?。", "", poem)                   # 去除“-143-。”这种内容poem.replace("。。", "。")                           # 将两个句号替换为一个句号poemset.add(poem)print(len(poemset))k = open(outfile, 'w', encoding='utf-8')for poem in poemset:if poem != '':k.write(poem + "\n")k.close()print("merge finished!")# 提取出带数字的诗
def extractNumberPoemtry(inputfile,outfile):with open(inputfile,'r',encoding="utf-8") as f1, open(outfile,'w',encoding="utf-8") as f2:for line in f1:if '□' in line:continueif re.match(".*[一二三四五六七八九十百千万亿].*",line):f2.write(line.replace('。。', '。').replace('!。', '。').replace('!', '。').replace('Y', '').replace('。”。', '。').replace(':“',',').replace('”','').replace('“',','))

注意:replace如果放在MergeTxt()里,速度会慢,放在extractNumberPoemtry()里更快一些。

最后,将两个数据集中提取的带数字的古诗词合并去重即可。

# 把几个数据集的文本合起来
def mergefile(inputfile1,inputfile2,outfile):poemset = set()with open(inputfile1, 'r', encoding="utf-8") as f1, open(inputfile2, 'r', encoding="utf-8") as f2, open(outfile, 'w', encoding="utf-8") as f3:for line1 in f1:poemset.add(line1)for line2 in f2:poemset.add(line2)for line in poemset:f3.write(line)

注意,txt文件可能需要在文本编辑器里手动转成utf-8编码。

三、自找诗句

这部分为从百度知道等地方找的少部分诗句,需要看是否包含在合并数据集里,如果没有,则手动加入。

with open(mergefile, 'r', encoding="utf-8") as f1,open(finefile,'r',encoding="utf-8") as f2:forfindlines = f2.readlines()alllines = f1.read()print(type(alllines))for line in forfindlines:if ''.join(line.split('\n')[0]) not in alllines:print(''.join(line.split('\n')[0]))

最后得到的带数字的古诗词数据集约为十八万首。
处理脚本和繁简转换工具的全部代码在:https://github.com/vivianLL/PoetryWithNumber

python构建带数字的古诗词数据集相关推荐

  1. python 将带数字的拼音转换为带声调的拼音

    最终实现结果如图 最后附上代码, from pypinyin import pinyin, Style # 传入汉字和带数字的拼音,然后返回的值是带音调的拼音 def text_tone2pinyin ...

  2. 如何用Python打印带数字上下标的字符串(函数表达式、化学方程式等)

    打印上下标可以采用str对象的maketrans(str1, str2)方法.该方法用于创建字符映射转换表,有两个参数,参数str1存入要转换的字符,参数str存入相应的转换后的字符,例如大小写字母的 ...

  3. Python 手写数字识别 MNIST数据集下载失败

    目录 一.MNIST数据集下载失败 1 失败的解决办法(经验教训): 2 亲测有效的解决方法: 一.MNIST数据集下载失败 场景复现:想要pytorch+MINIST数据集来实现手写数字识别,首先就 ...

  4. DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率

    DL之NN:基于(sklearn自带手写数字图片识别数据集)+自定义NN类(三层64→100→10)实现97.5%准确率 目录 输出结果 核心代码 输出结果 核心代码 #DL之NN:基于sklearn ...

  5. python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)

    一.运行环境配置 本次实验的运行环境win10(bit64),采用python环境为3.7.6,安装Python环境推荐使用Anaconda.Anaconda是一个免费开源的Python和R语言的发行 ...

  6. Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  7. Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  8. DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练、预测(95%)

    DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练.预测(95%) 目录 数据集展示 输出结果 设计代码 数据集展示 先查看sklearn自带di ...

  9. TF之CNN:利用sklearn(自带手写数字图片识别数据集)使用dropout解决学习中overfitting的问题+Tensorboard显示变化曲线

    TF之CNN:利用sklearn(自带手写数字图片识别数据集)使用dropout解决学习中overfitting的问题+Tensorboard显示变化曲线 目录 输出结果 设计代码 输出结果 设计代码 ...

  10. python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名

    搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...

最新文章

  1. CORS漏洞利用检测和利用方式
  2. C#中导出Excel报表的方法
  3. PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴
  4. Gridview分页模板
  5. java Gregorian,Java GregorianCalendar getTimeZone()用法及代码示例
  6. linux常用命令(1)帮助命令man使用
  7. oracle 多个表 join 的先后顺序
  8. Jmeter测试并发https请求成功了
  9. 使用TargetSources
  10. Leetcode 1143.最长公共子序列(求长度)
  11. 内存越界访问保护 内存泄漏研究 未完待续
  12. (转)一张图学会Dockerfile
  13. web测试app测试接口测试要点整理--最全
  14. 程序开发学习和工作中常用工具——Doxygen和graphviz和HTML Help WorkShop以及 Easy CHM
  15. 3D模型在线转换,CAD格式转换,Solidworks版本转换
  16. Zigbee无线模块配置
  17. 「Deep Learning」Note on the Shattered Gradients Problem
  18. C# Excel 条件格式
  19. Tomcat8+Redis集群解决会话共享
  20. Windows、Linux密码破解—John、Hydra、hashcat、Mimikatz等工具基本使用

热门文章

  1. 高速PCB设计中遇到的问题总结
  2. LNMP一键安装的卸载
  3. 解决“ssh服务器拒绝了密码 请再试一次”问题
  4. 如何用谷歌地图下载器下载大字体谷歌地图打印喷绘
  5. 人工智能中常用的词汇
  6. 艾宾浩斯遗忘曲线复习计划表Excel下载
  7. java-设置电脑音量
  8. cad高程测绘图lisp_CAD地形图高程信息快速提取的技术与实现
  9. Java九大内置对象
  10. 单项选择题标准化考试系统设计c语言报告,C语言课程设计(单项选择题标准化考试系统)报告...