当前位置:   article > 正文

使用transformer bert模型进行Twitter数据多维度情感分类_huggingface被墙

huggingface被墙

一、背景介绍

        实验室抓取了数百万条外网评论,主要以脸书和推特为主,其中有一个环节需要分析评论情感,并且尽可能做到情感细分,而不是积极、消极、中性的简单分类。

        考虑到快速开箱即用的需求,模型尽量不要太复杂,预训练模型直接跑,看下结果如何再考虑下游fine tune当然是不二之选。但是还需要注重准确性,早期的模型或者传统机器学习工具包不够高大上,那还说啥,上bert。

        实验室其他同学已经将十多种语言的评论翻成了英语,并且翻译质量较高,直接选取英文预训练的分析模型,roberta太大,选取蒸馏过的distilroberta较为合适。

大致流程:数据清洗 ——> 调包 ——> 生成结果 ——> 分析效果

二、代码部分

        2.1 数据介绍

        这是大致的数据格式,最后一列是翻译后的结果,我们主要以这一列作为分析目标,最后结果还需要添加原有的三度情感分析进行比较。

        数据主要是北京冬奥会相关推文评论与转发内容。

         2.2 数据预处理

  1. import pandas as pd
  2. import numpy as np
  3. import re
  4. import emoji
  5. import collections
  6. from transformers import pipeline

         2.2.1初始化分类器

classifier = pipeline("text-classification", model="j-hartmann/emotion-english-distilroberta-base")

初次运行会自动连网下载,有同学可能因为网络问题下载失败,我个人有两个方式:

1:huggingface其实没有被墙,一般而言不用挂梯子,dns污染的可能性比较大,可以尝试修改host为指定ip

2:手动下载并指定路径,可以搜一下指定路径的方式,这里不多赘述

         2.2.2 读取数据

  1. data = pd.read_csv('Untitled.csv')
  2. pd.set_option('display.max_colwidth',200) # 设置notebook中展示宽度

        2.2.3 剔除空值 

         给我的数据是20000整,做个demo看看效果,但在这里有一个大坑,translation_sentence数据有时是空的,这20000条中有9条为NAN,在数据清洗时总是报奇怪的错误,花费了不少时间debug。

  1. # translation_sentence存在空数据
  2. # 剔除nan数据,否则报错
  3. nan_list = [index for index,i in enumerate(data['translation_sentence']) if type(i)!=type(' ') ]
  4. data = data.drop(nan_list, axis=0)
  1. # 展示处理后的前二十条数据
  2. data['translation_sentence'][:20]

         可以看到评论中存在网址、@用户、表情等脏数据,后续其实还有特殊符号、部分中文、韩文、日文等其他语言,数据清洗时需要剔除。

         2.3 数据清洗

  1. # 数据清洗
  2. def sentence_remove(tweet):
  3. # 为了直观展示,这里分步处理,实际使用过程中建议合并
  4. r = "[_.!+-=——,$%^,。?、~@#¥%……&*《》<>「」“”‘’(){}【】□‡()//\\\[\]\"]"
  5. tweet = emoji.replace_emoji(tweet, replace=' ') # 删除emoji
  6. tweet = re.sub(r'[http|https]*://[a-zA-Z0-9.?/&=:]*', ' ', tweet) # 删除网址
  7. tweet = re.sub(r'@\S+', ' ', tweet) # 删除 @用户
  8. tweet = re.sub(r, ' ', tweet) # 删除特殊符号
  9. tweet = re.sub(r'\s+', ' ', tweet) # 删除多余空格换行符
  10. # 删除 中日韩 三语
  11. tweet = re.sub('[\u4e00-\u9fa5\uac00-\ud7ff\u3040-\u309f\u30a0-\u30ff]', '', tweet)
  12. return tweet
  13. translation_sentence= data['translation_sentence'].apply(sentence_remove).tolist()

        清洗完毕后转换为python的list格式,方便传入分类器进行分类

translation_sentence[:20]

         看一眼清洗后的数据,其实还可以设置部分停用词,但是这里时间原因暂未考虑,有余力的小伙伴可以试试效果如何。

         2.4 情感分类

  1. # 数据清洗后的句子传入分类器
  2. results=classifier(translation_sentence)
  3. # 提取结果中的情感标签
  4. bert_sentiment=[i['label'] for i in results]

        其中results长这样,我们还可以再classifier中设置返回全部评分结果,获取多个可能的情感值

         2.5 生成结果

         我们评估的结果文档需要包含以下四部分内容:

  1. # 未进行清洗的评论
  2. raw_sentence= data['translation_sentence'].tolist()
  3. # translation_sentence 清洗后的评论
  4. # 其他方式得到的三度情感判别
  5. ori_sentiment= data['sentiment'].tolist()
  6. # bert_sentiment 采用该模型得到的情感标签

         设置生成文档的格式及内容

  1. # 表头名称
  2. head = ['raw_sentence', 'processed_en_sentence','ori_sentiment','bert_sentiment']
  3. # 详细数据
  4. Data = [raw_sentence,translation_sentence,ori_sentiment,bert_sentiment]

        整合并保存 

  1. Data = np.transpose(Data) #数据行列互换
  2. test = pd.DataFrame(columns=head, data=Data)
  3. test.to_csv('distilroberta_sentiment_20000.csv') #将列表中的数据输出

三、最终结果

         大概观察了一下,除了fear标签,其余标签的分类结果比原结果要好很多,某些评论会被标记为fear的原因个人认为有两个:

1、XX与XX即将进行比赛、竞争类型的评论,会被划定为fear,可能是取的担忧的意思,而不是“恐惧害怕”。

2、因为数据集的倾向性明显,主题围绕冬奥会赛事,但是模型是根据日常语料进行训练的,泛化性再强也会出现偏差。例如“比赛”、“竞争”之类的话语归结为担忧的情况,可以通过下游训练改善。

四、代码及数据集

        老规矩,全部打包放在这里啦,对大家有帮助还请多多点赞收藏关注,日后还会更新更多的小demo及其他分享哦

链接:https://pan.baidu.com/s/1PTOKAU3bW9qAan6N58i3nw 
提取码:8cef 
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/465357
推荐阅读
相关标签
  

闽ICP备14008679号