目前我想要尝试的NLP情感分析方法有这样几种:snownlp库的情感字典、百度情感预训练模型SKEP、百度OpenAI的NLP中的中文情感处理、基于长短时记忆网络LSTM的情感分析、央财学报上那篇LSTM-CNN模型的情感分析。后面两个于我而言相当之高深莫测,所以先从基础的开始吧,今天先基于百度OpenAI来试一试。
编写前的准备工作
首先,数据就使用我前一个小项目爬取的东方财富股吧评论。
其次,需要安装一个库pip install baidu-aip
,之后运行报错,根据技术文档的指引还需要安装一个支持库pip install chardet
最后,需要注册百度智能云,注册成功之后直接搜索情感倾向分析-立即使用,进入控制台之后点击立即尝鲜免费试用,然后创建个人应用即可
调用百度OpenAI应用
这里使用的三个参数就是在应用控制台可以找到的三个关键参数:APP_ID, API_KEY, SECRET_KEY,可以使用print(help(aip))
来看技术文档,根据技术文档的指引:
1 2 3 4 5
| APP_ID = '' API_KEY = '' SECRET_KEY = ''
nlp_my = aip.nlp.AipNlp(APP_ID, API_KEY, SECRET_KEY)
|
对源文档进行读取和处理
1 2 3 4 5
| file_path = 'D:/600010股吧评论.csv' df = pd.read_csv(file_path, encoding='utf-8-sig')
df['sentiment'] = None
|
这里需要说明的是,一般来说做DataFrame都是encoding='utf-8
,但是我发现在进行情感分析之后,使用excle打开csv时,总是出现乱码,每次都要手动调整。这可能是因为excle对没有字节顺序标记(BOM)的utf-8读取时有什么障碍,所以使用了带有BOM的utf-8-sig,果然解决了。
调用sentimentClassify
这个小模块是本次小项目的核心,其中有一个很坑的点是咱们免费版的QPS并发限制只有2,一旦运行程序就会出现
{'error_code': 18, 'error_msg': 'Open api qps request limit reached'}
本人技艺不精,只能用一个笨办法,本来可以一步搞定的事情,我写了一个循环来做,循环里用time.sleep(2)
让程序休息一下,这样确实解决了并发限制,但是运行效率堪忧。
1 2 3 4 5 6 7 8 9
| for index, row in df.iterrows(): sentiment_result = nlp_my.sentimentClassify(row['title']) df.at[index, 'sentiment'] = sentiment_result time.sleep(2)
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import pandas as pd import aip import time
APP_ID = '' API_KEY = '' SECRET_KEY = ''
nlp_my = aip.nlp.AipNlp(APP_ID, API_KEY, SECRET_KEY)
file_path = 'D:/600030股吧评论.csv' df = pd.read_csv(file_path, encoding='utf-8-sig')
df['sentiment'] = None
for index, row in df.iterrows(): sentiment_result = nlp_my.sentimentClassify(row['title']) df.at[index, 'sentiment'] = sentiment_result time.sleep(2)
new_file_path = 'D:/600030情感分析.csv' df.to_csv(new_file_path, encoding='utf-8-sig', index=False)
|
运行结果和进一步思考
最后sentiment列返回这样的数据:
1 2 3 4 5 6 7 8 9
| {'text': '砸,砸出坨坨来,以前暴利时代终结,现在人人喊打。垃圾而已,砸出坨坨来。', 'items': [{'confidence': 0.999996, 'negative_prob': 0.999998, 'positive_prob': 1.91036e-06, 'sentiment': 0}], 'log_id': 1776990974559125906}
{'text': '这次回调是下来补缺口的,不用害怕,进场的好机会[愉快]', 'items': [{'confidence': 0.999801, 'negative_prob': 8.95235e-05, 'positive_prob': 0.99991, 'sentiment': 2}], 'log_id': 1776991460293843613}
{'text': '中信保荐的股票一概不碰[微笑]', 'items': [{'confidence': 0.698797, 'negative_prob': 0.135541, 'positive_prob': 0.864459, 'sentiment': 2}], 'log_id': 1776991450698915687}
{'text': '万倍杠杠沽空中信证券', 'items': [{'confidence': 0.965599, 'negative_prob': 0.0154804, 'positive_prob': 0.98452, 'sentiment': 2}], 'log_id': 1776991503300321372}
{'text': '中信证券日线周线月线季线年都在下降趋势中,做空正当时', 'items': [{'confidence': 0.709837, 'negative_prob': 0.130573, 'positive_prob': 0.869427, 'sentiment': 2}], 'log_id': 1776990991967449266}
|
后面如果做数据分析肯定还要加两步,一是对confidence值低的进行剔除,二是提取这个字典中negative_prob或者positive_prob来直接表征情绪
至于这个分析结果嘛,我只能说AI对于阴阳怪气的理解还差一点哈哈哈,总体结果还可以,大部分评论都能准确分析出情感倾向(以上的几条是我手动挑选出来的比较离谱的,大多数情绪倾向还是正确的)