【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

2023-11-06

系列文章目录

1. 文本分类与词嵌入表示,mlp来处理分类问题
2. RNN、LSTM、GRU三种方式处理文本分类问题
3. 评论情绪分类
还是得开个坑,最近搞论文,使用lstm做的ssd的cache prefetching,意味着我不能再划水了。


1. 文本数据表示法与词嵌入

torch 是做张量计算的框架,张量只能存储数字类型的值,因此无论啥样的文本(中文、英文)都不能直接用张量表示,这就引出了文本数据的表示问题,如何表示文本数据?

1.1 文本是什么,如何表示?

文本是常用的序列化数据类型之一。文本数据可以看作是一
个字符序列或词的序列。对大多数问题,我们都将文本看作
词序列。
深度学习序列模型(如RNN及其变体)能够较好的对序列化
数据建模。
深度学习序列模型(如RNN及其变体)可以解决类似以下领
域中的问题:自然语言理解、文献分类、情感分类、问答系统等。

深度学习模型并不能理解文本,因此需要将文本转换为数值
的表示形式。

将文本转换为数值表示形式的过程称为向量化过程,可以用
不同的方式来完成,

词嵌入是单词的一种数值化表示方式,一般情况下会将一个单词映射到一个高维的向量中(词向量)
来代表这个单词

‘机器学习’表示为 [1, 2, 3]
‘深度学习’表示为 [1, 3, 3]
‘日月光华’表示为 [9, 9, 6]
对于词向量,我们可以使用余弦相似度在计算机中来判断
单词之间的距离。
词嵌入用密集的分布式向量来表示每个单词。词向量表示方式依赖于单词的使用习惯,这就使得具有相似使用方式的单词具有相似的表示形式。

Glove算法是对word2vec方法的拓展,并且更为有效。

1.2 文本的词嵌入表示处理流程

每个较小的文本单元称为token,将文本分解成token的过程称为分词(tokenization)。在 Python中有很多强大的库可以用来进行分词.
one-hot(独热)编码和词嵌入是将token映射到向量最流行的两种方法。

1.3 代码展示分词过程

import torch
import numpy as np
import string
s = "Life is not easy for any of us.We must work,and above all we must believe in ourselves.We must believe that each one of us is able to do some thing well.And that we must work until we succeed."
string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
for c in string.punctuation:
    s = s.replace(c," ").lower()
去掉标点符号
s

'life is not easy for any of us we must work and above all we must believe in ourselves we must believe that each one of us is able to do some thing well and that we must work until we succeed ’

s.split()
['life',
 'is',
 'not',
 'easy',
 'for',
 'any',
 'of',
 'us',
 'we',
 'must',
 'work',
 'and',
 'above',
 'all',
 'we',
 'must',
 'believe',
 'in',
 'ourselves',
 'we',
 'must',
 'believe',
 'that',
 'each',
 'one',
 'of',
 'us',
 'is',
 'able',
 'to',
 'do',
 'some',
 'thing',
 'well',
 'and',
 'that',
 'we',
 'must',
 'work',
 'until',
 'we',
 'succeed']

分词方式(三):n-gram
向量化:one-hot emdeding

import numpy as np
np.unique(s.split())

array([‘able’, ‘above’, ‘all’, ‘and’, ‘any’, ‘believe’, ‘do’, ‘each’,
‘easy’, ‘for’, ‘in’, ‘is’, ‘life’, ‘must’, ‘not’, ‘of’, ‘one’,
‘ourselves’, ‘some’, ‘succeed’, ‘that’, ‘thing’, ‘to’, ‘until’,
‘us’, ‘we’, ‘well’, ‘work’], dtype=‘<U9’)

vocab = dict((word,index) for index, word in enumerate(np.unique(s.split())))
vocab
建立映射关系

{‘able’: 0,
‘above’: 1,
‘all’: 2,
‘and’: 3,
‘any’: 4,
‘believe’: 5,
‘do’: 6,
‘each’: 7,
‘easy’: 8,
‘for’: 9,
‘in’: 10,
‘is’: 11,
‘life’: 12,
‘must’: 13,
‘not’: 14,
‘of’: 15,
‘one’: 16,
‘ourselves’: 17,
‘some’: 18,
‘succeed’: 19,
‘that’: 20,
‘thing’: 21,
‘to’: 22,
‘until’: 23,
‘us’: 24,
‘we’: 25,
‘well’: 26,
‘work’: 27}

这是one-hot的表示方法

for index, i in enumerate(s):
    b[index,i] = 1
b[0:5]
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

1.4 词嵌入表示

import torch
em = torch.nn.Embedding(len(vocab), 20)
s_em = em(torch.LongTensor(s))
s_em.shape
torch.Size([42, 20])

2.简单文本分类

这里要说明一下,torch1.8 gpu 和 torchtext 0.90 版本,这俩个要匹配,否则安装torchtext的时候,会吧torch uninstall 再install,特别麻烦。
对应关系 ref:https://pypi.org/project/torchtext/0.14.0/
可以看到2.0的torch还没有对应的torchtext

import torch
import torchtext
from torchtext import data
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
from torchtext.vocab import GloVe
from torchtext.datasets import IMDB

用的是这个数据集:
IMDB:http://ai.stanford.edu/~amaas/data/sentiment/
在这里插入图片描述
是影评,包括三个标签,正向、负向和未知。
TORCHTEXT.DATASETS, 所有数据集都是子类 torch.data.Dataset, 她们继承自torch.utils.data.Dataset,并且具有split和iters实现的方法

切分数据集:

TEXT = torchtext.legacy.data.Field(lower=True, fix_length=200,batch_first=True)
LABEL = torchtext.legacy.data.Field(sequential=False)
# make splits for data
train,test = torchtext.legacy.datasets.IMDB.splits(TEXT,LABEL)

构建词嵌入:
最多容量10000个词,最小的频率是出现10次。

# 构建词表 vocab 构建train训练集的 top 10000个单词做训练, vectors用来提供预训练模型
TEXT.build_vocab(train, max_size = 10000,min_freq=10, vectors=None)
LABEL.build_vocab(train)

查看频率

TEXT.vocab.freqs

在这里插入图片描述
在这里插入图片描述
一共10002行数据,因为0是unknown, 1是padding。 超过10000的词都标记为unknown

train_iter, test_iter = torchtext.legacy.data.BucketIterator.splits((train,test),batch_size=16)

在这里插入图片描述
创建模型

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.em = nn.Embedding(len(TEXT.vocab.stoi),100) # batch*200-->batch*200*100
        self.fc1 = nn.Linear(200*100,1024)
        self.fc2 = nn.Linear(1024,3)
    
    def forward(self,x):
        x = self.em(x)
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        return x
model = Net()
model

在这里插入图片描述
损失函数:

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)

训练过程:这个代码是固定的,和我其它的文章里面也有很多

def fit(epoch, model, trainloader, testloader):
    correct = 0
    total = 0
    running_loss = 0
    
    model.train()
    for b in trainloader:
        x, y = b.text, b.label
        if torch.cuda.is_available():
            x, y = b.text.to('cuda'), b.label.to('cuda')
        y_pred = model(x)
        loss = loss_fn(y_pred, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        with torch.no_grad():
            y_pred = torch.argmax(y_pred, dim=1)
            correct += (y_pred == y).sum().item()
            total += y.size(0)
            running_loss += loss.item()
#    exp_lr_scheduler.step()
    epoch_loss = running_loss / len(trainloader.dataset)
    epoch_acc = correct / total
    
        
    test_correct = 0
    test_total = 0
    test_running_loss = 0 
    
    model.eval()
    with torch.no_grad():
        for b in testloader:
            x, y = b.text, b.label
            if torch.cuda.is_available():
                x, y = x.to('cuda'), y.to('cuda')
            y_pred = model(x)
            loss = loss_fn(y_pred, y)
            y_pred = torch.argmax(y_pred, dim=1)
            test_correct += (y_pred == y).sum().item()
            test_total += y.size(0)
            test_running_loss += loss.item()
    
    epoch_test_loss = test_running_loss / len(testloader.dataset)
    epoch_test_acc = test_correct / test_total
    
        
    print('epoch: ', epoch, 
          'loss: ', round(epoch_loss, 3),
          'accuracy:', round(epoch_acc, 3),
          'test_loss: ', round(epoch_test_loss, 3),
          'test_accuracy:', round(epoch_test_acc, 3)
             )
        
    return epoch_loss, epoch_acc, epoch_test_loss, epoch_test_acc

训练:

epochs = 10
train_loss = []
train_acc = []
test_loss = []
test_acc = []

for epoch in range(epochs):
    epoch_loss, epoch_acc, epoch_test_loss, epoch_test_acc = fit(epoch,
                                                                 model,
                                                                 train_iter,
                                                                 test_iter)
    train_loss.append(epoch_loss)
    train_acc.append(epoch_acc)
    test_loss.append(epoch_test_loss)
    test_acc.append(epoch_test_acc)

结果输出:

epoch:  0 loss:  0.046 accuracy: 0.55 test_loss:  0.041 test_accuracy: 0.618
epoch:  1 loss:  0.026 accuracy: 0.809 test_loss:  0.046 test_accuracy: 0.69
epoch:  2 loss:  0.009 accuracy: 0.945 test_loss:  0.053 test_accuracy: 0.721
epoch:  3 loss:  0.004 accuracy: 0.975 test_loss:  0.068 test_accuracy: 0.729
epoch:  4 loss:  0.002 accuracy: 0.985 test_loss:  0.115 test_accuracy: 0.708
epoch:  5 loss:  0.002 accuracy: 0.989 test_loss:  0.098 test_accuracy: 0.737
epoch:  6 loss:  0.002 accuracy: 0.991 test_loss:  0.096 test_accuracy: 0.744
epoch:  7 loss:  0.001 accuracy: 0.996 test_loss:  0.108 test_accuracy: 0.742
epoch:  8 loss:  0.001 accuracy: 0.994 test_loss:  0.12 test_accuracy: 0.744
epoch:  9 loss:  0.001 accuracy: 0.994 test_loss:  0.128 test_accuracy: 0.74

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题 的相关文章

随机推荐

  • 全国计算机等级考试二级C语言考试学习笔记

    1 C语言程序的结构 1 1 程序的构成 main函数和其他函数 1 1 1 main函数 一个完整的C语言程序 是由一个 且只能有一个main 函数 又称主函数 必须有 和若干个其他函数结合而成 可选 main函数是C语言程序的入口 程序
  • 药监局网瑞数绕过与反爬学习

    药监局瑞数反爬学习 贴逆向好的js代码 剩下靠你们自己了 需要返回cookie 否则无限跳转 文件夹中带有nginx静态服务配置 使用nginx后 并在hosts中添加一行app1 nmpa gov cn 你nginx的ip 浏览器访问ht
  • 原生js实现对select下拉列表的内容过滤

    原生js实现对select下拉列表的内容过滤 场景描述 笔者在工作的过程中 经常碰到这样的业务场景 客户要求一个下拉列表框旁边要有一个输入过滤的功能 如下图所示 由于在一个项目中出现了好多这样的需求 笔者就写了个采用原生js实现的对下拉的过
  • 决策树(Decision Tree)

    Author xiaoran Email PursuitFlow 163 com xiaoranone 126 com Datawhale 简介和算法 决策树是机器学习最常用的算法之一 它将算法组织成一颗树的形式 其实这就是将平时所说的if
  • Kompose使用

    参考网址 https kubernetes io docs tools kompose user guide Kompose是一个转换工具 可以将docker compose编排docker compose yaml文件转换为kuberne
  • osgEarth的Rex引擎原理分析(一二九)地图下载器实现原理

    目标 七十二 中问题148 java版本 String iPath http online2 map bdimg com tile qt tile x 4 y 4 z 5 styles pl udt 20171031 scaler 1 p
  • 免费的crm系统部署在自己的服务器,CRM软件的三种部署方式

    企业部署CRM软件有三种不同选择 他们在成本 风险和利益上各有不同 本文将逐一介绍这三类CRM部署方式 本地部署 软件托管和服务器代管 软件即服务 一 CRM本地部署方式 这是将软件客户端 服务器部署在客户本地服务器的一种方式 这种方式为客
  • 神经网络学习小记录63——Keras 图像处理中注意力机制的代码详解与应用

    神经网络学习小记录63 Keras 图像处理中注意力机制的解析与代码详解 学习前言 什么是注意力机制 代码下载 注意力机制的实现方式 1 SENet的实现 2 CBAM的实现 3 ECA的实现 注意力机制的应用 学习前言 注意力机制是一个非
  • 關於 React 中的 Hooks - 完全上手指南

    關於 React 中的 Hooks 完全上手指南 前言 正文 什麼是 Hooks useState 自定義 Hooks useEffect useRef useLayoutEffect useCallback useMemo useRedu
  • C语言进阶——4.宏定义

    C语言进阶 4 宏定义 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也是标识符 也要满足标识符的规则 但通常习惯使用大写字母和下划线命名 2 宏定义怎么用 宏定义通常有三种用法 当作常量使用 当作函数使用 编译预处理 2 1 宏定义常
  • 关于idea出现java: 无效的目标发行版: 8、9、11问题的解决方式

    1 首先Project settings 将环境设置为1 8 2 如果有多个module都要设置一下 3 都设置好了之后点击apply应用 点击ok关闭设置页面 然后点击File gt settings 进入设置页面 找到 Java Com
  • 腾讯策略协作型 AI「绝悟」升级至王者荣耀电竞职业水平

    感谢阅读腾讯AI Lab微信号第80篇文章 本文将介绍腾讯策略协作型 AI 绝悟 最新进展 达到王者荣耀电竞职业水平 长线策略及团队协作能力全面提升 腾讯 AI Lab 与王者荣耀共同探索的前沿研究项目 策略协作型 AI 绝悟 今天在吉隆坡
  • 经典排序算法:快速排序(Quick Sort)

    快速排序算法 快速排序算法被称为20世纪十大算法之一 是最重要的算法之一 是一定要掌握和熟练的 快速排序的基本思想是 分治法 1 先从数列中取出一个数作为基准数 2 分区过程 将比这个数大的数全放到它的右边 小于或等于它的数全放到它的左边
  • jdbc:mysql://127.0.0.1:3306/test_: No suitable driver found for jdbc:mysql://127.0.0.1:3306/bank

    今天遇到个很奇怪的问题 项目登录上去之后 去修改某张表的一条记录 突然报错 No suitable driver found for jdbc mysql 127 0 0 1 3306 bank 项目可以登录 那就不是数据库配置文件的问题
  • 状态压缩技巧:动态规划的降维打击

    刷题认准labuladong 东哥带你手把手撕力扣 点击下方卡片即可搜索 我们号之前写过十几篇动态规划文章 可以说动态规划技巧对于算法效率的提升非常可观 一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O N 2 堪称算法界的二向箔 把
  • 史上最全的maven pom.xml文件教程详解

    原文地址 http www zuidaima com share 1781583829978112 htm
  • 部署Prometheus

    1 解压prometheus压缩包 root node5 tar xf prometheus 2 38 0 linux amd64 tar gz C usr local 2 对压缩后的文件做软连接 root node5 ln sv usr
  • 人工智能技术的应用越来越广,极大促进了无人机产业的发展

    备受关注的第二十三届中国国际高新技术成果交易会 简称 高交会 于12月27日在深圳开幕 本届高交会分别在深圳会展中心 福田 和深圳国际会展中心 宝安 同期举办 吸引了众多优秀展商一展风采 本届高交会采用了 线上 线下 联动的方式 线下展览总
  • Shell脚本基础介绍

    shell基础简介 编写脚本通常使用某种基于解释器的编程语言 而shell脚本不过就是一些文件 我们能将一系列需要执行的命令写入其中 然后通过shell来执行这些脚本 进入Linux系统 Ubuntu 打开终端Terminal 表示普通用户
  • 【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

    系列文章目录 1 文本分类与词嵌入表示 mlp来处理分类问题 2 RNN LSTM GRU三种方式处理文本分类问题 3 评论情绪分类 还是得开个坑 最近搞论文 使用lstm做的ssd的cache prefetching 意味着我不能再划水了