文章目录

  • Tweet-sentiment-extraction
  • 1.前言
    • 1.1 Required
    • 1.2 分析给定的数据
    • 1.3 构造模型输入和输出
  • 2.代码实现
    • 2.1 预加载模型的下载
    • 2.2 BERT模型文件
    • 2.3 构造输入tf.data.dataset
    • 2.4 模型评估
    • 2.5 train and test

Tweet-sentiment-extraction

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

我自己实现的项目实现代码在:https://github.com/llq20133100095/tweet_sentiment_extraction

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

比如给定一个句子:“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:句子的情感

1.3 构造模型输入和输出

初步想法是把“text”和“sentiment”进行拼接,构造成"[CLS] text_a [SEP] text_b [SEP]"。输出是对每个词语进行当前输出,
输出有两个值,分别为0(不需要抽取该词语)和1(需要抽取该词语)。

具体的结构图如下:

2.代码实现

2.1 预加载模型的下载

首先要新建两个文件夹“bert_pretrain_model”和“save_model”

  • bert_pretrain_model: BERT模型下载到这里,并进行解压。具体模型下载连接:
    https://github.com/google-research/bert
  • save_model: python3 model.py 之后模型会保存到这里

2.2 BERT模型文件

BERT模型下载后是一个压缩包,类似于uncased_L-12_H-768_A-12.zip。里面包含了四个文件:

  • bert_config.json:BERT模型参数
  • bert_model.ckpt.xxxx:这里有两种文件,但导入模型只需要bert_model.ckpt这个前缀就可以了
  • vocab.txt:存放词典

2.3 构造输入tf.data.dataset

主要实现在run_classifier_custom.py

总共构造了7个输入形式:

d = tf.data.Dataset.from_tensor_slices({"input_ids":tf.constant(all_input_ids, shape=[num_examples, seq_length],dtype=tf.int32),"input_mask":tf.constant(all_input_mask,shape=[num_examples, seq_length],dtype=tf.int32),"segment_ids":tf.constant(all_segment_ids,shape=[num_examples, seq_length],dtype=tf.int32),"label_id_list":tf.constant(all_label_id_list, shape=[num_examples, seq_length], dtype=tf.int32),"sentiment_id":tf.constant(all_sentiment_id, shape=[num_examples], dtype=tf.int32),"texts":tf.constant(all_texts, shape=[num_examples], dtype=tf.string),"selected_texts":tf.constant(all_selected_texts, shape=[num_examples], dtype=tf.string),
})
  • input_ids: 把词语进行分词之后,分配的词典id
  • input_mask: 可以对哪些位置进行mask操作
  • segment_ids: 区分text_a和text_b的id
  • label_id_list:标记哪些词语需要被抽取的
  • sentiment_id:该句子的情感id
  • texts:原始句子
  • selected_texts:需要抽取的词语

2.4 模型评估

模型评估需要重新恢复构建的词语,代码在train.py

def eval_decoded_texts(texts, predicted_labels, sentiment_ids, tokenizer):decoded_texts = []for i, text in enumerate(texts):if type(text) == type(b""):text = text.decode("utf-8")# sentiment "neutral" or length < 2if sentiment_ids[i] == 0 or len(text.split()) < 2:decoded_texts.append(text)else:text_list = text.lower().split()text_token = tokenizer.tokenize(text)segment_id = []# record the segment idj_text = 0j_token = 0while j_text < len(text_list) and j_token < len(text_token):_j_token = j_token + 1text_a = "".join(tokenizer.tokenize(text_list[j_text])).replace("##", "")while True:segment_id.append(j_text)if "".join(text_token[j_token:_j_token]).replace("##", "") == text_a:j_token = _j_tokenbreak_j_token += 1j_text += 1assert len(segment_id) == len(text_token)# get selected_textselected_text = []predicted_label_id = predicted_labels[i]predicted_label_id.pop(0)for _ in range(len(predicted_label_id) - len(text_token)):predicted_label_id.pop()max_len = len(predicted_label_id)assert len(text_token) == max_lenj = 0while j < max_len:if predicted_label_id[j] == 1:if j == max_len - 1:j += 1else:a_selected_text = text_list[segment_id[j]]selected_text.append(a_selected_text)for new_j in range(j + 1, len(segment_id)):if segment_id[j] != segment_id[new_j]:j = new_jbreakelif new_j == len(segment_id) - 1:j = new_jelse:j += 1decoded_texts.append(" ".join(selected_text))return decoded_texts

2.5 train and test

  • train
python3 train.py
  • test
python3 test.py

最后会生成可以提交的csv文件:submission.csv

形式如下:

BERT in tweet_sentiment_extraction相关推荐

  1. kaggle比赛tweet_sentiment_extraction,带你上0.71分数

    文章目录 1.前言 2.代码分析 2.1 加载必要的库 2.2 加载比赛中的数据 2.3 构造dataset生成器 2.4 Roberta模型 2.5 Warmup和学习率指数下降 2.6 focal ...

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

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

  3. EdgeBERT:极限压缩bert

    这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的 GPT-3:而另一种恰恰相反,是把很平常的东西做到最小.对于 NLPer 来说,这种 &quo ...

  4. bert as service

    BERT 模型是一种 NLP 预训练技术,本文不介绍 BERT 的原理,主要关注如何快速上手使用 BERT 模型生成词向量用于下游任务. Google 已经公开了 TensorFlow 版本的预训练模 ...

  5. bert [unused*] 特殊符号

    [1] Comparing Transformer Tokenizers https://towardsdatascience.com/comparing-transformer-tokenizers ...

  6. 各bert 模型下载

    20210618 https://huggingface.co/bert-base-chinese/tree/main bert 官方 https://mirrors.tuna.tsinghua.ed ...

  7. bert速度提升fastbert

    FastBERT 自从BERT问世以来,大多数NLP任务的效果都有了一次质的飞跃.BERT Large在GLUE test上甚至提升了7个点之多.但BERT同时也开启了模型的"做大做深&qu ...

  8. ELECTRA 超过bert预训练NLP模型

    论文:ELECTRA: Pre-training Text Encoders As Discriminators Rather Then Generators 本文目前在ICLR 2020盲审中,前几 ...

  9. BERT大火却不懂Transformer?读这一篇就够了 重点 命名实体识别

    bert_config.josn 模型中参数的配置 { "attention_probs_dropout_prob": 0.1, #乘法attention时,softmax后dro ...

最新文章

  1. fastdfs安装_用asp.net core结合fastdfs打造分布式文件存储系统
  2. 7小时44分最佳,睡多睡少都不好,养成习惯也没用
  3. bzoj 2406: 矩阵 ——solution
  4. mysql decode encode 乱码问题
  5. 全流程解读:建立销售和营销模型的 9 个步骤
  6. 禁止UDP端口引起DNS错误导致邮局无法外发的故障
  7. MyEclipse Tomcat 超链接传参中文乱码
  8. AR与大数据 珠联璧合带来的无限想象空间
  9. canal client leader
  10. Linux shell脚本启动 停止 重启jar包
  11. hive遍历_Hive解析流程-抽象语法树生成
  12. java设置小数位数_java设置小数点后位数
  13. 【2013高考作文】重庆作文
  14. 软考计算机评职称,软考通过后如何评职称?
  15. Java学习 DAY18 Map、File、IO流
  16. 计算机超级管理用户名,超级管理员设置及简介
  17. 计算机用户删除了怎么恢复出厂设置,四种电脑快速恢复出厂设置方法
  18. 强化学习基础入门级介绍
  19. 可以说是迄今为止最好用的右键菜单管理工具
  20. MySQL写Shell方法总结

热门文章

  1. 曙光服务器管理系统,曙光Gridview服务器管理系统单机版v2.0用户手册.pdf
  2. python怎么画人像_教你如何用Python画出心目中的自己
  3. 2021年全球与中国不锈钢反应堆行业市场规模及发展前景分析
  4. android自动登录简书,Android开发之简单登录界面
  5. APP - 查询名下微信实名账户(可注销微信封号账户支付功能)
  6. 使用键盘录入给选手打分
  7. php9宫格抽奖程序_PHP实现抽奖功能实例代码
  8. 横河川仪压力变送器故障代码_压力变送器常见故障及解决办法
  9. 大学物理实验 载流圆线圈轴线上的磁场分布
  10. 【爬虫】爬虫_urllib 的使用2