写在前面

网上已经有很多文章对BERT的原理讲得很清楚了,今天我将以实战的方式(假装大家都懂原理≧◔◡◔≦)一步步带大家操作最近比较流行的BERT模型。源代码是pytorch版本。由于篇幅比较长我将分几个部分讲解。第一部分是数据的预处理。这一部分比较简单,但也很重要!

数据的预处理

对文本处理大致分为六个步骤,如图:

【注】本实验平台为Colab

预处理前需要导入的包:

!pip install transformers  #注:此为使用Colab安装方法
import torch
from transformers import BertModel, BertTokenizer

预训练模型为bert-base-uncased,下载模型和分类器

bert_model = BertModel.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

【注】第一部分主要教大家如何对一个句子进行切分和转化为词向量。后面章节会用for循环直接对数据进行批量处理
Tokenization——把句子拆分成若干单词

sentence = 'hehidden likes to play'
#step1:Tokenize
tokens = tokenizer.tokenize(sentence)
print(tokens)
#效果如下,tokenize切分规则源码中有详细讲解


首尾分别添加[CLS]、[SEP]

tokens = ['[CLS]'] + tokens + ['[SEP]']
print(tokens)
#效果如下


用[PAD]填充句子(这里我设置句子长度为20)

padded_tokens = tokens + ['[PAD]' for _ in range(20 - len(tokens))]
print(padded_tokens)
#效果如下


注意力mask编码(即有单词的为1,用[PAD]的为0)

attn_mask = [1 if token != '[PAD]' else 0 for token in padded_tokens]
print(attn_mask)
#效果如下


分段segment编码(用去区分不同的句子,我们这里只有一个句子,故全设为0)

seg_ids = [0 for _ in range(len(padded_tokens))]
print(seg_ids)
#效果如下


把token转化为id

token_ids = tokenizer.convert_tokens_to_ids(padded_tokens)
print(token_ids)
#效果如下


把三部分编码转化为 tensors形式

token_ids = torch.tensor(token_ids).unsqueeze(0)
atten_mask = torch.tensor(attn_mask).unsqueeze(0)
seg_ids = torch.tensor(seg_ids).unsqueeze(0)
print(token_ids)
#效果如下,仅打印token_ids


把toke_ids、attn_mask、seg_ids喂入模型中,模型返回每个单词的向量表示hidden_reps,和第一个toekn([CLS])的向量表示。

hidden_reps, cls_head = bert_model(token_ids, attention_mask = attn_mask,\token_type_ids = seg_ids)
print(hidden_reps)
print(cls_head)
#效果如下,每个token有768维


至此,数据的预处理部分已完毕,下面给出完整代码。

"""
Author : Mr.Luoj
Date : 2020.02.23
Blog : https://blog.csdn.net/weixin_37763870
"""import torch
import numpy as np
import pandas as pd
from transformers import BertModel, BertTokenizer, BertForSequenceClassificationbert_model = BertModel.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')sentence = 'hehidden likes to play'
tokens = tokenizer.tokenize(sentence)
tokens = ['[CLS]'] + tokens + ['[SEP]']
padded_tokens = tokens + ['[PAD]' for _ in range(20 - len(tokens))]
attn_mask = [1 if token != '[PAD]' else 0 for token in padded_tokens]
seg_ids = [0 for _ in range(len(padded_tokens))] #Optional!
token_ids = tokenizer.convert_tokens_to_ids(padded_tokens)token_ids = torch.tensor(token_ids).unsqueeze(0)
attn_mask = torch.tensor(attn_mask).unsqueeze(0)
seg_ids = torch.tensor(seg_ids).unsqueeze(0)hidden_reps, cls_head = bert_model(token_ids, attention_mask = attn_mask,\token_type_ids = seg_ids)

结语:
看完小伙伴们或多或少是否有点收获呢,如果您赞可的话,请给博主一个大大的赞,接下来我将讲解数据的加载、模型的建立等,敬请期待!!

参考资料:huggingface-bert

自然语言处理——BERT情感分类实战(一)之预处理相关推荐

  1. tensorflow2.0 循环神经网络--情感分类实战

    tensorflow2.0 循环神经网络–情感分类实战代码 本文主要是情感分类单层实战RNN Cell代码 import os import numpy as np import tensorflow ...

  2. 情感分析实战(英文)-数据预处理篇

    情感分析实战(英文)-数据预处理与情感分类模块 背景:该专栏的目的是将自己做了N个情感分析的毕业设计的一个总结版,不仅自己可以在这次总结中,把自己过往的一些经验进行归纳,梳理,巩固自己的知识从而进一步 ...

  3. 中文文本情感分类实战(weibo_senti_100k为数据集)

    中文文本情感分类 数据准备 加载数据集 搭建模型结构 训练脚本的搭建 测试脚本的编写 数据准备 使用jieba分词 data_processing.py import jiebadata_path = ...

  4. bert 文本分类实战

    前言: 由于课题需要,学习自然语言处理(NLP),于是在网上找了找文章和代码进行学习,在此记录,课题代码就不展示了,使用网上的代码和大家分享.思想和代码大部分参考苏神,在此感谢. 任务目标: 希望be ...

  5. BERT文本分类实战

    一.简介 在开始使用之前,我们先简单介绍一下到底什么是BERT,大家也可以去BERT的github上进行详细的了解.在CV问题中,目前已经有了很多成熟的预训练模型供大家使用,我们只需要修改结尾的FC层 ...

  6. 『NLP学习笔记』BERT文本分类实战

    BERT技术详细介绍! 文章目录 一. 数据集介绍 二. 数据读取 三. 训练集和验证集划分 四. 数据分词tokenizer 五. 定义数据读取(继承Dataset类) 六. 定义模型以及优化方法 ...

  7. pytorch Bert 情感分类

    https://blog.csdn.net/SZU_Hadooper/article/details/101697580

  8. SIGIR 2021 | 基于不确定性正则化与迭代网络剪枝的终身情感分类方法

    导读 终身学习能力对于情感分类器处理网络上连续的意见信息流而言至关重要.然而,执行终身学习对于深度神经网络来说是困难的,因为持续地训练可用信息会不可避免地会导致灾难性遗忘.发表在信息检索领域顶会 SI ...

  9. 二十一、文本情感分类二

    1.1 文本训练化概述 深度学习构建模型前需要将文本转化为向量表示(Word Embedding).首先需要将文本转化为数字(文本序列化),在把数字转化为向量. 可以考虑把文本中的每个词语和其对应的数 ...

最新文章

  1. [转]C#中的委托和事件(续)
  2. JavaScript对象——原型与原型链
  3. Vue3 Composition API(二)——computed、watchEffect、setup中使用ref
  4. PyCharm配置django环境
  5. SFB 项目经验-29-批量-启用用户-启用企业语音-设置分机号(项目中)
  6. java对机房有什么用_使用云终端建设的云机房相比传统机房有什么区别
  7. 正则表达式之常用量词
  8. 解决百度文库不能复制最简单方法
  9. 人员基础信息一体化采集设备
  10. 浅谈FLUKE光缆认证?何为CFP?何为OFP?
  11. als算法参数_矩阵分解之交替最小二乘ALS
  12. oracle创建用户密码和权限--ORA-65096 invalid common user or role name
  13. mysql简单数据库定期备份
  14. Java在编译到执行过程的编码问题
  15. 对称加密和非对称加密原理
  16. iOS UIButton 图标与标题位置调整
  17. html文字图片一起轮播卡片,简单的堆叠卡片样式jQuery轮播图插件
  18. Android-AbsoluteLayout(绝对布局)
  19. Java基础:18. 网络编程
  20. 三维数字沙盘虚拟电子沙盘触摸互动第四十课 在地图上添加FrameworkElement

热门文章

  1. top结合jstack处理线上cpu飙升问题
  2. kafka 同步提交 异步_Kafka 位移提交那些事儿
  3. IIS优化-解决IIS访问速度慢问题
  4. formdata ie9怎么兼容_2021上半年教师资格证笔试报名如何设置兼容性?
  5. Oracle RAC的Failover
  6. 【转载】如何使员工更敬业
  7. POJ-1328(Greedy,Vector,Sort,Iterator)
  8. java项目连接jboss中数据库_月光软件站 - 编程文档 - Java - JBOSS3.2.5中MYSQL数据库连接池的建立与测试...
  9. 2019-07-10
  10. 【转载】Android加载大图片OOM异常解决