情感分析是分析文本以确定消息的情绪基调是积极、消极还是中性的过程。通过情感分析,我们可以了解文本是否表现出快乐、悲伤、愤怒等情绪。主要的计算方法有语义词典法、机器学习法、混合方法、其他方法。 随着chatGPT这类大语言模型的出现, 它们增强了文本理解能力,使我们能够更精准的把握文本中的语义和情绪,也因此大型语言模型 (LLM) 一出场就有实现情感分析功能。

一、任务描述

大邓准备了200条外卖评论数据(下图蓝色框), 已进行标注, 其中负面110条,正面90条。

现在想设计一个Prompt, 使用中文大模型对 review 文本进行情感类别(pos/neg)的预测(红色框), 最终会计算大模型预测的准确率。

先提前剧透一下, 模型预测的准确率89.5%。这种准确率,用到经管社科研究中, 应该没啥问题。



二、传统模式 VS 大语言模型

大语言模型 (LLM) 因其在理解和生成人类语言方面的熟练程度而在情绪分析方面表现出色。通过对各种数据和算法进行训练,LLM 可以检测文本中的细微差别,从而增强其在社交媒体、新闻文章和客户评论等平台上掌握人们情绪和观点的能力。它们捕捉上下文和情感线索的能力提高了情绪分析的准确性和深度。

情感分析领域,传统模式与大语言模型 (LLM) 的比较

  • 传统的内容分析方法可能难以准确捕捉细微的情绪。
  • LLM 使用深度学习和迁移学习等先进技术,擅长理解不同的语言表达。
  • LLM 在跨文本源(包括社交媒体帖子和新闻文章)的情感分析方面具有卓越的准确性和效率。



三、Ollama

Ollama是一款开源应用程序,可让您使用 MacOS、Linux 和 Windows 上的命令行界面在本地运行、创建和共享大型语言模型。

Ollama 可以直接从其库中访问各种 LLM,只需一个命令即可下载。下载后,只需执行一个命令即可开始使用。这对于工作量围绕终端窗口的用户非常有帮助。Ollama的安装、配置、使用的详细教程可阅读 教程 | 如何使用 Ollama 下载 & 使用本地大语言模型


3.1 安装模型

假设电脑中已安装了Ollama软件, 现在安装需要的大模型。 这里我们安装

  • qwen2:7b: 阿里的通义千问大模型, 主要适用于中文场景, 英文也可。
  • llama3:8b:Meta发布的LLama大模型,主要适用于英文场景, 中文也可。
ollama pull qwen2:7b
ollama pull llama3:8b

3.2 安装python包

打开电脑命令行cmd(mac是terminal), 网络是连网状态,执行安装命令

pip3 install ollama

3.3 启动ollama服务

在电脑中找到软件Ollama, 双击打开,即可开启Ollama服务。



四、实验

4.1 代码结构

project
  - code.ipynb  #代码
  - data.csv   #在线评论数据
  - result.csv #预测结果

4.2 读取数据

data.csv 内存储着200条外卖评论,均已标注(1正面, 0负面)

import pandas as pd
df = pd.read_csv('data.csv')
df


字段的数据类型

df.dtypes

Run

label         int64
review       object
dtype: object

label数值的分布

df.label.value_counts()

Run

label
0    110
1     90
Name: count, dtype: int64

4.3 设计提示

需要根据单词,生成单词、音标、语义、例句、历史文化、相关单词等信息, 提示如下,

PROMPT = """
您的任务是分析淘宝店铺中买家评论的情感类型(neg、pos)。

<comment_content>
{{COMMENT_CONTENT}}
</comment_content>

请根据以下准则分析此评论的情感:

"neg":评论文本中包含强烈的负面情绪、沮丧或不满。

"pos":评论文本表达了满意、感激或积极情绪


分析后,请以以下 JSON 格式提供最终结果:

<answer>
{
"sentiment": "[neg/pos]",
}
</answer>
"""

4.4 小实验

%%time

import ollama

COMMENT_CONTENT = "11点14订餐,13点20饭才到,2个小时才把我的午饭送到,而且还是打了2次客服电话,1次投诉电话才给送来,要是不打电话都不知道几点能吃上午饭?"

response = ollama.chat(model='qwen2:7b', messages=[
          {'role': 'system', 'content': PROMPT},
          {'role': 'user', 'content': COMMENT_CONTENT},
        ])

result = response['message']['content']
print(result)

Run

<answer>
{
"sentiment": "neg"
}
</answer>
CPU times: user 3.85 ms, sys: 2.5 ms, total: 6.35 ms
Wall time: 1.42 s

运行一条评论耗时1.42s, 需要注意,返回结果的格式不唯一也不确定,这是我发现的别的格式

{
"sentiment": "neg"
}
CPU times: user 1.94 ms, sys: 1.33 ms, total: 3.27 ms
Wall time: 329 ms

据此,设计了如下的代码

if 'pos' in result:
    senti = 'pos'
elif 'neg' in result:
    senti = 'neg'
else:
    senti = 'NA'
    
print(senti)

Run

neg


五、 批量运算

%%time

import pandas as pd
import ollama
from tqdm import tqdm
PROMPT = """
您的任务是分析淘宝店铺中买家评论的情绪和类型。您的目标是确定评论情感(neg、pos)。

<comment_content>
{{COMMENT_CONTENT}}
</comment_content>

请根据以下准则分析此评论的情感:

"neg":评论文本中包含强烈的负面情绪、沮丧或不满。

"pos":评论文本表达了满意、感激或积极情绪


分析后,请以以下 JSON 格式提供最终结果:

<answer>
{
"sentiment": "[neg/pos]",
}
</answer>
"""


#考虑到大模型回答的随机性,很容易报错。
#使用tryexcept增强代码的鲁棒性
def sentiment_analysis(comment_text):
    try:
        response = ollama.chat(model = 'qwen2:7b', 
                               messages = [
                                       {'role': 'system', 'content': PROMPT},
                                       {'role': 'user', 'content': comment_text}
                                   ])
        result = response['message']['content']
        if 'pos' in result:
            senti = 'pos'
        elif 'neg' in result:
            senti = 'neg'
        else:
            senti = 'NA'
        return senti
    except:
        return 'NA'

    

sentis = []
#读取数据
df = pd.read_csv('data.csv')
for review in tqdm(df['review']):
    senti = sentiment_analysis(review)
    sentis.append(senti)
    
df['sentiment'] = sentis
#保存结果
df.to_csv('result.csv', index=False)
df


六、检查准确率

假设label为1时, sentiment为pos(或label为0时, sentiment为neg), 大模型判断正确。反之,判断失误。

expression = "(label == 1) & (sentiment == 'pos') | (label == 0) & (sentiment == 'neg')"
correct_ratio = len(df.query(expression))/ len(df)
print(f'准确率: {correct_ratio*100}%')

Run

准确率: 89.5%

今天使用的国产大模型(qwen2:8b) 预测情感分类的表现还不错, 准确率高达89.5% 。这种准确率,用到经管社科研究中, 应该没啥问题。



精选内容