Jiahonzheng's Blog

敏感词检测:整合阿里云与腾讯云相关API

字数统计: 589阅读时长: 2 min
2018/02/11 Share

前言

项目地址:Text-Sensitivity

笔者在开发小程序时,由于需要对用户输入内容进行敏感词检查,故需要使用现有服务商的相关 API(自行开发NLP产品,难度大)。

我们技术团队初步使用的是腾讯云的文智,但由于我们的使用姿势不正确(腾讯云控制台密钥复制错误,导致鉴权总是失败),放弃了腾讯云的产品,转向对开发者更为友好的阿里云文本反垃圾 API

在成功将阿里云 API 投入到当前业务中运行后,我们认为在小程序审核上内容安全上,我们的产品是没有问题的。但小程序审核结果大失所望,产品的内容审核机制仍不够完善,于是就有了整合阿里云与腾讯云两大敏感词检测 API 的想法。

目录结构

1
2
3
4
5
├── README.md
├── aliTextSensitivity.js
├── config.json
├── index.js
└── qcloudTextSensitivity.js

说明

  • index.js:整合阿里云与腾讯云敏感词检测
  • aliTextSensitivity.js:阿里云敏感词检测
  • qcloudTextSensitivity.js:腾讯云敏感词检测
  • config.json:API 配置

项目代码

Promise 的使用

aliTextSensitivity.jsqcloudTextSensitivity.js 使用了 Promise 对业务进行了封装。

index.js 使用了 await 语法糖,一定程度简化了开发流程。

核心代码

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// index.js
async function checkTextSensitivity(order) {
let aliResult = await aliTextSensitivity(order);
let qcloudResult = await qcloudTextSensitivity(order);

// 当且仅当阿里云和腾讯云的审核通过,该词汇才会被审核通过
if (aliResult === 1 && qcloudResult === 1) {
return 1;
}

return 0;
}

// aliTextSensitivity.js
async function checkTextSensitivity(order) {
bizCfg.requestBody = JSON.stringify({
scenes: ["antispam"],
tasks: [{
"content": order
}]
});

// 使用 Promise 对业务封装
return new Promise((resolve, reject) => {
green(bizCfg, function (result) {
let greenResult = JSON.parse(result);

// 使用阿里云返回的文本建议作为判断阈值
if (greenResult.data[0].results[0].suggestion !== "pass") {
resolve(0);
}

resolve(1);
});
});
}

// qcloudTextSensitivity.js
async function qcloudTextSensitivity(order) {
let promises = [];

// 搭建 Promise 数组
for (let i = 1; i <= 2; i++) {
promises.push(new Promise((resolve ,reject) => {
capi.request({
Region: "gz" ,
Action: "TextSensitivity" ,
content: order ,
type: i
} ,function (err ,data) {
if (err) {
console.log(err);
reject();
}
resolve(data);
});
}));
}

// 对 Promise 数组使用 Promise.all 方法
return new Promise((resolve, reject) => {
Promise.all(promises)
.then(data => {
if (data[0].sensitive > 0.5 || data[1].sensitive > 0.5) {
resolve(0);
}
resolve(1);
})
.catch(() => reject());
});
}
CATALOG
  1. 1. 前言
  2. 2. 目录结构
    1. 2.1. 说明
  3. 3. 项目代码
    1. 3.1. Promise 的使用
    2. 3.2. 核心代码