查看原文
其他

17行代码做情感分析?试试PaddlePaddle的Senta-BiLSTM吧!

Charlotte77 Charlotte数据挖掘 2020-10-22

关注&置顶“Charlotte数据挖掘

每日9:00,干货速递!

By    Charlotte77


前言:来自陈健标同学的投稿~纯测评,大家可以体验体验~本文开启原创是为了保护陈同学的版权,所有赞赏的收益全部归属陈同学,除此之外还有稿费哦~欢迎大家给我投稿呀!~


关键词:情感分析  Senta-BiLSTM




17行代码跑最新NLP模型?你也可以!

  • 本次作者评测所需(防吓退)

  1. 一台可以上网的电脑

  2. 基本的python代码阅读能力,用于修改几个模型参数

  3. 对百度中文NLP最新成果的浓烈兴趣

  • 训练模型:Senta情感分析模型基本简介

    Senta是百度NLP开放的中文情感分析模型,可以用于进行中文句子的情感分析,输出结果为{正向/中性/负向}中的一个,关于模型的结构细节,请查看Senta

    ----github.com/PaddlePaddle/Paddlehub/demo/senta

    本示例代码选择的是Senta-BiLSTM模型。

  • 模型来源:Paddlehub简介

    PaddleHub是基于PaddlePaddle开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作。

    本次评测中只使用了预训练模型,没有进行fine-tune

  • 代码运行环境:百度 AI studio


  • 实验代码

    来自paddlehub/senta_demo.py

    github:https://github.com/PaddlePaddle/PaddleHub/blob/release/v0.5.0/demo/senta/senta_demo.py

    from __future__ import print_function
    import json
    import os
    import six
    import paddlehub as hub

    if __name__ == "__main__":
        # 加载senta模型
        senta = hub.Module(name="senta_bilstm")

        # 把要测试的短文本以str格式放到这个列表里
        test_text = [
            "这家餐厅不是很好吃",
            "这部电影差强人意",
        ]

        # 指定模型输入
        input_dict = {"text": test_text}

        # 把数据喂给senta模型的文本分类函数
        results = senta.sentiment_classify(data=input_dict)

        # 遍历分析每个短文本
        for index, text in enumerate(test_text):
            results[index]["text"] = text
        for index, result in enumerate(results):
            if six.PY2:
                print(
                    json.dumps(results[index], encoding="utf8", ensure_ascii=False))
            else:
                print('text: {},\t  predict: {}'.format(results[index]['text'],results[index]['sentiment_key']))




    详细测评

    成语情感分析

    • input

    test_text = [
        '沧海桑田', # 中型,世事变化很大
        '下里巴人', # 褒义,通俗的文学艺术
        '有口皆碑', # 褒义,对突出的好人好事一致颂扬
        '危言危行', # 褒义,说正直的话,做正直的事
        '鬼斧神工', # 褒义,指大自然美景
        '不赞一词', # 褒义,不能再添一句话,表示写的很好
        '文不加点', # 褒义,指写作技巧高超
        '差强人意', # 褒义,大体还能使人满意
        '无微不至', # 褒义,指细心周到
        '事倍功半', # 褒义,指不费力就有好的效果
        '事半功倍', # 贬义,指浪费了力气却没有好效果
        '蠢蠢欲动', # 贬义,指要干坏事
        '面目全非', # 贬义,指大破坏
        '江河日下', # 贬义,指事物日渐衰落
        '评头论足', # 贬义,指小节过分挑剔
        '生灵涂炭', # 贬义,指人民极端困苦
        '始作俑者', # 贬义,第一个做坏事的人
        '无所不为', # 贬义,什么坏事都干
        '无所不至', # 贬义,什么坏事都干
        '阳春白雪', # 贬义,高深不容易理解的艺术
        ]


    • output

    运行耗时: 4秒480毫秒
    text: 沧海桑田,  positive_prob: 0.3838,  predict: negative  # 错误
    text: 下里巴人,  positive_prob: 0.7957,  predict: positive  
    text: 有口皆碑,  positive_prob: 0.906,  predict: positive
    text: 危言危行,  positive_prob: 0.588,  predict: positive
    text: 鬼斧神工,  positive_prob: 0.657,  predict: positive
    text: 不赞一词,  positive_prob: 0.9698,  predict: positive
    text: 文不加点,  positive_prob: 0.1284,  predict: negative  # 错误
    text: 差强人意,  positive_prob: 0.0429,  predict: negative  # 错误
    text: 无微不至,  positive_prob: 0.8997,  predict: positive
    text: 事倍功半,  positive_prob: 0.6181,  predict: positive
    text: 事半功倍,  positive_prob: 0.8558,  predict: positive  # 错误
    text: 蠢蠢欲动,  positive_prob: 0.7353,  predict: positive  # 错误
    text: 面目全非,  positive_prob: 0.2186,  predict: negative
    text: 江河日下,  positive_prob: 0.2753,  predict: negative
    text: 评头论足,  positive_prob: 0.6737,  predict: positive  # 错误
    text: 生灵涂炭,  positive_prob: 0.4661,  predict: neutral   # 错误
    text: 始作俑者,  positive_prob: 0.247,  predict: negative
    text: 无所不为,  positive_prob: 0.5948,  predict: positive  # 错误
    text: 无所不至,  positive_prob: 0.553,  predict: positive   # 错误
    text: 阳春白雪,  positive_prob: 0.7552,  predict: positive  # 错误



    正确率:10/20 = 50%


    转折复句情绪分析

    • input

    test_text = [
        '小明虽然考了第一,但是他一点也不骄傲',                   # 积极         
     '你不是不聪明,而是不认真',                             # 消极
        '虽然小明很努力,但是他还是没有考100分',                  # 消极               
        '虽然小明有时很顽皮,但是他很懂事',                       # 积极      
        '虽然这座桥已经建了很多年,但是她依然很坚固',               # 积极              
        '他虽然很顽皮,但是学习很好',                            # 积极
        '学习不是枯燥无味,而是趣味横生',                         # 积极  
        '虽然很困难,但是我还是不会退缩',                         # 积极  
        '虽然小妹妹只有5岁,但是她能把乘法口诀倒背如流',             # 积极               
        '虽然我很过分,但是都是为了你好',                         # 积极 
        '小明成绩不好,不是因为不聪明,而是因为不努力',              # 消极              
        '虽然这样做不妥当,但已经是最好的选择',                     # 积极   
        '这次虽然失败,但却是成功的开始',                          # 积极
        '虽然这道题很难,但是我相信我会把它做出来',                  # 积极         
        '虽然爷爷已经很老了,但是他还是坚持每天做运动',              # 积极            
        '不是没有美,而是我们缺少发现美的眼光',                     # 消极     
        '虽然他们有良好的生活条件,但是浪费资源迟早会带来恶果',        # 消极                  
        '他不是我们的敌人,而是我们的朋友',                         # 积极     
        '他不是不会做,而是不想做',                                # 消极
        '虽然那个梦想看起来离我遥不可及,但是我相信经过我的努力它一定会实现',  # 积极
        ]


    • output

    运行耗时: 2秒667毫秒
    text: 小明虽然考了第一,但是他一点也不骄傲,  positive_prob: 0.9598,
     predict: positive  
    text: 你不是不聪明,而是不认真,  positive_prob: 0.0275,
     predict: negative
    text: 虽然小明很努力,但是他还是没有考100分,  positive_prob: 0.7188,
     predict: positive    # 错误
    text: 虽然小明有时很顽皮,但是他很懂事,  positive_prob: 0.8776,
     predict: positive
    text: 虽然这座桥已经建了很多年,但是她依然很坚固,  positive_prob: 0.9782,
     predict: positive
    text: 他虽然很顽皮,但是学习很好,  positive_prob: 0.9181,
     predict: positive
    text: 学习不是枯燥无味,而是趣味横生,  positive_prob: 0.3279,
     predict: negative    # 错误
    text: 虽然很困难,但是我还是不会退缩,  positive_prob: 0.3974,
     predict: negative    # 错误
    text: 虽然小妹妹只有5岁,但是她能把乘法口诀倒背如流,  positive_prob: 0.5124,
     predict: neutral
    text: 虽然我很过分,但是都是为了你好,  positive_prob: 0.399,
     predict: negative    # 错误
    text: 小明成绩不好,不是因为不聪明,而是因为不努力,  positive_prob: 0.1881,
     predict: negative
    text: 虽然这样做不妥当,但已经是最好的选择,  positive_prob: 0.806,
     predict: positive
    text: 这次虽然失败,但却是成功的开始,  positive_prob: 0.4862,
     predict: neutral     # 错误
    text: 虽然这道题很难,但是我相信我会把它做出来,  positive_prob: 0.3959,
     predict: negative    # 错误
    text: 虽然爷爷已经很老了,但是他还是坚持每天做运动,  positive_prob: 0.9178,
     predict: positive
    text: 不是没有美,而是我们缺少发现美的眼光,  positive_prob: 0.5614,
     predict: positive
    text: 虽然他们有良好的生活条件,但是浪费资源迟早带来恶果,  positive_prob: 0.1086,
     predict: negative
    text: 他不是我们的敌人,而是我们的朋友,  positive_prob: 0.3749,
     predict: negative    # 错误
    text: 他不是不会做,而是不想做,  positive_prob: 0.1247,
     predict: negative   
    text: 虽然那个梦想看起来离我遥不可及,但是我相信经过我的努力它一定会实现,  positive_prob: 0.957,
     predict: positive


    正确率:13/20 = 65%


    具体场景情绪分析

    • input

    test_text = [
            '这车耗油很快',            
            '这车开的很快',
            '这房间有一股死老鼠味道',
            '这房间有烟味',
            '他的发型像杀马特',
            '这衣服机洗掉色',
            '这衣服穿多了起球',
            '这软件容易闪退',
            '他打球的样子像蔡徐坤',
            '这把20了',
            '这把可以打',
            '他射球的样子像科比',
            '这房间的布置很有情调',
            '这酒让人回味',
            '这衣服很酷',
            '他的侧脸好像林峰',
            '五星好评',
            '以后会回购的',
            '性价比很高',
            '物美价廉',
            '这女生让我心动'

        ]


    • output

    运行耗时: 2秒676毫秒
    text: 这车耗油很快,  positive_prob: 0.2926,  predict: negative
    text: 这车开的很快,  positive_prob: 0.8478,  predict: positive
    text: 这房间有一股死老鼠味道,  positive_prob: 0.0071,  predict: negative
    text: 这房间有烟味,  positive_prob: 0.2071,  predict: negative
    text: 他的发型像杀马特,  positive_prob: 0.3445,  predict: negative
    text: 这衣服机洗掉色,  positive_prob: 0.3912,  predict: negative
    text: 这衣服穿多了起球,  positive_prob: 0.679,  predict: positive    # 错误
    text: 这软件容易闪退,  positive_prob: 0.0051,  predict: negative
    text: 他打球的样子像蔡徐坤,  positive_prob: 0.8684,  predict: positive  # 错误
    text: 这把20了,  positive_prob: 0.1695,  predict: negative
    text: 这把可以打,  positive_prob: 0.3503,  predict: negative        # 错误
    text: 他射球的样子像科比,  positive_prob: 0.7263,  predict: positive
    text: 这房间的布置很有情调,  positive_prob: 0.9519,  predict: positive
    text: 这酒让人回味,  positive_prob: 0.7431,  predict: positive
    text: 这衣服很酷,  positive_prob: 0.9817,  predict: positive
    text: 他的侧脸好像林峰,  positive_prob: 0.5621,  predict: positive
    text: 五星好评,  positive_prob: 0.9971,  predict: positive
    text: 以后会回购的,  positive_prob: 0.6903,  predict: positive
    text: 性价比很高,  positive_prob: 0.9799,  predict: positive
    text: 物美价廉,  positive_prob: 0.9542,  predict: positive
    text: 这女生让我心动,  positive_prob: 0.956,  predict: positive


    正确率:17/20 = 85%


    总结,三个不同类别的测评如下所示:




    总结


    1.模型计算耗时较小,使用体验不错。

    2.成语情感分析方面,我专门挑选的是一些比较难从字面理解的,容易混淆情感的成语(比如差强人意被判定为消极),这些也是高考常考的内容。虽然最后模型正确率只有一般,但是我认为是可以接受的,适当增加成语语句作为训练语料会使模型"更懂"中文。

    大家有兴趣的可以试一试一些比较容易从字面理解情感的成语,我觉得得分会比本次评测的结果要好。

    3.转折语句情感分析本身也是对模型的一种挑战,实测效果为65分,个人觉得模型对于像“但是”,“虽然”这样的词语没有足够的attention,因为这些转折词背后的语义往往才是最影响整个句子的情感的,最终评分65分,个人认为模型在这方面表现一般。

    4.评分最好看的是具体场景情感分析,大概预训练语料中有大量的淘宝评价?像杀马特 20  科比 这些小字眼是判定情感的关键,而模型也确实捕捉到并判断出来了,这点比较让我惊喜。



    编者注:这是用户的投稿,Charlotte仅对其排版美化处理,没有处理过实验结果哦,欢迎大家体验paddle后来投稿,有稿费哦^_^ ~详情请点击阅读原文查看详细需求~也可以加Charlotte微信直接联系:journey77824 ,加入Charlotte技术交流群~欢迎大家体验嘿嘿





    -点击右下角 告诉大家你“在看”-

      您可能也对以下帖子感兴趣

      文章有问题?点此查看未经处理的缓存