文章目录

  • 使用BERT的两层encoder实现tweet sentiment extraction
  • 1.前言
    • 1.1 Required
    • 1.2 分析给定的数据
  • 2. 模型构造
    • 2.1 数据清洗
    • 2.2 模型结构

使用BERT的两层encoder实现tweet sentiment extraction

Tweet sentiment extraction是kaggle的一个比赛,这个代码主要是想尝试利用BERT模型实现词语抽取。
其比赛链接:https://www.kaggle.com/c/tweet-sentiment-extraction/

我在上一篇文章中初步实现了一个以bert为基础的模型,其文章为:BERT in tweet_sentiment_extraction,发现这个实现效果不怎么好,于是便想着要进一步改进模型。

这篇文章的具体代码实现在:https://github.com/llq20133100095/tweet_sentiment_extraction/tree/two_layer_classification

比赛背景:
在日常的微博传播背后,其情绪会影响公司或者个人的决策。捕捉情绪语言能够立刻让人们了解到语言中的情感,从而可以有效
指导决策。但是,哪些词实际上主导情绪描述,这就需要我们模型能够有效挖掘出来。

比如给定一个句子:“My ridiculous dog is amazing.” [sentiment: positive]。这个句子的情感为positive(积极),则比赛需要我们抽取出
能够充分表达这个积极情感信息的词语,比如句子中的“amazing”这个词语可以表达positive情感。

1.前言

1.1 Required

bert-tensorflow
1.15 > tensorflow > 1.12
tensorflow-hub

1.2 分析给定的数据

比赛中给定了两个数据集:train.csv和test.csv。利用train.csv数据来构造模型,并预测test.csv数据。

train.csv的具体数据结构如下:

  • textID: 文本id
  • text: 原始文本
  • selected_text: 抽取出来的,带有情感的文本
  • sentiment:句子的情感

2. 模型构造

2.1 数据清洗

模型输入:是把“text”和“sentiment”进行拼接,构造成"[CLS] text [SEP] sentiment [SEP]"。

目前发现在数据集上,selected_text中没有进行数据清洗,里面有很多缺失的词语。通常在开头和结尾处,词语显示不完整。比如:

text: happy birthday
selected_text: y birthday

上面在开头缺少了“happy”这个词语,所以需要补上。

同时也存在两个单词没有空格开,比如

text: birthday,say say
selected_text: say say

具体清洗代码可以看:process_data.py

2.2 模型结构

前一篇文章中,是直接预测每个单词是否需要抽取,这就需要同时构造多个分类器。观望了一下原始数据集,发现抽取到的文本是连续的文本,那么就可以直接标记起始位置(start_label)和结尾位置(end_label),作为预测label
这时候原始的N个分类器可以缩减到2个分类器

本身BERT训练的时候,encoder上共有12层layer。实验中使用了最后的一层layer预测start_label,使用倒数第二层预测end_label,这样就可以构造两个分类器来进行预测。

  • 模型如下所示:


其中a为text,b为sentiment。

  • 具体代码实现在train.py:
def create_model(bert_config, is_training, is_predicting, input_ids, input_mask, segment_ids,target_start_idx, target_end_idx, num_labels, use_one_hot_embeddings):"""Creates a classification model."""model = modeling.BertModel(config=bert_config,is_training=is_training,input_ids=input_ids,input_mask=input_mask,token_type_ids=segment_ids,use_one_hot_embeddings=use_one_hot_embeddings)# Use "pooled_output" for classification tasks on an entire sentence.# Use "sequence_output" for token-level output.# "get_all_encoder_layers" for all encoder layerall_layer = model.get_all_encoder_layers()  # output_layer: 12 layer * [N, max_len, 768]hidden_size = all_layer[-1].shape[-1].valuemax_len = all_layer[-1].shape[1].value# Create our own layer to tune for politeness data. shape:[N, max_length, num_labels]with tf.variable_scope("first_softmax_llq", reuse=tf.AUTO_REUSE):output_weights = tf.get_variable("output_weights", [num_labels, 2 * hidden_size],initializer=tf.truncated_normal_initializer(stddev=0.02))output_bias = tf.get_variable("output_bias", [num_labels], initializer=tf.zeros_initializer())with tf.variable_scope("loss"):output_layer = tf.concat([all_layer[-1], all_layer[-2]], axis=-1)# Dropout helps prevent overfittingoutput_layer = tf.layers.dropout(output_layer, rate=0.1, training=is_training)# softmax operationlogits = tf.einsum("nlh,hm->nlm", output_layer, tf.transpose(output_weights))logits = tf.nn.bias_add(logits, output_bias)# logits_probs = tf.nn.log_softmax(logits, axis=-1)start_logits_probs, end_logits_probs = tf.split(logits, 2, axis=-1)start_logits_probs = tf.squeeze(start_logits_probs, axis=-1)end_logits_probs = tf.squeeze(end_logits_probs, axis=-1)# Convert labels into one-hot encodingone_hot_start_idx = tf.one_hot(target_start_idx, depth=max_len, dtype=tf.float32)one_hot_end_idx = tf.one_hot(target_end_idx, depth=max_len, dtype=tf.float32)one_hot_start_labels = tf.one_hot(tf.argmax(start_logits_probs, axis=-1), depth=max_len, dtype=tf.int32, axis=-1)one_hot_end_labels = tf.one_hot(tf.argmax(end_logits_probs, axis=-1), depth=max_len, dtype=tf.int32, axis=-1)predicted_labels = one_hot_start_labels + one_hot_end_labels# If we're predicting, we want predicted labels and the probabiltiies.if is_predicting:return (predicted_labels, logits)# If we're train/eval, compute loss between predicted and actual labelloss = tf.keras.backend.sparse_categorical_crossentropy(target_start_idx, start_logits_probs, from_logits=True)loss += tf.keras.backend.sparse_categorical_crossentropy(target_end_idx, end_logits_probs, from_logits=True)loss = tf.reduce_mean(loss)return (loss, predicted_labels, logits)

使用BERT的两层encoder实现tweet sentiment extraction相关推荐

  1. Kaggle: Tweet Sentiment Extraction 方法总结 Part 1/2: 常用方法总结

    文章目录 往期文章目录链接 Note Before we start Tweet Sentiment Extraction What is the MAGIC? Common Methods Labe ...

  2. 《Kaggle》Tweet Sentiment Extraction 实战(一)构建数据加载器

    <Kaggle>Tweet Sentiment Extraction 实战(一)构建数据加载器 前言 目标 引用库 分词器 ByteLevelBPETokenizer 介绍 ByteLev ...

  3. Kaggle: Tweet Sentiment Extraction 方法总结 Part 2/2: 金牌思路总结

    文章目录 往期文章目录链接 Note Noteworthy ideas in 1st place solution Idea Second level models Architectures Arc ...

  4. Dissecting BERT Part 1: The Encoder 解析BERT解码器(transformer)

    原文:https://medium.com/dissecting-bert/dissecting-bert-part-1-d3c3d495cdb3 A meaningful representatio ...

  5. BERT的嵌入层是如何实现的?看完你就明白了

    2020-05-13 11:03:16 作者:__ 编译:ronghuaiyang 导读 非常简单直白的语言解释了BERT中的嵌入层的组成以及实现的方式. 介绍 在本文中,我将解释BERT中嵌入层的实 ...

  6. Python 实现感知器模型、两层神经网络

    python 3.4 因为使用了 numpy 这里我们首先实现一个感知器模型来实现下面的对应关系 [[0,0,1], --- 0 [0,1,1], --- 1 [1,0,1], --- 0 [1,1, ...

  7. MYSQL注入天书之服务器(两层)架构

    Background-6 服务器(两层)架构 首先介绍一下29,30,31这三关的基本情况: 服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务 ...

  8. 函数 —— strtok() 例如:Fred male 25,John male 62,Anna female 16两层循环

    //char *strtok(char *str, const char *delim) /*功能:  * 函数用来将字符串分割成一个个片段*/ /*参数:  * str -- 要被分解成一组小字符串 ...

  9. 模式识别新研究:微软OCR两层优化提升自然场景下的文字识别精度

    模式识别新研究:微软OCR两层优化提升自然场景下的文字识别精度 发表于2015-03-30 23:46| 6209次阅读| 来源CSDN| 8 条评论| 作者霍强 模式识别微软亚洲研究院微软OCR文字 ...

最新文章

  1. EBS R12中如何使用CGI登录Form
  2. 各种排序算法的JAVA实现
  3. Windows XP SP2疑难速解50问
  4. vs2008页面布局GridLayout绝对定位的设置
  5. 将JSON数据转换成JAVA的实体类
  6. MathCAD求解方程组
  7. mysql explain预估剖析
  8. Open vSwitch(OVS)文档
  9. asp.net伪静态配置
  10. 那些令人喷饭的代码注释:仅以此代码献给...it's realy ?
  11. 本特利框架3500/05-01-01-CN-00
  12. html可以用搜狗浏览器打开网页,搜狗浏览器网页不小心关了怎么办?搜狗浏览器恢复页面三种方法...
  13. vb.net 简单取摄像头图片_简单的BP网络识别液晶字符
  14. [附源码]java毕业设计疫情防控期间人员档案追寻系统设计与实现论文
  15. 一文读懂 ChIPseq
  16. 实现微信扫描小程序码携带参数和路径跳转页面
  17. (转) Occlusion Culling(遮挡剔除)
  18. 苹果主题商店_苹果tf签名上架需要使用什么材料?
  19. 计算机网络知识点整理(笔试面试)
  20. Linux TCP/IP大合集

热门文章

  1. 磁盘调度策略 c语言实现(操作系统课程设计,书p320)
  2. Tello无人机版之使用Scratch2和ROS进行机器人图形化编程学习
  3. ais3_crackme 踩坑解析
  4. 第二章:关系数据库 - 04735数据库系统原理 - 自考知识点
  5. 【Writeup】第六季极客大挑战(部分题目)
  6. 精准营销中的价值与实现—银行案例
  7. 利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付
  8. 想装吗 看看装B大全
  9. AWS-IAM学习笔记
  10. VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法