一:诗歌分类

首先,从网上搜集到近30万首诗歌,但这些诗歌并没有明确分类。为了将诗歌进行分类,在古诗文网(https://www.gushiwen.org/)上分别爬取边塞征战、写景咏物、山水田园、思乡羁旅、咏史怀古五类诗歌各600首,用于做分类的训练数据集。由这些数据训练得到一个分类模型,由此分类模型对那30万首诗歌进行分类。

数据集(5类诗歌数据600*5+Fasttext.model分类模型(也可自己训练)+停用词表(哈工大停用词表)+30万首诗歌数据+Fasttext处理后的分类数据集):

链接:https://pan.baidu.com/s/1ms2TFhVlbN44JN7Yaw7xZg 
提取码:dbvt

1、爬取6类诗歌的代码实现:

"""从古诗文网(https://www.gushiwen.org/)上爬取网页中的6类唐诗在古诗文网上,输入一类古诗,可能爬取的数量不够 600 首,对于这中情况,我是又输入了此类诗的主题词,能反映出其特点的情感词汇等,最终获取到每类诗600首1 边塞征战2 写景咏物3 山水田园4 思乡羁旅5 咏史怀古
"""
from config import *
def Get_url():# 改变标准输出的默认编码sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')# 需要爬的网址--古诗文网https://www.gushiwen.org/shiwen/# 输入一类,翻页爬去,5类诗每类获取 600首,用作分类训练、测试数据for i in range(1,20):# i 表示页面范围# 此网址总共有三种格式,经观察发现 page, A ,后跟随的便是页数,循环更改此值,便可实现翻页爬取# url='https://www.gushiwen.org/shiwen/default.aspx?page=9&type=4&id=1'# 'https://www.gushiwen.org/shiwen/default_1A589282347eb3A2.aspx'# 'https://so.gushiwen.org/search.aspx?type=title&page=3&value=%E7%BE%81%E6%97%85%E6%80%9D%E4%B9%A1'url1 = 'https://so.gushiwen.org/search.aspx?type=title&page='page = ipage = '%d' % page# 每一个类型的 poem_type在url中的显示形式,5次不同poem_type = '&value=%e5%8f%a4%e8%bf%b9'  #(类型的url形式) 事先输入类型,确定页面确切地址url = url1+page+poem_type # 最终的 url 值head = {}# 在浏览器地址栏中输入 about:version (最好谷歌) 得到浏览器版本,用户代理,可实现伪装成浏览器head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'req = request.Request(url, headers=head)response = request.urlopen(req)  # 返回 html代码html = response.read()soup = BeautifulSoup(html, 'lxml') # 使用BeautifulSoup 解析# poem = soup.find_all ('textarea')  # 得到<textarea>标签下的内容file=r'Data\train_jar\yongshi.txt'# 获取textarea标签中的内容for i in soup.find_all(re.compile('textarea')):str=''.join(i.text)# #列表->字符串str,_ = str.rsplit('https')# print(str)# 截取诗歌中的 题目,作者,内容content,str2 = str.rsplit('——')try :author,title = str2.rsplit('《')_, author =author.split('·')title,_ = title.split("》")except:continue# print(content) 查看诗歌内容with open(file,'a+') as f:# 以题目::作者::诗 的格式写入各个文件,一行一首诗f.write(title+"::"+author+"::"+content+'\n')f.close()if __name__ == '__main__':Get_url()

2、FastText文本分类模型

先对数据做清洗。根据《哈工大停用词表》去停用词,再过滤诗歌中的“,。!()《》”等特殊符号,并去除过长、过短诗歌。

Fasttext原理:

:表示一个句子的特征,初始值采用预训练的词向量

均值层的hidden: 的平均值

输出层:样本的标签

目标函数:

FastText文本分类模型,结合了自然语言处理和机器学习中最成功的理念。包括使用词袋和n-gram袋表征语句,还使用子字(subword)信息,并通过隐藏表征在类别间共享信息。另外采用了一个softmax层级,利用类别不均衡分布的优势来加速运算的过程。

FastText模型包含三部分,模型架构,层次softmax和n-gram特征。模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,FastText 预测的是标签,而 CBOW 模型是预测中间词。FastText 也利用了类别不均衡这个事实,通过使用 Huffman 算法建立用于表征类别的树形结构。

FastText做分类模型训练时格式:

'__label__'  + classtage(类型) + '\t'+ line(诗内容) + '\n'。

FastText分类主要使用train_supervised()函数,在此分类模型中设置以下参数:

input=path, 训练文件路径

epoch=25, 训练轮次

lr=1.0, 初始学习率

dim=100,向量维度

word_ngrams=2, n-gram 设置

minCount=1 ,最低词频

loss=”softmax” 损失函数类型

由分类模型进行分类后,最终得到各类诗歌:

边塞征战(28932首)、写景咏物(38078首)、山水田园(78294首)、思乡羁旅(70618首)、咏史怀古(81870首)

根据五类诗歌分别绘制了五类诗歌的云图:

在词云中字体显示越大,表示词在此类诗中出现频率越高。

从中可见排名前五的实词分别为:

边塞征战:“万里”、“将军”、“天子”、“四海”、“天下”

写景咏物:“春风”、“梅花”、“江南”、“东风”、“故人”

山水田园:“青山”、“白云”、“人间”、“归来”、“山水”

思乡羁旅:“春风”、“何处”、“故人”、“秋风”、“明月”

咏史怀古:“平生”、“风雨”、“千里”、“人间”、“功名”

可以看出,在每类诗歌中,出现频率较高的词,在一定程度上是能够反映出此类诗歌的主题色彩的,也说明诗歌的分类效果还是不错的。

Fasttext分类具体代码实现如下:

"""诗分类模型 ;Fasttext分类数据格式 :'__label__'  + classtage(类型) + '\t'+ line(诗内容) + '\n'
"""
from config import *
# 读取停用词
def read_Stopwords():# 加载停用词stop_word = []stop_path = 'Data/Stopwords.txt'with open (stop_path, 'r', encoding='utf-8') as stop_file:for line in stop_file:line = str (line.replace('\n', '').replace ('\r', '').split ())stop_word.append (line)stop_word = set (stop_word)  # 去重列表中重复的词汇return stop_word# 训练数据统一格式
def fileopems_file_deal(path, classtage):stop_word = read_Stopwords()path_name = pathrules = u'[\u4e00-\u9fa5]+' # 只是汉字的正则表达式,可以去除,。!()等特殊符号pattern = re.compile(rules)sentences = []with open(path_name, 'r', encoding = 'utf-8') as f_reader:for line in f_reader:line = line.replace('\n','').replace('\r',"").split()line = str(line)line = ' '.join(jieba.cut(line)) # 以空格来分词seg_list = pattern.findall(line)word_list = []for word in seg_list:if word not in stop_word:  # 去除停用词word_list.append(word)if len(word_list)> 0:sentences.append(word_list)line = ' '.join(word_list)f_write =open('Data/train_jar/shi.txt')line2 = '__label__' + classtage + '\t' + line + '\n'  # 统一Fasttext文本分类的格式f_write.write(line2)f_write.flush()  #强行把缓冲区中的内容放到磁盘中# 对数据进行训练产生模型   **.model文件
def fasttext_deal():path = r'Data/train_jar\shi.txt'# 生成模型model = fastText.train_supervised(input = path,wordNgrams = 2, verbose=2, minCount=1)# 保存模型path_save = 'Data/train_jar/class_shi.model'model.save_model(path_save)# 测试数据统一格式
def file_deal(test):stop_word = read_Stopwords()# 文本预处理sentecnces = []rules =u'[\u4e00-\u9fa5]+'pattern  =re.compile(rules)line =testline = line.replace('\r','').replace('\n','').split()line = str(line)line =' '.join(jieba.cut(line))seg_list = pattern.findall(line)word_list= []for word in seg_list:if word not in stop_word:word_list.append(word)  # 去除停用词if len(word_list)>0:  # 去除空行sentecnces.append(word_list)re_line = ' '.join(word_list) # 以空格来划分各各词return re_line# # 对各类训练数据进行统一格式处理---> 汇总写入shi.txt文件
def sum_filepoems_to_shi():path1 = 'Data/train_jar/biansai.txt'classtage1 = '边塞征战'fileopems_file_deal(path1, classtage1)path2 = 'Data/train_jar/jingwu.txt'classtage2 = '写景咏物'fileopems_file_deal(path2, classtage2)path3 = 'Data/train_jar/shanshui.txt'classtage3 = '山水田园'fileopems_file_deal(path3, classtage3)path4 = 'Data/train_jar/sixiang.txt'classtage4 = '思乡羁旅'fileopems_file_deal(path4, classtage4)path5 = 'Data/train_jar/yongshi.txt'classtage5 = '咏史怀古'fileopems_file_deal(path5,classtage5)if __name__ =='__main__':# 训练模型/加载模型save_path = 'Data/train_jar/class_shi.model'if os.path.exists('Data/train_jar/class_shi.model'):model = fastText.load_model(save_path)else: # 没有训练模型,先训练,再加载fasttext_deal()model = fastText.load_model(save_path)test_path = 'Data/train_jar/Whole_30w_poems.txt'  # 30w诗歌数据集# f_reader =open(test_path , 'r',encoding='utf-8')# 分类后数据写入各类文件class_path1 = "Data\Generate_poems_jar/biansai.txt"f_write1 = open (class_path1, 'a+', encoding='utf-8')class_path2 = "Data\Generate_poems_jar/jingwu.txt"f_write2 = open (class_path2, 'a+', encoding='utf-8')class_path3 = "Data\Generate_poems_jar/shanshui.txt"f_write3 = open (class_path3, 'a+', encoding='utf-8')class_path4 = "Data\Generate_poems_jar/sixiang.txt"f_write4 = open (class_path4, 'a+', encoding='utf-8')class_path5 = "Data\Generate_poems_jar/yongshi.txt"f_write5 = open (class_path5, 'a+', encoding='utf-8')with open(test_path,'r',encoding='utf-8') as f_reader:for line in f_reader:tests_str = file_deal(line)# print(tests_str)label = model.predict(tests_str) # 模型进行预测# label[0] 类别 label[1] 概率  label为元组value= str(label[0])if value ==  "('__label__边塞征战',)" :f_write1.write(line)f_write1.flush()elif value == "('__label__写景咏物',)" :f_write2.write(line)f_write2.flush()elif value == "('__label__山水田园',)" :f_write3.write(line)f_write3.flush()elif value == "('__label__思乡羁旅',)" :f_write4.write(line)f_write4.flush()elif value == "('__label__咏史怀古',)" :f_write5.write(line)f_write5.flush()

以上2段代码所应用到的工具库以及相应的个别参数设置,都在config.py文件中设置,并实现导入。

具体的完整代码请见Github链接:https://github.com/Whq123/Generate_Poems

自动写诗APP项目、基于python+Android实现(技术:LSTM+Fasttext分类+word2vec+Flask+mysql)第二节相关推荐

  1. 自动写诗APP项目、基于python+Android实现(技术:LSTM+Fasttext分类+word2vec+Flask+mysql)第三节

    二.用户主题词分类,相似词生成 1.word2vec模型原理 在主题词分类.候选词生成.选取时,都使用了word2vec模型.word2vec模型主要包含两部分:跳字模型(skip-gram)和连续词 ...

  2. 飞桨2.0应用案例教程 — 用BERT实现自动写诗

    用BERT实现自动写诗 作者:fiyen 日期:2021.06 摘要:本示例教程将会演示如何使用飞桨2.0以及PaddleNLP快速实现用BERT预训练模型生成高质量诗歌. 摘要 古诗,中华民族最高贵 ...

  3. Python数据分析初探项目 基于Python数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022年)

    Python 数据分析初探项目 基于 Python 数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022 年) Python 数据分析初探项目 基于 Python 数据可 ...

  4. 百度API实现自动写诗

    作者介绍 张琪,男,西安工程大学电子信息学院,2022级研究生 研究方向:机器视觉与人工智能 电子邮件:3126743452@qq.com 王泽宇,男,西安工程大学电子信息学院,2022级研究生,张宏 ...

  5. Pytorch+LSTM+AI自动写诗实战

    文章目录 1.数据集和任务定义 2.读取数据集 3.数据预处理 4.数据制作 5.定义网络结构: 6.测试网络 7.可视化 8.总结 1.数据集和任务定义 本次采用的是唐诗数据集,一共有接近60000 ...

  6. Springboot毕设项目基于WEB的延边旅游网 5jjp2java+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目基于WEB的延边旅游网 5jjp2java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + ...

  7. Springboot毕设项目基于springboot的模拟面试平台 7tch0java+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目基于springboot的模拟面试平台 7tch0java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomc ...

  8. springboot毕设项目基于Java酒店管理系统53blc(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目基于Java酒店管理系统53blc(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql ...

  9. Springboot毕设项目基于springboot的城市智能出行rota7java+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目基于springboot的城市智能出行rota7java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomca ...

  10. 微博app是用java写的吗_基于安卓Android第三方微博APP的设计(Eclipse)

    基于安卓Android第三方微博APP的设计(Eclipse)(论文11000字,程序代码) 摘要:Android系统是基于LINUX的手机操作系统,其最大的优势在于整个系统的开源性和免费性.本系统以 ...

最新文章

  1. python【蓝桥杯vip练习题库】BASIC-21Sine之舞(递归 递推)
  2. [置顶] 将项目从tomcat 迁移到JBoss
  3. JavaScript 同源策略
  4. 6.1 C/S 架构介绍
  5. webpack配置es6开发环境
  6. 人名和成绩一起排序_#excel中怎么让人名和他的成绩一起排序#excle排序 怎么弄同名次...
  7. php+mkdate,PHP时间工具种
  8. Scala中zip或者zipWithIndex的计数器用法
  9. 函数传参数_算法笔记(7)第二章C、C++快速入门函数,main函数,
  10. SAP License:ERP概述
  11. PHP入门part1
  12. 6.4 tensorflow2实现FNN推荐系统——Python实战(第一篇)
  13. 夏至海报设计素材,都分享在这里了
  14. 计算机怎样辅助英语听力教学,浅议多媒体计算机辅助大学英语教学的原则 大学英语听力怎么提高...
  15. Android Studio代码提示自动补全设置
  16. 基于大数据的精准营销与应用场景
  17. ubuntu中自带的ufw防火墙
  18. oracle数据库监听说法正确,Oracle数据库错题合集
  19. ACM上一些常见问题解答
  20. 【ROS】将odom里程计数据转换为path路径消息

热门文章

  1. word参考文献格式设置(国标下载)
  2. Andriod 实现可拖动列表
  3. 典型飞行控制系统的回路构成
  4. 四旋翼飞行器避障系统基础
  5. 矩阵乘法(幂次计算)
  6. python菜鸟教程w-【读书】Django教程(菜鸟教程)
  7. 2021深度学习目标检测综述
  8. jackson dataformat yaml简介及使用
  9. 计算机软件可以控制单片机,一个电脑控制单片机通讯程序分享
  10. 当python撞上echarts时 add各个图形参数