自己造轮子——自然语言情感分析_基于百度OpenAI

目前我想要尝试的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') # 指定读取CSV文件的路径和编码

df['sentiment'] = None # 确保DataFrame中存在'sentiment'列

这里需要说明的是,一般来说做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
# 对DataFrame中的每一行进行迭代
for index, row in df.iterrows():
# 进行情感分析
sentiment_result = nlp_my.sentimentClassify(row['title'])
# 将情感分析结果赋值给'sentiment'列
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)

# 指定读取CSV文件的路径和编码
file_path = 'D:/600030股吧评论.csv'
df = pd.read_csv(file_path, encoding='utf-8-sig')

# 确保DataFrame中存在'sentiment'列
df['sentiment'] = None

# 对DataFrame中的每一行进行迭代
for index, row in df.iterrows():
# 进行情感分析
sentiment_result = nlp_my.sentimentClassify(row['title'])
# 将情感分析结果赋值给'sentiment'列
df.at[index, 'sentiment'] = sentiment_result
# 暂停两秒
time.sleep(2)

# 指定写入CSV文件的路径
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对于阴阳怪气的理解还差一点哈哈哈,总体结果还可以,大部分评论都能准确分析出情感倾向(以上的几条是我手动挑选出来的比较离谱的,大多数情绪倾向还是正确的)


自己造轮子——自然语言情感分析_基于百度OpenAI
http://example.com/2024/04/07/自己造轮子——自然语言情感分析_基于百度OpenAI/
作者
cyx94a
发布于
2024年4月7日
许可协议