关于新闻主题分类任务:

以一段新闻报道中的文本描述内容为输入, 使用模型帮助我们判断它最有可能属于哪一种类型的新闻, 这是典型的文本分类问题, 我们这里假定每种类型是互斥的, 即文本描述有且只有一种类型.

整个案例的实现可分为以下4个步骤
第一步: 构建带有Embedding层的文本分类模型.
第二步: 对数据进行batch处理.
第三步: 构建训练与验证函数.
第四步: 进行模型训练和验证

# 导入相关的torch工具包
import torch
import torchtext
# 导入torchtext.datasets中的文本分类任务
from torch.ao.sparsity import scheduler
from torch.optim import optimizer
from torchtext.datasets import AG_NEWS
import os# 定义数据下载路径, 当前路径的data文件夹
load_data_path = "./data"
# 如果不存在该路径, 则创建这个路径
if not os.path.isdir(load_data_path):os.mkdir(load_data_path)# 选取torchtext中的文本分类数据集'AG_NEWS'即新闻主题分类数据, 保存在指定目录下
# 并将数值映射后的训练和验证数据加载到内存中
# train_dataset, test_dataset = torchtext.datasets.AG_NEWS(root='.data', split=('train', 'test'))
train_dataset, test_dataset = torchtext.datasets.AG_NEWS(root='./data/ag_news_csv/', split=('train', 'test'))# 导入必备的torch模型构建工具
import torch.nn as nn
import torch.nn.functional as F# 指定BATCH_SIZE的大小
BATCH_SIZE = 16# 进行可用设备检测, 有GPU的话将优先使用GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")class TextSentiment(nn.Module):"""文本分类模型"""def __init__(self, vocab_size, embed_dim, num_class):"""description: 类的初始化函数:param vocab_size: 整个语料包含的不同词汇总数:param embed_dim: 指定词嵌入的维度:param num_class: 文本分类的类别总数"""super().__init__()# 实例化embedding层, sparse=True代表每次对该层求解梯度时, 只更新部分权重.self.embedding = nn.Embedding(vocab_size, embed_dim, sparse=True)# 实例化线性层, 参数分别是embed_dim和num_class.self.fc = nn.Linear(embed_dim, num_class)# 为各层初始化权重self.init_weights()def init_weights(self):"""初始化权重函数"""# 指定初始权重的取值范围数initrange = 0.5# 各层的权重参数都是初始化为均匀分布self.embedding.weight.data.uniform_(-initrange, initrange)self.fc.weight.data.uniform_(-initrange, initrange)# 偏置初始化为0self.fc.bias.data.zero_()def forward(self, text):""":param text: 文本数值映射后的结果:return: 与类别数尺寸相同的张量, 用以判断文本类别"""# 获得embedding的结果embedded# >>> embedded.shape# (m, 32) 其中m是BATCH_SIZE大小的数据中词汇总数embedded = self.embedding(text)# 接下来我们需要将(m, 32)转化成(BATCH_SIZE, 32)# 以便通过fc层后能计算相应的损失# 首先, 我们已知m的值远大于BATCH_SIZE=16,# 用m整除BATCH_SIZE, 获得m中共包含c个BATCH_SIZEc = embedded.size(0) // BATCH_SIZE# 之后再从embedded中取c*BATCH_SIZE个向量得到新的embedded# 这个新的embedded中的向量个数可以整除BATCH_SIZEembedded = embedded[:BATCH_SIZE*c]# 因为我们想利用平均池化的方法求embedded中指定行数的列的平均数,# 但平均池化方法是作用在行上的, 并且需要3维输入# 因此我们对新的embedded进行转置并拓展维度embedded = embedded.transpose(1, 0).unsqueeze(0)# 然后就是调用平均池化的方法, 并且核的大小为c# 即取每c的元素计算一次均值作为结果embedded = F.avg_pool1d(embedded, kernel_size=c)# 最后,还需要减去新增的维度, 然后转置回去输送给fc层return self.fc(embedded[0].transpose(1, 0))# 获得整个语料包含的不同词汇总数
VOCAB_SIZE = len(train_dataset.get_vocab())
# 指定词嵌入维度
EMBED_DIM = 32
# 获得类别总数
NUN_CLASS = len(train_dataset.get_labels())
# 实例化模型
model = TextSentiment(VOCAB_SIZE, EMBED_DIM, NUN_CLASS).to(device)def generate_batch(batch):"""description: 生成batch数据函数:param batch: 由样本张量和对应标签的元组组成的batch_size大小的列表形如:[(label1, sample1), (lable2, sample2), ..., (labelN, sampleN)]return: 样本张量和标签各自的列表形式(张量)形如:text = tensor([sample1, sample2, ..., sampleN])label = tensor([label1, label2, ..., labelN])"""# 从batch中获得标签张量label = torch.tensor([entry[0] for entry in batch])# 从batch中获得样本张量text = [entry[1] for entry in batch]text = torch.cat(text)# 返回结果return text, label# 导入torch中的数据加载器方法
from torch.utils.data import DataLoaderdef train(train_data):"""模型训练函数"""# 初始化训练损失和准确率为0train_loss = 0train_acc = 0# 使用数据加载器生成BATCH_SIZE大小的数据进行批次训练# data就是N多个generate_batch函数处理后的BATCH_SIZE大小的数据生成器data = DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True,collate_fn=generate_batch)# 对data进行循环遍历, 使用每个batch的数据进行参数更新for i, (text, cls) in enumerate(data):# 设置优化器初始梯度为0optimizer.zero_grad()# 模型输入一个批次数据, 获得输出output = model(text)# 根据真实标签与模型输出计算损失loss = criterion(output, cls)# 将该批次的损失加到总损失中train_loss += loss.item()# 误差反向传播loss.backward()# 参数进行更新optimizer.step()# 将该批次的准确率加到总准确率中train_acc += (output.argmax(1) == cls).sum().item()# 调整优化器学习率scheduler.step()# 返回本轮训练的平均损失和平均准确率return train_loss / len(train_data), train_acc / len(train_data)def valid(valid_data):"""模型验证函数"""# 初始化验证损失和准确率为0loss = 0acc = 0# 和训练相同, 使用DataLoader获得训练数据生成器data = DataLoader(valid_data, batch_size=BATCH_SIZE, collate_fn=generate_batch)# 按批次取出数据验证for text, cls in data:# 验证阶段, 不再求解梯度with torch.no_grad():# 使用模型获得输出output = model(text)# 计算损失loss = criterion(output, cls)# 将损失和准确率加到总损失和准确率中loss += loss.item()acc += (output.argmax(1) == cls).sum().item()# 返回本轮验证的平均损失和平均准确率return loss / len(valid_data), acc / len(valid_data)# 导入时间工具包
import time# 导入数据随机划分方法工具
from torch.utils.data.dataset import random_split# 指定训练轮数
N_EPOCHS = 10# 定义初始的验证损失
min_valid_loss = float('inf')# 选择损失函数, 这里选择预定义的交叉熵损失函数
criterion = torch.nn.CrossEntropyLoss().to(device)
# 选择随机梯度下降优化器
optimizer = torch.optim.SGD(model.parameters(), lr=4.0)
# 选择优化器步长调节方法StepLR, 用来衰减学习率
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, 1, gamma=0.9)# 从train_dataset取出0.95作为训练集, 先取其长度
train_len = int(len(train_dataset) * 0.95)# 然后使用random_split进行乱序划分, 得到对应的训练集和验证集
sub_train_, sub_valid_ = \random_split(train_dataset, [train_len, len(train_dataset) - train_len])# 开始每一轮训练
for epoch in range(N_EPOCHS):# 记录概论训练的开始时间start_time = time.time()# 调用train和valid函数得到训练和验证的平均损失, 平均准确率train_loss, train_acc = train(sub_train_)valid_loss, valid_acc = valid(sub_valid_)# 计算训练和验证的总耗时(秒)secs = int(time.time() - start_time)# 用分钟和秒表示mins = secs / 60secs = secs % 60# 打印训练和验证耗时,平均损失,平均准确率print('Epoch: %d' %(epoch + 1), " | time in %d minutes, %d seconds" %(mins, secs))print(f'\tLoss: {train_loss:.4f}(train)\t|\tAcc: {train_acc * 100:.1f}%(train)')print(f'\tLoss: {valid_loss:.4f}(valid)\t|\tAcc: {valid_acc * 100:.1f}%(valid)')

新闻主题分类任务NLP相关推荐

  1. 【NLP】文本分类TorchText实战-AG_NEWS 新闻主题分类任务(PyTorch版)

    AG_NEWS 新闻主题分类任务(PyTorch版) 前言 1. 使用 N 元组加载数据 2. 安装 Torch-GPU&TorchText 3. 访问原始数据集迭代器 4. 准备数据处理管道 ...

  2. 朴素贝叶斯进行新闻主题分类,有代码和数据,可以跑通

    folder_path = '/Users/apple/Documents/七月在线/NLP/第2课/Lecture_2/Naive-Bayes-Text-Classifier/Database/So ...

  3. 自然语言处理项目之新闻主题分类Python实现

    ''' #2018-06-10 June Sunday the 23 week, the 161 day SZ 数据来源:链接:https://pan.baidu.com/s/1_w7wOzNkUEa ...

  4. 【深度学习】单标签多分类问题之新闻主题分类

    # -*- coding: utf-8 -*- """单标签多分类问题之新闻主题分类.ipynbAutomatically generated by Colaborato ...

  5. 新闻主题分类任务——torchtext 库进行文本分类

    目录 简介 导入相关的torch工具包 访问原始数据集迭代器 使用原始训练数据集构建词汇表 生成数据批处理和迭代器 定义模型 定义函数来训练模型和评估结果 实例化并运行模型 使用测试数据集评估模型 测 ...

  6. 基于LSTM的美国大选的新闻真假分类【NLP 新年开胃菜】

    简介 新闻媒体已成为向世界人民传递世界上正在发生的事情的信息的渠道. 人们通常认为新闻中传达的一切都是真实的. 在某些情况下,甚至新闻频道也承认他们的新闻不如他们写的那样真实. 但是,一些新闻不仅对人 ...

  7. Fasttext(AG数据集---新闻主题分类)

    文章目录 Fasttext 一.文件目录 二.语料集下载地址(本文选择AG) 三.数据处理(AG_Dataset.py) 四.模型(Fasttext.py) 五.训练和测试 实验结果 Fasttext ...

  8. 零基础入门NLP - 天池新闻文本分类Task3笔记

    零基础入门NLP - 天池新闻文本分类 以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记 赛题链接:https://tianchi.aliyun.com/co ...

  9. 【项目实战课】NLP入门第1课,人人免费可学,基于TextCNN的新闻文本分类实战...

    欢迎大家来到我们的项目实战课,本期内容是<基于TextCNN的新闻文本分类实战>. 所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解,可以 ...

最新文章

  1. leetcode 38. 外观数列 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下
  2. java异常日志不要只打一半,要输出全部错误信息
  3. Eclipse如何关闭在RUN/DEBUG时弹出窗口?
  4. 最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx必须手动编译下指定的图片文件生成R.
  5. Power BI中的AI语义分析应用:《辛普森一家》
  6. XGBoost算法原理
  7. GoogleNews-vectors-negative300.bin文件下载
  8. Houdini输出ABC到UE4识别材质
  9. 打印时显示预服务器,域服务器如何设置打印机
  10. Java中的按拼音排序
  11. 重置CAD 或者Civil 3d的所有环境
  12. Shellshock漏洞复现
  13. 利用 Python 分析 MovieLens 1M 数据集
  14. 阿里P8耗时3年,总结的Java面试复盘手册,带你挑战50万年薪
  15. 巅峰对决:node.js和php性能测试
  16. 简单使用的MQTT调试软件
  17. 一维信号小波阈值去噪
  18. JDK9 的字符串底层原理是什么?
  19. Python批量处理jpg转换为bmp图片,告别手动转换,真爽,
  20. 威胁手游安全,这些知识点你要了解看看!

热门文章

  1. kali2021安装GVM(openVAS)
  2. 操作系统笔记 第二章
  3. 重装系统(win10企业版)
  4. 林肯公园(LINKIN PARK)上海演唱会观众座位表(转帖)
  5. 2007林肯公园上海演唱会观后感(实况像片/MP3) update:2008.1.31
  6. DAO组织决定风险投资,Tiger DAO VC善用群体的智慧
  7. Objective-C简介
  8. python常用的量化金融库
  9. 中国量化金融行业 全解 金融工程 计算机 统计学 金融 专业领域 就业指南
  10. 新型冠状病毒传染模型SI、SIS、SIR、SEIR