英文诗歌数据-绘制英文词云图+英文本文分类(pytorch)

英文诗歌数据-绘制词云图+本文分类

本项目包含:
1.文本处理
2.词云图绘制
3.文本分类
往期文章可以关注我的专栏
下巴同学的数据加油小站
或者关注CSDN
会不定期分享数据挖掘、机器学习、风控模型、深度学习、NLP等方向的学习项目

数据和完整代码文末链接可以下载

一、导入数据、检查数据

import torch
from torch.utils.data import random_split
import pandas as pd
import numpy as np
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

导入训练集

train_data = pd.read_csv('/home/mw/input/data6487/Poem_classification - train_data.csv')
train_data.head()
Genre	Poem
0	Music	NaN
1	Music	In the thick brushthey spend the...
2	Music	Storms are generous.                       ...
3	Music	—After Ana Mendieta Did you carry around the ...
4	Music	for Aja Sherrard at 20The portent may itself ...

检查训练集

train_data.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 841 entries, 0 to 840
Data columns (total 2 columns):#   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 0   Genre   841 non-null    object1   Poem    837 non-null    object
dtypes: object(2)
memory usage: 13.3+ KB
train_data = train_data.dropna() 
train_data = train_data.reset_index(drop=True)
train_data
Genre	Poem
0	Music	In the thick brushthey spend the...
1	Music	Storms are generous.                       ...
2	Music	—After Ana Mendieta Did you carry around the ...
3	Music	for Aja Sherrard at 20The portent may itself ...
4	Music	for Bob Marley, Bavaria, November 1980 Here i...
...	...	...
832	Environment	Why make so much of fragmentary blue In here a...
833	Environment	Woman, I wish I didn't know your name. What co...
834	Environment	Yonder to the kiosk, beside the creek, Paddle ...
835	Environment	You come to fetch me from my work to-night Whe...
836	Environment	You see them through water and glass, (both li...
train_data['Genre'].value_counts()
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inlinefig,ax = plt.subplots(figsize=(6,4), dpi=80)
sns.countplot(x=train_data['Genre'],  edgecolor="black", alpha=0.7, data=train_data)
sns.despine()
plt.title("Distribution of the number of poetry genres")
plt.tight_layout()
for p in ax.patches:ax.annotate(f'\n{p.get_height()}', (p.get_x(), p.get_height()+5), color='black', size=10)

在这里插入图片描述
测试集部分省略,操作相同

二、词云图

from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
from PIL import Image
background_image = np.array(Image.open("/home/mw/project/p.jpg"))
fig,ax = plt.subplots(figsize=(12,8), dpi=100)
stopwords = STOPWORDS
stopwords.add('S')
mytext = ''
for i in range(len(test_data)):mytext += test_data['Poem'][i]
for j in range(len(train_data)):mytext += train_data['Poem'][j]
wcloud = WordCloud(width=2400, height=1600,background_color="white",stopwords=stopwords,mask = background_image).generate(mytext)plt.imshow(wcloud)
plt.axis('off')

在这里插入图片描述

三、文本分类

处理文本

import re
def handle_data(data):X = data['Poem']y = data['Genre']tv_data = []label = []for i in range(len(X)):r = '[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\n。!,—]+'temp = X[i].replace('\n', '')temp = re.sub(r, '', temp)tv_data.append(temp)if y[i] == 'Music':label.append(0)elif y[i] == 'Death':label.append(1)elif y[i] == 'Environment':label.append(2)elif y[i] == 'Affection':label.append(3)          return tv_data,label
X_train,y_train = handle_data(train_data)
X_test,y_test = handle_data(test_data)

构建字典

word_list = " ".join(X_train+X_test).split()
word_list = list(set(word_list))
word_dict = {w: i for i, w in enumerate(word_list)}

构建数据集

def transform(sentence, max_len=256):"""把句子转换为数字序列:param sentence::param max_len: 句子的最大长度:return:"""if len(sentence) > max_len:# 句子太长时进行截断sentence = sentence[:max_len]else:# 句子长度不够标准长度时,进行填充sentence = sentence + [0] * (max_len - len(sentence))# print(sentence)return sentencex_input = [np.asarray(transform([word_dict[n] for n in sen.split()])) for sen in X_train]
x_input_test = [np.asarray(transform([word_dict[n] for n in sen.split()])) for sen in X_test]
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoadertrain_inputs = torch.LongTensor(x_input)
train_labels = torch.LongTensor([out for out in y_train]) 
test_inputs = torch.LongTensor(x_input_test)
test_labels = torch.LongTensor([out for out in y_test]) 
# 加载训练数据集
dataset = TensorDataset(train_inputs, train_labels)
train_size = int(len(dataset) * 0.8)
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset=dataset,lengths=[train_size,val_size],generator=torch.Generator().manual_seed(2022)) #分割验证和训练集
test_dataset = TensorDataset(test_inputs, test_labels)
# # 加载测试数据集
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True,drop_last=False)
val_loader = DataLoader(val_dataset, batch_size=64, shuffle=True,drop_last=False)
test_loader = DataLoader(test_dataset)

模型构建、编译、训练

class MyModel(nn.Module):def __init__(self, vocab_size, embedding_dim, num_filter,filter_sizes, output_dim, dropout=0.5, pad_idx=0):super().__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.convs = nn.ModuleList([nn.Conv2d(in_channels=1, out_channels=num_filter,kernel_size=(fs, embedding_dim))for fs in filter_sizes])# in_channels:输入的channel,文字都是1# out_channels:输出的channel维度# fs:每次滑动窗口计算用到几个单词,相当于n-gram中的n# for fs in filter_sizes用好几个卷积模型最后concate起来看效果。self.fc = nn.Linear(len(filter_sizes) * num_filter, output_dim)self.dropout = nn.Dropout(dropout)def forward(self, text):embedded = self.dropout(self.embedding(text))  # [batch size, sent len, emb dim]embedded = embedded.unsqueeze(1)  # [batch size, 1, sent len, emb dim]# 升维是为了和nn.Conv2d的输入维度吻合,把channel列升维。conved = [F.relu(conv(embedded)).squeeze(3) for conv in self.convs]# conved = [batch size, num_filter, sent len - filter_sizes+1]# 有几个filter_sizes就有几个convedpooled = [F.max_pool1d(conv, conv.shape[2]).squeeze(2) for conv in conved]  # [batch,num_filter]cat = self.dropout(torch.cat(pooled, dim=1))# cat = [batch size, num_filter * len(filter_sizes)]# 把 len(filter_sizes)个卷积模型concate起来传到全连接层。return self.fc(cat)
vocab_size = len(word_dict)  # 词典数量
dmodel = 128  # embedding层词向量num_filter = 100  # 卷积核个数
filter_size = [2, 3, 4]  # 卷积核的长
output_dim = 4  # 种类device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# device = torch.device("cpu")model = MyModel(vocab_size+1, dmodel, num_filter=num_filter, filter_sizes=filter_size, output_dim=output_dim).to(device)
# 训练循环
def train(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset)  # 训练集的大小num_batches = len(dataloader)   # 批次数目, (size/batch_size,向上取整)train_loss, train_acc = 0, 0  # 初始化训练损失和正确率for X, y in dataloader:  # 获取图片及其标签X, y = X.to(device), y.to(device)# 计算预测误差pred = model(X)          # 网络输出loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失# 反向传播optimizer.zero_grad()  # grad属性归零loss.backward()        # 反向传播optimizer.step()       # 每一步自动更新# 记录acc与losstrain_acc  += (pred.argmax(1) == y).type(torch.float).sum().item()train_loss += loss.item()train_acc  /= sizetrain_loss /= num_batchesreturn train_acc, train_loss
def test (dataloader, model, loss_fn):size        = len(dataloader.dataset)  # 测试集的大小num_batches = len(dataloader)          # 批次数目, (size/batch_size,向上取整)test_loss, test_acc = 0, 0# 当不进行训练时,停止梯度更新,节省计算内存消耗with torch.no_grad():for texts, target in dataloader:texts, target = texts.to(device), target.to(device)# 计算losstarget_pred = model(texts)loss        = loss_fn(target_pred, target)test_loss += loss.item()test_acc  += (target_pred.argmax(1) == target).type(torch.float).sum().item()test_acc  /= sizetest_loss /= num_batchesreturn test_acc, test_loss
learn_rate = 1e-2 # 初始学习率
lambda1 = lambda epoch: 0.96 ** (epoch // 5)
optimizer = torch.optim.Adam(model.parameters(), lr=learn_rate)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1) 
import copyloss_fn    = nn.CrossEntropyLoss() # 创建损失函数
epochs     = 15train_loss = []
train_acc  = []
test_loss  = []
test_acc   = []best_acc = 0    # 设置一个最佳准确率,作为最佳模型的判别指标for epoch in range(epochs):# 更新学习率(使用自定义学习率时使用)# adjust_learning_rate(optimizer, epoch, learn_rate)model.train()epoch_train_acc, epoch_train_loss = train(train_loader, model, loss_fn, optimizer)scheduler.step() # 更新学习率(调用官方动态学习率接口时使用)model.eval()epoch_test_acc, epoch_test_loss = test(val_loader, model, loss_fn)# 保存最佳模型到 best_modelif epoch_test_acc > best_acc:best_acc   = epoch_test_accbest_model = copy.deepcopy(model)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)# 获取当前的学习率lr = optimizer.state_dict()['param_groups'][0]['lr']template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Val_acc:{:.1f}%, Val_loss:{:.3f}, Lr:{:.2E}')print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr))# 保存最佳模型到文件中
PATH = './best_model.pth'  # 保存的参数文件名
torch.save(model.state_dict(), PATH)print('Done')
Epoch: 1, Train_acc:24.8%, Train_loss:3.782, Val_acc:23.2%, Val_loss:2.095, Lr:1.00E-02
Epoch: 2, Train_acc:27.5%, Train_loss:2.289, Val_acc:26.2%, Val_loss:1.579, Lr:1.00E-02
Epoch: 3, Train_acc:27.5%, Train_loss:2.020, Val_acc:26.8%, Val_loss:1.707, Lr:1.00E-02
Epoch: 4, Train_acc:31.1%, Train_loss:1.735, Val_acc:28.6%, Val_loss:1.429, Lr:1.00E-02
Epoch: 5, Train_acc:32.9%, Train_loss:1.639, Val_acc:22.6%, Val_loss:1.555, Lr:1.00E-02
Epoch: 6, Train_acc:31.8%, Train_loss:1.616, Val_acc:28.0%, Val_loss:1.427, Lr:1.00E-02
Epoch: 7, Train_acc:35.7%, Train_loss:1.494, Val_acc:34.5%, Val_loss:1.386, Lr:1.00E-02
Epoch: 8, Train_acc:38.4%, Train_loss:1.476, Val_acc:29.2%, Val_loss:1.424, Lr:1.00E-02
Epoch: 9, Train_acc:37.4%, Train_loss:1.487, Val_acc:29.8%, Val_loss:1.526, Lr:1.00E-02
Epoch:10, Train_acc:42.0%, Train_loss:1.448, Val_acc:28.0%, Val_loss:1.500, Lr:1.00E-02
Epoch:11, Train_acc:47.5%, Train_loss:1.397, Val_acc:33.3%, Val_loss:1.682, Lr:1.00E-02
Epoch:12, Train_acc:45.7%, Train_loss:1.489, Val_acc:28.6%, Val_loss:1.716, Lr:1.00E-02
Epoch:13, Train_acc:52.8%, Train_loss:1.295, Val_acc:29.8%, Val_loss:1.511, Lr:1.00E-02
Epoch:14, Train_acc:54.3%, Train_loss:1.202, Val_acc:34.5%, Val_loss:1.620, Lr:1.00E-02
Epoch:15, Train_acc:63.2%, Train_loss:0.997, Val_acc:25.6%, Val_loss:1.785, Lr:1.00E-02
Done

可视化训练损失和精度

过拟合严重,主要是由于数据量太小,参数我也没有仔细调整
在这里插入图片描述

使用测试集评估

acc能达到0.4333,还需要调优

model.eval()
epoch_test_acc, epoch_test_loss = test(test_loader, best_model, loss_fn)
epoch_test_acc, epoch_test_loss

(0.43333333333333335, 1.4856029596428078)

数据和完整代码

有需求可以点击下方链接,fork后可以获取所有代码

fork后获取完整代码,可在线运行

数据也上传了csdn一份
数据下载链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66517.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyNLP玩转文本摘要(新闻标题)生成

作者&#xff1a;王明、黄俊 导读 文本生成是自然语言处理领域的一个重要研究方向&#xff0c;具有丰富的实际应用场景以及研究价值。其中&#xff0c;生成式文本摘要作为文本生成的一个重要子任务&#xff0c;在实际应用场景中&#xff0c;包括新闻标题生成、摘要生成、关键词…

微信聊天记录生成词云图

微信聊天记录生成词云图 基本材料准备 电脑微信客户端、手机微信客户端、电脑mumu安卓模拟器&#xff08;安装微信和RE文件管理器&#xff09;、sqlcipher.exe、idea 获取微信聊天记录 电脑微信客户端备份聊天记录 微信左下角点击备份与恢复按钮出现如下弹窗 然后点击左侧…

txt文件英语单词词频统计

目录 一、需求分析 二、相关库列表 三、代码在此 四、一些问题 一、需求分析 把txt文件里的英语单词按照出现次数排序并生成csv文件&#xff0c;如果次数相同按照单词的md5值来排序 二、相关库列表 pandasrecollectionshashlib 三、代码在此 打开文件 txt_file open(f…

从文本中提取单词生成单词本

词频统计及单词提取 对一段英文文本做词频统计&#xff0c;提取单词&#xff0c;查词&#xff0c;最终生成一个单词本&#xff0c;生成的单词本可以导入Anki中学习。 问题分析 考虑到单词的变形&#xff0c;分词后先做词形还原&#xff0c;之后再进行词频统计。去除掉较为简…

给英文文章加音标,建生词表

先上个效果图 10. Thats WhyJimmy/ˈʤɪmi/ 吉米more/mɔː/ adj.更多的adv.更started/ˈstɑːtɪd/[start]v.开始&#xff0c;着手&#xff0c;发动were/wɜː/ (be/biː/ was/were been) v.是&#xff0c;存在painting/ˈpeɪntɪŋ/ n.画&#xff0c;绘画(艺术)different/…

生词提取方法,学以致用(用于生成学习计划)

为了能够更加便捷的吸收英文文章的养分,从下周开始,计划边读文章,边学习。在拿到一片英文材料后,首先识别其中已经知道的单词,然后识别自己不会的单词。根据不会的单词制定单词学习计划。单词掌握以后,学习内容,既确保学以致用,又确保能够吸收到优秀文章的养分。 我的初…

英语词缀与英语派生词词典读书笔记,并总结输出思维导图

大部分构词法知识在词根章节已说到&#xff0c;这里以词缀相关知识点作为重点讲述&#xff1b; 本文摘抄总结于 “英语词缀与英语派生词词典 - 李武平“ 往期文章&#xff1a; 英语词根与说文解字词典读书笔记&#xff0c;并总结输出思维导图 目录 思维导图 一、词缀概述…

英语ai文章生成器,英语文章生成器在线

英语AI文章生成器是一种基于人工智能技术的语言处理工具&#xff0c;能够自动生成各类英语文章。然而&#xff0c;由于其自动化特性&#xff0c;有时候生成的文章可能存在一些问题&#xff0c;比如语法错误、逻辑不清等。那么&#xff0c;如何提高英语AI文章生成器的写作质量呢…

文本挖掘之WordCloud+Python3快速生成中英文词云图

引言: “词云”&#xff0c;又称文字云&#xff0c;是由词汇组成类似云的彩色图形。可对网络文本中出现频率较高的“关键词”予以视觉上的突出&#xff0c;形成"关键词云层"或"关键词渲染"&#xff0c;从而过滤掉大量的文本信息&#xff0c;使浏览网页者只…

python统计文章中高频词汇并生成词云

LZ的同事写的文章经常被公司或者上级部门发表&#xff0c;LZ对此觉得同事写的文章一定有什么套路或者经常使用的词句&#xff0c;所以LZ收集了6篇同事的文章希望统计出其文章的高频词语以此可以效仿。 首先&#xff0c;把6篇文章放在同一个Text文档中&#xff0c;准备好词云需…

掌阅科技让数字化阅读更便捷

阅读是快速让人提高的方法,不需要你花很多的钱只需要你沉下心耐着性子从书中得到知识与经验,掌阅科技作为一家在国内领先的数字化阅读平台更是为无数爱好阅读的人提供便利。古书有云“书中自有颜如玉,书中自有黄金屋”。现在社会的阅读可能没有颜如玉和黄金屋,但是阅读还是可以…

掌阅科技与厦门航空联合推出首个机上阅读服务“天际悦读”

【TechWeb】6月27日消息&#xff0c;掌阅科技和厦门航空今日联合宣布&#xff0c;将推出全国首个常态化空中阅读服务“天际阅读”。 厦门航空空中乘务部副总经理张玉晶指出&#xff0c;厦航经过对旅客画像、出行习惯与需求&#xff0c;以及行业发展趋势的综合分析后&#xff0c…

高清3D人体解剖图谱

目前见过的高清3D人体模型最好的一个了&#xff0c;截图供大家欣赏&#xff0c;这个可能我通过微信传的时候像素有损失&#xff0c;大家大量&#xff0c;我截取的当然也只有平面图&#xff0c;3D的效果&#xff0c;请恕我的无能&#xff0c;还不知道3D的人体模型要怎么截取。话…

PXI机箱大解剖

上一节给大家介绍了PXI的背景和历史&#xff0c;让我们对PXI的起源有了更多的认识。同时对PXI机箱做了初步介绍。本节将会从10个方面为大家详细解剖PXI机箱。 PXI槽位序号 每一个PXI槽位都有一个对应的槽位号(大部分情况下)被标注在PXI插槽下方。一般为从左到右排列。 图1.3…

经典大脑解剖网站大全

本文首发在个人博客上&#xff08;7988888.xyz&#xff09;&#xff0c;此文章中所有链接均通过博客进行访问。 根据互联网公开资源&#xff0c;整理了部分大脑解剖学习资源网站&#xff0c;仅供学习参考。 在脑科学的研究中&#xff0c;大脑解剖学知识的了解是必不可少的&am…

视网膜生理解剖

Cornea&#xff1a;角膜 Pupil&#xff1a;瞳孔 Lris&#xff1a;虹膜 Lens&#xff1a;晶状体 Retina&#xff1a;视网膜 Macula&#xff1a;黄斑 Optic nerve&#xff1a;视神经 视网膜&#xff08;retina&#xff09;居于眼球壁的内层&#xff0c;是一层透明的薄膜。视网膜…

Maven仓库解剖

介绍 分类 项目从仓库找包顺序 各个仓库的介绍 本地仓库 私服 nexus私服 阿里云云效制品仓库 中央仓库 公共仓库 演示 介绍 所谓的maven仓库&#xff0c;其实就是存放各个依赖包的文件夹&#xff0c;maven不仅是构建工具和依赖管理工具以及项目信息管理工具&#xff…

冠状动脉解剖(CTA)

以下的认知&#xff0c;也是通过其他的文章东挪西凑出来的&#xff0c;结合自己的理解归纳一下。后续还会更正&#xff0c;也望大家指正。 1 基本概念 左冠状动脉&#xff08;Left Coronary artery&#xff09; 左冠状动脉主干&#xff1a;Left Main Artery&#xff08;LM&a…

解剖常见电子元器件,了解其内部结构

作者&#xff1a;TubeTimeUS 排版&#xff1a;晓宇 看一下LED&#xff0c;电阻&#xff0c;电容&#xff0c;二极管等这些迷人且很有教育意义的横截面&#xff0c;喜欢请留言点赞并转发&#xff0c;感谢芯片之家小伙伴的支持&#xff01; 1、电容 这是表面贴装电容的横截面&am…

大脑解剖图(纯图片)

因为上一个排版有问题&#xff0c;本来是左图右字的&#xff0c;但是它一发布就全都乱套了&#xff0c;修改了很多次也没改成&#xff0c;所以就截图重新发布了一个。 图片均来自《神经科学——探索脑》中文版&#xff08;第2版&#xff09;一书&#xff0c;Mark F.Bear [美]…