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

5,132 阅读2分钟

前言

项目地址:Text-Sensitivity

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

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

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

目录结构

├── 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 语法糖,一定程度简化了开发流程。

核心代码

// 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());
	});
}