文档首页/ 盘古大模型 PanguLargeModels/ 最佳实践/ 模型推理实践/ 使用华为云盘古NLP大模型实现情感分析
更新时间:2026-01-07 GMT+08:00
分享

使用华为云盘古NLP大模型实现情感分析

应用场景

在日常的业务运营中,企业经常需要对大量的用户评论、反馈等文本数据进行情感分析,以了解用户的态度和情绪。然而,传统的文本情感分析方法往往需要大量的标注数据和复杂的模型训练过程,这不仅耗时耗力,而且难以满足业务快速变化的需求。为了解决这一问题,您可以使用华为云盘古NLP大模型实现文本情感分析。盘古NLP大模型是华为云推出的新一代自然语言处理服务,基于预训练+微调的技术架构,支持多轮对话、情感判断、实体提取、文本生成等多样化NLP任务,可广泛应用于智能客服、用户评论分析、内容创作等场景。

在本文档中,假设您是一家电商平台的产品经理,需要通过分析用户对某款翻译机的评论情感,判断用户满意度,为产品优化提供依据,从而提升用户体验。

通过本教程,您将掌握:

- 登录盘古ModelArts Studio大模型开发平台,部署NLP大模型;

- 结合情感分析能力,处理用户评论并获取情感洞察;

- 基于分析结果制定业务决策(如优化产品功能、调整客服话术)。

约束限制

  • 模型类型:本教程使用盘古NLP-N2-32K模型(当前为免费模型,支持32K Token长度,适配中长文本对话与分析),Token转换比为“0.88 Token/英文单词、1.24 Token/汉字”;
  • 接口类型:支持V1(华为云标准接口)与V2(OpenAI兼容接口),本教程以V2接口为例(更易上手,适配通用开发场景)。

订购盘古大模型服务

  1. 使用主账户登录ModelArts Studio大模型开发平台,单击“立即订购”进入“订购”页面。
  2. 在“开发场景”中勾选NLP大模型。
    图1 NLP大模型
  3. 在“推理资源”中选择“ModelArts Studio-推理单元(NLP、多模态)”、包年/包月模式下的8个推理单元。

    NLP-N2-32K模型为免费模型,所以无需购买模型资源,只需购买推理资源即可。

  4. 单击“立即购买”,购买成功后即可使用平台。

部署NLP大模型

部署NLP大模型操作步骤如下:

  1. 登录ModelArts Studio大模型开发平台,在“我的空间”模块,单击进入所需空间。
    图2 我的空间
  2. 在左侧导航栏中单击“模型广场”,并单击Pangu-NLP-N2-32K模型的“部署”按钮,进入“创建部署”页面。
    图3 模型广场
  3. 在“创建部署”页面,参考表1完成部署参数设置。
    表1 NLP大模型部署参数说明

    参数分类

    部署参数

    参数说明

    部署配置

    选择模型

    可以修改如下信息:

    • 来源:选择“模型广场”。
    • 类型:选择“大语言模型”,并选择需要进行部署的模型和版本。此案例选择

      “Pangu-NLP-N2-32K-5.0.1.1”模型。

    部署方式

    支持“云上部署”和“边缘部署”,其中,云上部署指算法部署至平台提供的资源池中。边缘部署指算法部署至客户的边缘设备中(仅支持边缘部署的模型可配置边缘部署)。此案例选择“云上部署”

    • 若选择“云上部署”,部分模型资产支持两种云上部署方式。
      • 混合部署:基础部署方式,所有场景适用,部署资源消耗较少。
      • 分离部署:性能优化部署方式,适用输入输出长度相对固定的场景,推理吞吐量提升但资源消耗增大。分离部署包含1:1、2:2两种形式的pd配比,建议用户根据场景需求,尝试不同配比,以达到全量时延、增量时延都满足要求的情况下,吞吐最大。
    • 部分模型资产支持边缘部署方式,若选择“边缘部署”:
      • 资源池:选择部署模型所需的边缘资源池,创建边缘资源池步骤请详见创建边缘资源池
      • CPU:部署需要使用的最小CPU值(物理核)。
      • 内存:部署需要使用的最小内存值。
      • Ascend:部署使用的NPU数量。
      • 实例数:设置部署模型时所需的实例数。

    最大TOKEN长度

    模型处理序列长度最大值“32K”

    自定义名称

    此名称是通过V2版本推理接口调用该推理服务时的唯一标识。创建后不支持修改。

    安全护栏

    安全护栏开关

    安全护栏保障模型调用安全。

    版本选择

    当前支持安全护栏基础版,内置了默认的内容审核规则。

    资源配置(选择云上部署时)

    计费模式

    根据当前计费方式选择。此案例选择“包年包月”

    实例数

    设置部署模型时所需的实例数。此案例填写“1”

    订阅提醒

    订阅提醒

    该功能开启后,平台支持两种订阅类型,预置通知和SMN通知。

    预置通知:系统将在任务状态运行、失败或者告警时,通过短信或邮件将提醒发送给用户。

    SMN通知:用户可在SMN云服务创建主题并维护订阅信息,在创建部署时选择对应主题以及需要通知的状态。训练状态范围:运行、失败、告警。

    基本信息

    服务名称

    设置部署任务的名称。

    描述(选填)

    设置部署任务的描述。

    标签(选填)

    设置部署任务的标签,部署和更新模型时,以“SERVICE_TAGS_CONFIG”为key,标签信息的json体Base64字符串为value添加到模型服务的环境变量中。

  4. 参数填写完成后,单击“立即部署”。

    如果部署失败,请参考NLP大模型推理常见错误及解决方案做初步定位。

  5. 模型部署状态为“运行中”表示部署成功。
    图4 运行中

使用Postman调用NLP大模型

  1. 获取调用路径
    单击部署NLP大模型步骤中创建的部署任务名称进入详情页。在“API调用”页签,可获取模型调用路径,并根据页签的调用方法进行调用。
    图5 API 地址
  2. 获取API Key
    1. 在左侧导航栏中选择“应用接入”,单击界面右上角“创建应用接入”。
    2. 在“关联服务”中,选择“全部服务”,或者在“指定服务”中选择已部署好的大模型,并设置应用接入名称、描述,单击“确定”。
    3. 在弹窗中复制API Key的值。
      图6 复制API Key
      • API Key仅可在此弹窗中复制一次,请妥善保存。关闭弹窗后,如果忘记API Key值,请重新创建。
  3. 使用Postman调用API
    1. 在Postman中新建POST请求,并填入模型调用路径,详见1.获取调用路径
      图7 调用路径
    2. 参考图8获取APIKey填写请求Header参数。
      图8 请求Header
    3. 在Postman中选择“Body > raw”选项,参考以下代码填写请求Body。

      Model:“model”参数的值必须与API调用页面“Deployed_Model”的值保持一致。

      图9 Model获取
      {
          "model": "pangu-nlp-n2-32k_urk0gt",
          "messages": [
              {
                  "role": "system",
                  "content": "你是电商评论分析专家,需从4个维度分析评论,严格按JSON格式输出,不添加额外内容。分析规则:1. 正负混合:同时出现褒贬表述(如\"功能强但续航短\");2. 不相关:文本与商品/服务无关(如纯表情、闲聊);3. 场景判断:提及使用时间/地点/场景(如\"出国用\"、\"办公用\");4. 建议判断:包含\"希望\"、\"建议\"、\"应该\"等改进表述。输出JSON格式要求:{\"sentiment_category\": 1-正面, 2-负面, 3-正负混合, 4-中性, 5-不相关, \"sentiment_score\": 0-10分(情感强烈程度,10分为极值), \"has_scenario\": 0(无使用场景)/1(有使用场景), \"has_suggestion\": 0(无建议)/1(有改进建议)}。示例1:评论\"在欧洲旅游时用这个翻译机,沟通完全无障碍,就是价格略高\" → 输出{\"sentiment_category\":3,\"sentiment_score\":8,\"has_scenario\":1,\"has_suggestion\":0};示例2:评论\"翻译准确率太低,经常出错,建议优化算法\" → 输出{\"sentiment_category\":2,\"sentiment_score\":3,\"has_scenario\":0,\"has_suggestion\":1};示例3:评论\"\" → 输出{\"sentiment_category\":4,\"sentiment_score\":5,\"has_scenario\":0,\"has_suggestion\":0}"
              },
              {
                  "role": "user",
                  "content": "翻译速度很快,国际会议上用着很方便,推荐!"
              }
          ],
          "temperature": 0.3,
          "max_tokens": 150
      }
    4. 单击Postman界面“Send”,发送请求。

      成功响应示例

      状态码: 200

      {
          "id": "chat-cbf031a9d9fe46cfa1624092519f8309",
          "object": "chat.completion",
          "created": 1765358408,
          "model": "pangu-nlp-n2-32k_urk0gt",
          "choices": [
              {
                  "index": 0,
                  "message": {
                      "role": "assistant",
                      "reasoning_content": null,
                      "content": "```json\n{\n  \"sentiment_category\": 1,\n  \"sentiment_score\": 9,\n  \"has_scenario\": 1,\n  \"has_suggestion\": 0\n}\n```",
                      "tool_calls": []
                  },
                  "logprobs": null,
                  "finish_reason": "stop",
                  "stop_reason": null
              }
          ],
          "usage": {
              "prompt_tokens": 370,
              "total_tokens": 412,
              "completion_tokens": 42
          },
          "prompt_logprobs": null
      }
  4. 使用Python 代码,基于盘古 NLP 模型对电商评论进行批量情感分析(表格版)

    表格格式要求:

    • 支持 Excel(.xlsx)和 CSV(.csv)格式;
    • 表格中必须有一列存储评论内容(默认列名:评论内容,可通过COMMENT_COLUMN参数修改);
    • 示例表格结构:

      评论内容

      商品 ID

      评论时间

      翻译速度很快...

      1001

      2025-01-01

      电池续航太差...

      1001

      2025-01-02

    配置项修改:
    • API_URL:替换为你的 pangu-nlp 模型实际调用地址;
    • API_KEY:如有接口鉴权,填写实际密钥;
    • TABLE_PATH:填写你的评论表格文件路径;
    • COMMENT_COLUMN:如果表格中评论列名不是 “评论内容”,修改为实际列名。

    扩展说明:

    • 批量大小控制:如果表格中评论数量超过 50 条,建议在代码中增加 “分批次处理” 逻辑(比如每 50 条调用一次 API),避免单次请求 token 超限;
    • 字段映射:分析结果会新增以下列到表格中:
      • sentiment_category:情感类别(1-5)
      • sentiment_score:情感分数(0-10)
      • has_scenario:是否有使用场景(0/1)
      • has_suggestion:是否有改进建议(0/1)
    • 编码问题:CSV 文件建议用 “UTF-8 带 BOM” 编码保存,避免中文乱码。
    # ==============================================================================
    # 标题:电商评论批量情感分析工具(表格版)
    # 功能:读取Excel/CSV表格中的评论数据,调用盘古NLP模型进行批量情感分析,
    #       并将结构化分析结果回写到表格中
    # 适配模型:pangu-nlp-n2-32k_urk0gt
    # 适用场景:电商评论批量结构化分析、用户反馈情感维度提取
    # ==============================================================================
    
    import requests
    import json
    import pandas as pd
    from tqdm import tqdm
    
    # -------------------------- 1. 配置项 --------------------------
    # API请求地址(替换为你的实际接口地址)
    API_URL = "https://your-api-endpoint.com/chat/completions"
    # API密钥(如有需要,替换为实际密钥)
    API_KEY = "your-api-key-here"
    # 表格文件路径(支持.xlsx/.csv)
    TABLE_PATH = "评论数据.xlsx"
    # 表格中存储评论的列名
    COMMENT_COLUMN = "评论内容"
    # 输出结果的表格路径
    OUTPUT_TABLE_PATH = "评论情感分析结果.xlsx"
    
    # -------------------------- 2. 核心函数 --------------------------
    def analyze_batch_comments_from_table():
        """
        从表格读取评论,调用方案1的批量分析接口,将结果回写到表格
        """
        # 1. 读取表格数据
        try:
            if TABLE_PATH.endswith(".xlsx"):
                df = pd.read_excel(TABLE_PATH)
            elif TABLE_PATH.endswith(".csv"):
                df = pd.read_csv(TABLE_PATH, encoding="utf-8-sig")
            else:
                raise ValueError("仅支持.xlsx和.csv格式的表格文件")
    
            # 检查评论列是否存在
            if COMMENT_COLUMN not in df.columns:
                raise ValueError(f"表格中未找到列名:{COMMENT_COLUMN}")
    
            # 过滤空评论
            df = df[df[COMMENT_COLUMN].notna() & (df[COMMENT_COLUMN] != "")].reset_index(drop=True)
            total_comments = len(df)
            print(f"成功读取表格,共{total_comments}条有效评论")
    
        except Exception as e:
            print(f"读取表格失败:{str(e)}")
            return
    
        # 2. 构造批量分析的Prompt和请求体
        # 拼接所有评论为带序号的文本
        comment_text = ""
        for idx, comment in enumerate(df[COMMENT_COLUMN].tolist(), 1):
            comment_text += f"{idx}.{comment.strip()}\n"
    
        # 构造system指令(方案1的Prompt)
        system_content = """你是电商评论分析专家,需从4个维度分析每条评论,严格按JSON数组格式输出,不添加额外内容。分析规则:1. 正负混合:同时出现褒贬表述(如"功能强但续航短");2. 不相关:文本与商品/服务无关(如纯表情、闲聊);3. 场景判断:提及使用时间/地点/场景(如"出国用"、"办公用");4. 建议判断:包含"希望"、"建议"、"应该"等改进表述。输出JSON格式要求:[{"comment_index":序号,"sentiment_category": 1-正面, 2-负面, 3-正负混合, 4-中性, 5-不相关, "sentiment_score": 0-10分(情感强烈程度,10分为极值), "has_scenario": 0(无使用场景)/1(有使用场景), "has_suggestion": 0(无建议)/1(有改进建议)}]。示例1:评论"在欧洲旅游时用这个翻译机,沟通完全无障碍,就是价格略高" → 对应数组项{"comment_index":1,"sentiment_category":3,"sentiment_score":8,"has_scenario":1,"has_suggestion":0};示例2:评论"翻译准确率太低,经常出错,建议优化算法" → 对应数组项{"comment_index":2,"sentiment_category":2,"sentiment_score":3,"has_scenario":0,"has_suggestion":1}"""
    
        # 构造请求体(方案1格式)
        request_body = {
            "model": "pangu-nlp-n2-32k_urk0gt",
            "messages": [
                {
                    "role": "system",
                    "content": system_content
                },
                {
                    "role": "user",
                    "content": f"请分析以下{total_comments}条评论:\n{comment_text}"
                }
            ],
            "temperature": 0.3,
            "max_tokens": 2000  # 根据评论数量调整,确保能容纳所有结果
        }
    
        # 3. 调用API进行批量分析
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {API_KEY}"  # 如有需要,根据接口要求调整
        }
    
        try:
            print("开始调用API进行批量情感分析...")
            response = requests.post(
                API_URL,
                headers=headers,
                data=json.dumps(request_body),
                timeout=300  # 批量分析超时时间设为5分钟
            )
            response.raise_for_status()  # 抛出HTTP错误
            result = response.json()
    
            # 4. 解析返回结果
            # 提取assistant的content内容
            content = result["choices"][0]["message"]["content"]
            # 清理JSON内容(去除```json和换行符)
            content = content.strip().replace("```json", "").replace("```", "").strip()
            analysis_results = json.loads(content)
    
            # 5. 将结果合并到原表格
            # 先将分析结果转为DataFrame
            result_df = pd.DataFrame(analysis_results)
            # 按comment_index排序(确保和原表格顺序一致)
            result_df = result_df.sort_values("comment_index").reset_index(drop=True)
    
            # 合并结果到原表格
            df = pd.concat([df, result_df.drop("comment_index", axis=1)], axis=1)
    
            # 6. 保存结果表格
            df.to_excel(OUTPUT_TABLE_PATH, index=False, encoding="utf-8-sig")
            print(f"分析完成!结果已保存至:{OUTPUT_TABLE_PATH}")
    
    # -------------------------- 2. 核心函数 --------------------------
    def analyze_batch_comments_from_table():
        """
        从表格读取评论,调用方案1的批量分析接口,将结果回写到表格
        """
        # 1. 读取表格数据
        try:
            if TABLE_PATH.endswith(".xlsx"):
                df = pd.read_excel(TABLE_PATH)
            elif TABLE_PATH.endswith(".csv"):
                df = pd.read_csv(TABLE_PATH, encoding="utf-8-sig")
            else:
                raise ValueError("仅支持.xlsx和.csv格式的表格文件")
    
            # 检查评论列是否存在
            if COMMENT_COLUMN not in df.columns:
                raise ValueError(f"表格中未找到列名:{COMMENT_COLUMN}")
    
            # 过滤空评论
            df = df[df[COMMENT_COLUMN].notna() & (df[COMMENT_COLUMN] != "")].reset_index(drop=True)
            total_comments = len(df)
            print(f"成功读取表格,共{total_comments}条有效评论")
    
        except Exception as e:
            print(f"读取表格失败:{str(e)}")
            return
    
        # 2. 构造批量分析的Prompt和请求体
        # 拼接所有评论为带序号的文本
        comment_text = ""
        for idx, comment in enumerate(df[COMMENT_COLUMN].tolist(), 1):
            comment_text += f"{idx}.{comment.strip()}\n"
    
        # 构造system指令(方案1的Prompt)
        system_content = """你是电商评论分析专家,需从4个维度分析每条评论,严格按JSON数组格式输出,不添加额外内容。分析规则:1. 正负混合:同时出现褒贬表述(如"功能强但续航短");2. 不相关:文本与商品/服务无关(如纯表情、闲聊);3. 场景判断:提及使用时间/地点/场景(如"出国用"、"办公用");4. 建议判断:包含"希望"、"建议"、"应该"等改进表述。输出JSON格式要求:[{"comment_index":序号,"sentiment_category": 1-正面, 2-负面, 3-正负混合, 4-中性, 5-不相关, "sentiment_score": 0-10分(情感强烈程度,10分为极值), "has_scenario": 0(无使用场景)/1(有使用场景), "has_suggestion": 0(无建议)/1(有改进建议)}]。示例1:评论"在欧洲旅游时用这个翻译机,沟通完全无障碍,就是价格略高" → 对应数组项{"comment_index":1,"sentiment_category":3,"sentiment_score":8,"has_scenario":1,"has_suggestion":0};示例2:评论"翻译准确率太低,经常出错,建议优化算法" → 对应数组项{"comment_index":2,"sentiment_category":2,"sentiment_score":3,"has_scenario":0,"has_suggestion":1}"""
    
        # 构造请求体(方案1格式)
        request_body = {
            "model": "pangu-nlp-n2-32k_urk0gt",
            "messages": [
                {
                    "role": "system",
                    "content": system_content
                },
                {
                    "role": "user",
                    "content": f"请分析以下{total_comments}条评论:\n{comment_text}"
                }
            ],
            "temperature": 0.3,
            "max_tokens": 2000  # 根据评论数量调整,确保能容纳所有结果
        }
    
        # 3. 调用API进行批量分析
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {API_KEY}"  # 如有需要,根据接口要求调整
        }
    
        try:
            print("开始调用API进行批量情感分析...")
            response = requests.post(
                API_URL,
                headers=headers,
                data=json.dumps(request_body),
                timeout=300  # 批量分析超时时间设为5分钟
            )
            response.raise_for_status()  # 抛出HTTP错误
            result = response.json()
    
            # 4. 解析返回结果
            # 提取assistant的content内容
            content = result["choices"][0]["message"]["content"]
            # 清理JSON内容(去除```json和换行符)
            content = content.strip().replace("```json", "").replace("```", "").strip()
            analysis_results = json.loads(content)
    
            # 5. 将结果合并到原表格
            # 先将分析结果转为DataFrame
            result_df = pd.DataFrame(analysis_results)
            # 按comment_index排序(确保和原表格顺序一致)
            result_df = result_df.sort_values("comment_index").reset_index(drop=True)
    
            # 合并结果到原表格
            df = pd.concat([df, result_df.drop("comment_index", axis=1)], axis=1)
    
            # 6. 保存结果表格
            df.to_excel(OUTPUT_TABLE_PATH, index=False, encoding="utf-8-sig")
            print(f"分析完成!结果已保存至:{OUTPUT_TABLE_PATH}")
    
        except requests.exceptions.RequestException as e:
            print(f"API调用失败:{str(e)}")
        except json.JSONDecodeError as e:
            print(f"解析返回结果失败:{str(e)},原始返回内容:{content}")
        except Exception as e:
            print(f"处理结果失败:{str(e)}")
    
    # -------------------------- 3. 执行入口 --------------------------
    if __name__ == "__main__":
        analyze_batch_comments_from_table()

基于分析结果制定业务决策

  1. 当前结果精准解读
    针对当前接口返回的结果数值,进行用户的情感分析。通过以下解析,用户对于当前产品的反馈为“好评”。
    表2 当前结果精准解读

    字段

    数值

    含义解析

    sentiment_category

    1

    情感类别为正面(符合评论中 “很快”“方便”“推荐” 的褒义表述)

    sentiment_score

    9

    情感强度达 9 分(满分 10 分),属于强烈正面情感,用户满意度极高

    has_scenario

    1

    包含使用场景(评论中 “国际会议上用” 明确了应用场景,可用于产品场景化推广)

    has_suggestion

    0

    无改进建议,说明用户对产品核心功能无负面反馈

  2. 结果落地应用场景
    1. 产品优化决策
      1. 提取高情感分(≥8 分)+ 有场景的评论,整理成 “用户满意场景库”(如本案例的 “国际会议场景”),用于产品宣传素材;
      2. 统计同类场景的正面评论占比,若 “商务场景” 满意度高,可针对性优化该场景下的功能(如翻译机的会议模式稳定性)。
    2. 客户分层运营
      1. 对发出 “正面 + 高情感分” 评论的用户,标记为 “核心忠诚用户”,后续推送新品试用、会员权益等;
      2. 结合has_suggestion=0的特征,这类用户可作为 “产品口碑大使”,邀请参与用户证言录制。
    3. 数据可视化呈现

      将批量结果按以下维度统计,生成决策报表:

      # 示例:基于DataFrame的统计分析
      import pandas as pd
      # 假设已加载批量分析结果df
      # 1. 各情感类别占比
      sentiment_dist = df["sentiment_category"].value_counts(normalize=True).map(lambda x: f"{x*100:.1f}%")
      print("情感类别分布:")
      print(sentiment_dist)
      # 2. 有场景的正面评论占比
      scenario_positive_ratio = len(df[(df["sentiment_category"]==1) & (df["has_scenario"]==1)]) / len(df[df["sentiment_category"]==1])
      print(f"\n有场景的正面评论占比:{scenario_positive_ratio:.1%}")
      # 3. 含改进建议的负面评论TOP3关键词(需结合分词工具)
      from jieba import lcut
      negative_suggestions = df[(df["sentiment_category"]==2) & (df["has_suggestion"]==1)]["comment"].tolist()
      all_words = []
      for comment in negative_suggestions:
          words = lcut(comment)
          all_words.extend([w for w in words if len(w)>=2])  # 过滤单字
      # 统计关键词频次(示例)
      from collections import Counter
      word_count = Counter(all_words).most_common(3)
      print("\n负面评论改进建议TOP3关键词:")
      for word, count in word_count:
          print(f"{word}: {count}次")
  3. 结果准确性验证方案

    为确保该 JSON 输出的可靠性,可通过以下步骤验证:

    1. 单条结果人工复核:对比原始评论与输出字段,确认:
      1. 情感类别是否匹配(如正面评论未误判为混合);
      2. 场景 / 建议判断是否准确(如 “国际会议” 是否被正确识别为场景);
      3. 情感分数是否合理(强烈正面评论分数≥8 分)。
    2. 批量准确率计算
      1. 随机抽取 100 条评论,人工标注正确结果;
      2. 对比模型输出与人工标注,计算准确率:
        # 假设人工标注结果存储在df["manual_category"]列
        correct = len(df[df["sentiment_category"] == df["manual_category"]])
        accuracy = correct / len(df)
        print(f"情感分类准确率:{accuracy:.1%}")
      3. 目标准确率≥90%,若低于阈值,需优化 Prompt(如增加示例、细化规则)。
    3. 边缘案例测试
      1. 测试模糊评论(如 “还行,不算差”)是否正确判为 “比较正面”;
      2. 测试混合情感评论(如 “功能强但价格高”)是否正确判为 “正负混合”;
      3. 测试无意义文本(如 “哈哈哈”)是否正确判为 “中性” 或 “不相关”。

相关文档