使用POP API创建业务专属热词

更新时间:
复制 MD 格式

通过 POP API 可在客户端创建、获取、更新、删除和列举业务专属热词表,无需在控制台配置。一个词表包含一组业务相关的热词及其权重。

操作概览

以下接口使用 HTTPS POST 请求,API 版本为 2018-11-20。业务参数放在请求 Body 中,示例通过阿里云 Java SDK 的 CommonRequest 完成 RPC 请求签名和发送。

接口

用途

CreateAsrVocab

创建词表,返回后续操作使用的 VocabId。

GetAsrVocab

根据词表 ID 获取词表及词语权重。

UpdateAsrVocab

更新词表名称、描述和完整词语权重。

DeleteAsrVocab

根据词表 ID 删除词表。

ListAsrVocab

分页列举词表,不返回具体词语权重。

地域为 cn-shanghai,服务接入地址为 nls-slp.cn-shanghai.aliyuncs.com。

调用限制

默认每个账号最多创建 10 个业务专属热词表。

限制

上限

每个词表的热词数

500 个

单条纯中文热词

15 个汉字

单条纯英文热词

7 个英文单词

单条中英混合热词

汉字数与英文字母数之和不超过 15

热词必须使用 UTF-8 编码,不能包含标点和特殊字符。每个热词的权重为 −6~5 之间的整数。

说明
  • 权重大于 0 时增大该词语被识别的概率,小于 0 时减小该概率。

  • 权重为 −6 时,表示尽量不要识别出该词语。

  • 常用权重为 2。效果不明显时可适当增大权重,但权重过大可能导致其他词语识别不准确。

示例代码

示例演示创建、获取、更新和列举词表,并在结束时删除本次创建的词表。不会删除列举结果中的其他词表。

添加依赖和配置凭证

示例使用 aliyun-java-sdk-core 3.7.1 和 fastjson 1.2.83。SDK 安装配置请参见开始使用;通用请求的使用方法请参见泛化调用。

阿里云 Java SDK 核心库支持 3.5.0 及以上版本。使用 4.0.0 及以上版本时,还需添加对应的第三方依赖。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>3.7.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

配置环境变量 ALIYUN_AK_ID 和 ALIYUN_AK_SECRET,分别保存 AccessKey ID 和 AccessKey Secret。代码从环境变量读取凭证,无需传入命令行参数。

调用示例

WordWeights 更新后仅保留 watermelon,用于展示完整替换行为。示例只申请一个词表,执行前应确保账号仍有可用词表配额。

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import java.util.UUID;

public class AsrVocabPopApiDemo {
    private static final String REGION_ID = "cn-shanghai";
    private static final String DOMAIN = "nls-slp.cn-shanghai.aliyuncs.com";
    private final IAcsClient client;

    public AsrVocabPopApiDemo(String accessKeyId, String accessKeySecret) {
        client = new DefaultAcsClient(DefaultProfile.getProfile(
                REGION_ID, accessKeyId, accessKeySecret));
    }

    private CommonRequest request(String action) {
        CommonRequest request = new CommonRequest();
        request.setDomain(DOMAIN);
        request.setProtocol(ProtocolType.HTTPS);
        request.setVersion("2018-11-20");
        request.setMethod(MethodType.POST);
        request.setAction(action);
        return request;
    }

    private JSONObject execute(CommonRequest request) {
        CommonResponse response;
        try {
            response = client.getCommonResponse(request);
        } catch (ClientException e) {
            throw new IllegalStateException("Request failed: " + e.getErrCode());
        }
        JSONObject result = JSONObject.parseObject(response.getData());
        if (response.getHttpStatus() != 200) {
            throw new IllegalStateException("HTTP " + response.getHttpStatus()
                    + ", Code=" + result.getString("Code")
                    + ", Message=" + result.getString("Message")
                    + ", RequestId=" + result.getString("RequestId"));
        }
        return result;
    }

    public String createAsrVocab(String name, String description, JSONObject words) {
        CommonRequest request = request("CreateAsrVocab");
        request.putBodyParameter("Name", name);
        request.putBodyParameter("Description", description);
        request.putBodyParameter("WordWeights", words.toJSONString());
        return execute(request).getString("VocabId");
    }

    public JSONObject getAsrVocab(String vocabId) {
        CommonRequest request = request("GetAsrVocab");
        request.putBodyParameter("Id", vocabId);
        return execute(request).getJSONObject("Vocab");
    }

    public void updateAsrVocab(String vocabId, String name,
            String description, JSONObject words) {
        CommonRequest request = request("UpdateAsrVocab");
        request.putBodyParameter("Id", vocabId);
        request.putBodyParameter("Name", name);
        request.putBodyParameter("Description", description);
        request.putBodyParameter("WordWeights", words.toJSONString());
        execute(request);
    }

    public JSONObject listAsrVocab(int pageNumber, int pageSize) {
        CommonRequest request = request("ListAsrVocab");
        request.putBodyParameter("PageNumber", pageNumber);
        request.putBodyParameter("PageSize", pageSize);
        return execute(request).getJSONObject("Page");
    }

    public void deleteAsrVocab(String vocabId) {
        CommonRequest request = request("DeleteAsrVocab");
        request.putBodyParameter("Id", vocabId);
        execute(request);
    }

    private static String requiredEnv(String name) {
        String value = System.getenv(name);
        if (value == null || value.trim().isEmpty()) {
            throw new IllegalArgumentException("Set environment variable " + name);
        }
        return value;
    }

    public static void main(String[] args) {
        AsrVocabPopApiDemo demo = new AsrVocabPopApiDemo(
                requiredEnv("ALIYUN_AK_ID"), requiredEnv("ALIYUN_AK_SECRET"));
        String name = "example_vocab_" + UUID.randomUUID().toString();
        JSONObject words = new JSONObject();
        words.put("apple", 3);
        words.put("watermelon", 3);

        String vocabId = demo.createAsrVocab(name, "Example vocabulary", words);
        System.out.println("Created vocabulary: " + vocabId);
        try {
            System.out.println("Vocabulary: " + demo.getAsrVocab(vocabId));

            JSONObject updatedWords = new JSONObject();
            updatedWords.put("watermelon", 2);
            demo.updateAsrVocab(vocabId, name, "Updated vocabulary", updatedWords);
            System.out.println("Updated vocabulary: " + demo.getAsrVocab(vocabId));

            JSONObject page = demo.listAsrVocab(1, 10);
            System.out.println("Total vocabularies: " + page.getIntValue("TotalItems"));
        } finally {
            demo.deleteAsrVocab(vocabId);
            System.out.println("Deleted example vocabulary: " + vocabId);
        }
    }
}

参数说明

创建词表

调用 CreateAsrVocab 创建词表。

请求参数

参数

类型

必填

说明

Name

String

是

词表名称。

WordWeights

String

是

表示词语及权重的 JSON 对象字符串。键为 String 类型的热词,值为 Int 类型的权重,例如 {"apple":3,"watermelon":3}。

Description

String

否

词表描述。

返回参数

请求成功时返回 HTTP 200,Body 为 JSON 对象。

参数

类型

说明

RequestId

String

请求 ID。

VocabId

String

词表 ID,用于后续获取、更新和删除词表。

获取词表

调用 GetAsrVocab 获取指定词表的信息。

请求参数

参数

类型

必填

说明

Id

String

是

创建词表时返回的 VocabId。

返回参数

参数

类型

说明

RequestId

String

请求 ID。

Vocab

Object

词表对象,字段如下。

Vocab 字段

字段

类型

说明

Id

String

词表 ID,与创建时返回的 VocabId 相同。

Name

String

词表名称。

Description

String

词表描述。

Size

Int

词表编译后的大小。

Md5

String

词表编译后的 MD5 值。

CreateTime

String

创建时间。

UpdateTime

String

更新时间。

WordWeights

Map

词表中的热词及其权重。

更新词表

调用 UpdateAsrVocab 更新词表名称、描述及词语权重。WordWeights 会完整替换原词表中的词语和权重,并非追加;需要保留的热词也必须包含在本次请求中。

请求参数

参数

类型

必填

说明

Id

String

是

词表 ID。

Name

String

是

更新后的词表名称。

WordWeights

String

是

更新后的完整词语权重,格式与创建词表时相同。

Description

String

否

更新后的词表描述。

返回参数

请求成功时返回 HTTP 200,JSON 响应中的 RequestId(String)为请求 ID。

删除词表

调用 DeleteAsrVocab 删除指定词表。

请求参数

参数

类型

必填

说明

Id

String

是

需要删除的词表 ID。

返回参数

请求成功时返回 HTTP 200,JSON 响应中的 RequestId(String)为请求 ID。

列举词表

调用 ListAsrVocab 分页获取词表。服务端按词表修改时间降序排列,返回内容不包含具体热词及其权重,以减少响应体大小。

请求参数

参数

类型

必填

说明

PageNumber

Int

否

页号,默认 1,必须大于 0。

PageSize

Int

否

每页词表数量,默认 10,按 10~100 设置。

返回参数

参数

类型

说明

RequestId

String

请求 ID。

Page

Object

分页结果,字段如下。

Page 字段

字段

类型

说明

Content

List<Vocab>

词表数组。字段与获取词表中的 Vocab 相同,但不包含 WordWeights。

PageNumber

Int

当前页号。

PageSize

Int

每页词表数量。

TotalPages

Int

总页数,不足一页按一页计算。

TotalItems

Int

总词表数。

错误码

请求失败时,HTTP 状态码不是 200,Body 中的 JSON 对象包含 Code、Message 和 RequestId。根据错误码和具体消息排查问题。

错误码

说明与处理方法

SLP.NOT_FOUND

词表不存在。检查词表 ID 是否正确或是否已删除。

SLP.PARAMETER_ERROR

参数错误。根据 Message 检查词表容量、词语长度、权重等参数。

SLP.EXCEED_LIMIT

词表数超过上限。默认每个账号最多创建 10 个词表。

SLP.ASR_VOCAB_ERROR

词表相关错误,例如编译失败。根据 Message 检查提交内容。

MissingName

缺少必填参数 Name。

MissingWordWeights

缺少必填参数 WordWeights。

如果将 PageNumber 设置为 0,请求会返回 SLP.SERVER_ERROR。将页号改为大于 0 的整数后重试。