通过 POP API 可在客户端创建、获取、更新、删除和列举业务专属热词表,无需在控制台配置。一个词表包含一组业务相关的热词及其权重。
操作概览
以下接口使用 HTTPS POST 请求,API 版本为 2018-11-20。业务参数放在请求 Body 中,示例通过阿里云 Java SDK 的 CommonRequest 完成 RPC 请求签名和发送。
|
接口 |
用途 |
|
|
创建词表,返回后续操作使用的 |
|
|
根据词表 ID 获取词表及词语权重。 |
|
|
更新词表名称、描述和完整词语权重。 |
|
|
根据词表 ID 删除词表。 |
|
|
分页列举词表,不返回具体词语权重。 |
地域为 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 创建词表。
请求参数
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
是 |
词表名称。 |
|
|
String |
是 |
表示词语及权重的 JSON 对象字符串。键为 String 类型的热词,值为 Int 类型的权重,例如 |
|
|
String |
否 |
词表描述。 |
返回参数
请求成功时返回 HTTP 200,Body 为 JSON 对象。
|
参数 |
类型 |
说明 |
|
|
String |
请求 ID。 |
|
|
String |
词表 ID,用于后续获取、更新和删除词表。 |
获取词表
调用 GetAsrVocab 获取指定词表的信息。
请求参数
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
是 |
创建词表时返回的 |
返回参数
|
参数 |
类型 |
说明 |
|
|
String |
请求 ID。 |
|
|
Object |
词表对象,字段如下。 |
Vocab 字段
|
字段 |
类型 |
说明 |
|
|
String |
词表 ID,与创建时返回的 |
|
|
String |
词表名称。 |
|
|
String |
词表描述。 |
|
|
Int |
词表编译后的大小。 |
|
|
String |
词表编译后的 MD5 值。 |
|
|
String |
创建时间。 |
|
|
String |
更新时间。 |
|
|
Map |
词表中的热词及其权重。 |
更新词表
调用 UpdateAsrVocab 更新词表名称、描述及词语权重。WordWeights 会完整替换原词表中的词语和权重,并非追加;需要保留的热词也必须包含在本次请求中。
请求参数
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
是 |
词表 ID。 |
|
|
String |
是 |
更新后的词表名称。 |
|
|
String |
是 |
更新后的完整词语权重,格式与创建词表时相同。 |
|
|
String |
否 |
更新后的词表描述。 |
返回参数
请求成功时返回 HTTP 200,JSON 响应中的 RequestId(String)为请求 ID。
删除词表
调用 DeleteAsrVocab 删除指定词表。
请求参数
|
参数 |
类型 |
必填 |
说明 |
|
|
String |
是 |
需要删除的词表 ID。 |
返回参数
请求成功时返回 HTTP 200,JSON 响应中的 RequestId(String)为请求 ID。
列举词表
调用 ListAsrVocab 分页获取词表。服务端按词表修改时间降序排列,返回内容不包含具体热词及其权重,以减少响应体大小。
请求参数
|
参数 |
类型 |
必填 |
说明 |
|
|
Int |
否 |
页号,默认 1,必须大于 0。 |
|
|
Int |
否 |
每页词表数量,默认 10,按 10~100 设置。 |
返回参数
|
参数 |
类型 |
说明 |
|
|
String |
请求 ID。 |
|
|
Object |
分页结果,字段如下。 |
Page 字段
|
字段 |
类型 |
说明 |
|
|
List<Vocab> |
词表数组。字段与获取词表中的 |
|
|
Int |
当前页号。 |
|
|
Int |
每页词表数量。 |
|
|
Int |
总页数,不足一页按一页计算。 |
|
|
Int |
总词表数。 |
错误码
请求失败时,HTTP 状态码不是 200,Body 中的 JSON 对象包含 Code、Message 和 RequestId。根据错误码和具体消息排查问题。
|
错误码 |
说明与处理方法 |
|
|
词表不存在。检查词表 ID 是否正确或是否已删除。 |
|
|
参数错误。根据 |
|
|
词表数超过上限。默认每个账号最多创建 10 个词表。 |
|
|
词表相关错误,例如编译失败。根据 |
|
|
缺少必填参数 |
|
|
缺少必填参数 |
如果将 PageNumber 设置为 0,请求会返回 SLP.SERVER_ERROR。将页号改为大于 0 的整数后重试。