基于GRU实现评论文本情感分析

一、问题建模  

在线评论的细粒度情感分析对于深刻理解商家和用户、挖掘用户情感等方面有至关重要的价值,并且在互联网行业有极其广泛的应用,主要用于个性化推荐、智能搜索、产品反馈、业务安全等。此博文,共包含6大类20个细粒度要素的情感倾向。根据标注的细粒度要素的情感倾向建立算法模型,对用户评论文本进行情感挖掘。

问题建模

 解决方向

二、数据集

数据下载:用户评论文本数据集,csv格式资源-CSDN文库

 2.1数据集说明

数据集分为训练、验证、测试三部分。

数据集中的评价对象按照粒度不同划分为两个层次,层次一为粗粒度的评价对象,例如评论文本中涉及的服务、位置等要素;层次二为细粒度的情感对象,例如“服务”属性中的“服务人员态度”、“排队等候时间”等细粒度要素。评价对象的具体划分如下表所示:

细粒度维度要素
层次一(The first layer) 层次二(The second layer) 情感倾向值(Sentimental labels) 含义(Meaning)
位置(location) 交通是否便利(traffic convenience)

四种状态:正向、中性、负向、未提及。使用[1,0,-1,-2]四个值对情感倾向进行描述:

正面情感(Positive)为1

中性情感(Neutral)为0

负面情感(Negative)为-1

情感倾向未提及(Not mentioned)为-2

距离商圈远近(distance from business district)
是否容易寻找(easy to find)
服务(service) 排队等候时间(wait time)
服务人员态度(waiter’s attitude)
是否容易停车(parking convenience)
点菜/上菜速度(serving speed)
价格(price) 价格水平(price level)
性价比(cost-effective)
折扣力度(discount)
环境(environment) 装修情况(decoration)
嘈杂情况(noise)
就餐空间(space)
卫生情况(cleaness)
菜品(dish) 分量(portion)
口感(taste)
外观(look)
推荐程度(recommendation)
其他(others) 本次消费感受(overall experience)
再次消费的意愿(willing to consume again)

2.2举例分析

某条评论如下

“味道不错的面馆,性价比也相当之高,分量很足~女生吃小份,胃口小的,可能吃不完呢。环境在面馆来说算是好的,至少看上去堂子很亮,也比较干净,一般苍蝇馆子还是比不上这个卫生状况的。中午饭点的时候,人很多,人行道上也是要坐满的,隔壁的冒菜馆子,据说是一家,有时候也会开放出来坐吃面的人。“


对该条评论进行6大类20个的细粒度要素的情感倾向进行预测,预测结果使用[-2,-1,0,1]四个值进行描述,返回的结果如下:

分析结果
层次一(The first layer) 层次二(The second layer) 标注 (Label)
位置(location) 交通是否便利(traffic convenience) -2
距离商圈远近(distance from business district) -2
是否容易寻找(easy to find) -2
服务(service) 排队等候时间(wait time) -2
服务人员态度(waiter’s attitude) -2
是否容易停车(parking convenience) -2
点菜/上菜速度(serving speed) -2
价格(price) 价格水平(price level) -2
性价比(cost-effective) 1
折扣力度(discount) -2
环境(environment) 装修情况(decoration) 1
嘈杂情况(noise) -2
就餐空间(space) -2
卫生情况(cleaness) 1
菜品(dish) 分量(portion) 1
口感(taste) 1
外观(look) -2
推荐程度(recommendation) -2
其他(others) 本次消费感受(overall experience) 1
再次消费的意愿(willing to consume again) -2

三、算法选择

3.1问题

循环神经网络(RNN,Recurrent Neural Network)受到短期记忆的影响。如果一个序列足够长,就很难将早期产生的信息带到后续的步骤中来。因此,如果试图处理一段文字来做预测,RNN可能会从一开始就遗漏了重要信息。 在反向传播过程中,循环神经网络会受到梯度消失问题的影响。梯度是用于更新神经网络权重的数值。梯度消失问题是指当梯度通过时间反向传播时,梯度会缩小。如果一个梯度值变得非常小,它就不会有太多的学习贡献。因此,在循环神经网络中,获得小梯度更新的层会停止学习。这些通常是早期的层。因此,在较长序列中,RNN会忘记这些不学习的层,就像有一个短期记忆。

3.2解决办法

LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)的诞生是为了解决短期记忆问题。它们利用具有内部机制的门控来调节信息的流动。

3.3举例

假设你正在看网上的评论,决定是否想买一件衣服。你首先阅读评论,然后确定是否有人认为它是好还是坏。

当你阅读评论时,你的大脑下意识地只记住了重要的关键词。你会对像“惊人” 和“完美”这样的词印象深刻。你对“这个”、“给了”、“所有”、“应该”等词不太在意。如果第二天有朋友问你评论说了什么,你可能不会一字不落地记住。但你可能会记得主要内容,如“一定会再次购买”,其他的词则会从记忆中消失了。

这基本上就是LSTM或GRU的作用。它可以学习只保留相关信息来进行预测,而忘记不相关的数据。在这种情况下,你记住的那些话让你判断它是好的。

四、模型建立

4.1流程

1. 数据预处理: 首先需要对原始数据进行预处理,包括文本清洗、分词、去除停用词等操作。预处理的目标是将文本转化为适合模型输入的形式。

2. 特征提取: 接下来,从经过预处理的文本中提取特征,用于表示文本内容。常用的特征提取方法包括词袋模型、TF-IDF、word2vec、BERT等。这些方法可以将文本转化为向量表示,能够保留词语的语义和上下文信息。然后,模型逐一处理向量序列。

3. 构建分类模型: 在特征提取完成后,需要选择合适的算法或模型来进行情感分类。常用的分类模型包括朴素贝叶斯、支持向量机(SVM)、逻辑回归、深度学习模型(如卷积神经网络、循环神经网络、Transformer等)。这些模型能够学习从特征到情感类别的映射关系。

4. 模型应用: 训练好的模型可以用于对新的未标注数据进行情感分类。对于未知的文本数据,可以使用训练好的模型预测其情感类别。

4.2代码实现

4.2.1版本

torch==1.11.0
torchaudio==0.11.0
torchinfo==1.8.0
torchvision==0.12.0

- jieba==0.42.1

4.2.2建立词典

def build_wordmap(contents):
    word_freq = Counter()

    for sentence in tqdm(contents):
        seg_list = jieba.cut(sentence.strip())
        # Update word frequency
        word_freq.update(list(seg_list))

    # Create word map
    words = [w for w in word_freq.keys() if word_freq[w] > min_word_freq]
    word_map = {k: v + 4 for v, k in enumerate(words)}
    word_map['<pad>'] = 0
    word_map['<start>'] = 1
    word_map['<end>'] = 2
    word_map['<unk>'] = 3
    print('len(word_map): ' + str(len(word_map)))
    print(words[:10])

    with open('data/WORDMAP.json', 'w') as file:
        json.dump(word_map, file, indent=4)

4.2.3建立模型

全部代码:基于GRU实现评论文本情感细粒度分析资源-CSDN文库


参考学习:

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 16:14:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 16:14:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 16:14:09       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 16:14:09       20 阅读

热门阅读

  1. OneFlow深度学习框架介绍

    2024-04-11 16:14:09       14 阅读
  2. ActiViz中的提取感兴趣区域

    2024-04-11 16:14:09       16 阅读
  3. 特征工程(III)--特征构造

    2024-04-11 16:14:09       15 阅读
  4. 子传父vue/react

    2024-04-11 16:14:09       15 阅读
  5. ES6:promise基本使用讲解

    2024-04-11 16:14:09       16 阅读
  6. 最长子序列问题

    2024-04-11 16:14:09       15 阅读
  7. 一篇文章讲清楚ECC和S/4HANA的主要区别

    2024-04-11 16:14:09       12 阅读
  8. Docker 安装 ElasticSearch 及 挂载目录

    2024-04-11 16:14:09       13 阅读
  9. vue3中ref绑定在div上面有什么用

    2024-04-11 16:14:09       14 阅读
  10. 解密Python中的“==”和“is”:深入理解对等比较

    2024-04-11 16:14:09       18 阅读