BERT in tweet_sentiment_extraction
文章目录
- 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相关推荐
- kaggle比赛tweet_sentiment_extraction,带你上0.71分数
文章目录 1.前言 2.代码分析 2.1 加载必要的库 2.2 加载比赛中的数据 2.3 构造dataset生成器 2.4 Roberta模型 2.5 Warmup和学习率指数下降 2.6 focal ...
- 使用BERT的两层encoder实现tweet sentiment extraction
文章目录 使用BERT的两层encoder实现tweet sentiment extraction 1.前言 1.1 Required 1.2 分析给定的数据 2. 模型构造 2.1 数据清洗 2.2 ...
- EdgeBERT:极限压缩bert
这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的 GPT-3:而另一种恰恰相反,是把很平常的东西做到最小.对于 NLPer 来说,这种 &quo ...
- bert as service
BERT 模型是一种 NLP 预训练技术,本文不介绍 BERT 的原理,主要关注如何快速上手使用 BERT 模型生成词向量用于下游任务. Google 已经公开了 TensorFlow 版本的预训练模 ...
- bert [unused*] 特殊符号
[1] Comparing Transformer Tokenizers https://towardsdatascience.com/comparing-transformer-tokenizers ...
- 各bert 模型下载
20210618 https://huggingface.co/bert-base-chinese/tree/main bert 官方 https://mirrors.tuna.tsinghua.ed ...
- bert速度提升fastbert
FastBERT 自从BERT问世以来,大多数NLP任务的效果都有了一次质的飞跃.BERT Large在GLUE test上甚至提升了7个点之多.但BERT同时也开启了模型的"做大做深&qu ...
- ELECTRA 超过bert预训练NLP模型
论文:ELECTRA: Pre-training Text Encoders As Discriminators Rather Then Generators 本文目前在ICLR 2020盲审中,前几 ...
- BERT大火却不懂Transformer?读这一篇就够了 重点 命名实体识别
bert_config.josn 模型中参数的配置 { "attention_probs_dropout_prob": 0.1, #乘法attention时,softmax后dro ...
最新文章
- fastdfs安装_用asp.net core结合fastdfs打造分布式文件存储系统
- 7小时44分最佳,睡多睡少都不好,养成习惯也没用
- bzoj 2406: 矩阵 ——solution
- mysql decode encode 乱码问题
- 全流程解读:建立销售和营销模型的 9 个步骤
- 禁止UDP端口引起DNS错误导致邮局无法外发的故障
- MyEclipse Tomcat 超链接传参中文乱码
- AR与大数据 珠联璧合带来的无限想象空间
- canal client leader
- Linux shell脚本启动 停止 重启jar包
- hive遍历_Hive解析流程-抽象语法树生成
- java设置小数位数_java设置小数点后位数
- 【2013高考作文】重庆作文
- 软考计算机评职称,软考通过后如何评职称?
- Java学习 DAY18 Map、File、IO流
- 计算机超级管理用户名,超级管理员设置及简介
- 计算机用户删除了怎么恢复出厂设置,四种电脑快速恢复出厂设置方法
- 强化学习基础入门级介绍
- 可以说是迄今为止最好用的右键菜单管理工具
- MySQL写Shell方法总结
热门文章
- 曙光服务器管理系统,曙光Gridview服务器管理系统单机版v2.0用户手册.pdf
- python怎么画人像_教你如何用Python画出心目中的自己
- 2021年全球与中国不锈钢反应堆行业市场规模及发展前景分析
- android自动登录简书,Android开发之简单登录界面
- APP - 查询名下微信实名账户(可注销微信封号账户支付功能)
- 使用键盘录入给选手打分
- php9宫格抽奖程序_PHP实现抽奖功能实例代码
- 横河川仪压力变送器故障代码_压力变送器常见故障及解决办法
- 大学物理实验 载流圆线圈轴线上的磁场分布
- 【爬虫】爬虫_urllib 的使用2