17 行代码跑最新 NLP 模型? 你也可以!
本次作者评测所需(防吓退)
一台可以上网的电脑
基本的 python 代码阅读能力, 用于修改几个模型参数
对百度中文 NLP 最新成果的浓烈兴趣
训练模型: Senta 情感分析模型基本简介
Senta 是百度 NLP 开放的中文情感分析模型, 可以用于进行中文句子的情感分析, 输出结果为 {正向 / 中性 / 负向} 中的一个, 关于模型的结构细节, 请查看 Senta----GitHub.com/PaddlePaddle/Paddlehub/demo/senta
本示例代码选择的是 Senta-BiLSTM 模型.
PaddleHub 是基于 PaddlePaddle 开发的预训练模型管理工具, 可以借助预训练模型更便捷地开展迁移学习工作.
本次评测中只使用了预训练模型, 没有进行 fine-tune
代码运行环境: 百度 AI studio
实验代码
- 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: {}, 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 科比 这些小字眼是判定情感的关键, 而模型也确实捕捉到并判断出来了, 这点比较让我惊喜.
来源: http://developer.51cto.com/art/201906/598519.htm