阿里云文本审核(java敏感词效验)

文本敏感词校验

背景: 用户社区评论或分享的文章或评论,需要合法合规,不能包含涉政等违规的铭感词.

使用阿里云的内容审核

准备工作

  • 阿里云账号,需要开通敏感词服务 注意(有accessKeyId和accessKeySecret)都不行,须开通服务
  • 文档地址: https://help.aliyun.com/document_detail/70439.html?spm=a2c4g.11186623.6.701.1cea2188bMuZUi
  • 调试地址:https://next.api.aliyun.com/api/Green/2018-05-09/TextScan

java代码(做一次笔记吧qaq)

  • 依赖
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.5.16</version>
</dependency>
  • 代码
@Slf4j
@Component
public class AliYunWordFilterHandler {

    private static final String region = "cn-beijing";

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

	//设置获取client
    private IAcsClient getClient() {
        IClientProfile profile = DefaultProfile.getProfile(region, accessKeyId, accessKeySecret);
        //下面走的是阿帕奇的,自行选择
        // DefaultProfile profile1 = DefaultProfile.getProfile(region, accessKeyId, accessKeySecret);         
        return new DefaultAcsClient(profile);
    }
    
	//设置请求头
    private CommonRequest getDefaultCommonRequest() {
        CommonRequest request = new CommonRequest();
        request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.POST);
        request.setDomain("green.cn-beijing.aliyuncs.com");
        request.setVersion("2018-05-09");
        request.setUriPattern("/green/text/scan"); //垃圾扫描    request.setUriPattern("/green/text/feedback"); // 垃圾反馈
        //设置超时时间
        request.setSysConnectTimeout(6000);
        request.setSysReadTimeout(6000);
        request.putHeadParameter("Content-Type", "application/json");
        return request;
    }
    
	//请求参数封装 map
    private Map<String, Object> getExecuteMap(List<String> tasks) {
        Map<String, Object> resultMap = new HashMap<>(2);
        List<Map<String, Object>> inputBodyList = new ArrayList<>();

        for (String task : tasks) {
            Map<String, Object> requestBodyMap = new HashMap<String, Object>();
            requestBodyMap.put("dataId", UUID.randomUUID().toString());
            requestBodyMap.put("content", task); // 待检测的文本,长度不超过10000个字符
            inputBodyList.add(requestBodyMap);
        }
        resultMap.put("scenes", Collections.singletonList("antispam")); // 检测场景,文本垃圾检测传递:antispam
        resultMap.put("tasks", inputBodyList);
        return resultMap;
    }
    
	//请求参数封装 JSONObject (linkhashMap)
    private JSONObject getExecuteJSONObject(List<String> tasks) {
        JSONObject resultMap = new JSONObject();
        JSONArray inputBodyList = new JSONArray();
        for (String task : tasks) {
            JSONObject requestBody = new JSONObject();
            requestBody.put("dataId", UUID.randomUUID().toString());
            requestBody.put("content", task); // 待检测的文本,长度不超过10000个字符*/
            inputBodyList.add(requestBody);
        }
        resultMap.put("scenes", Collections.singletonList("antispam")); // 检测场景,文本垃圾检测传递:antispam
        resultMap.put("tasks", inputBodyList);
        return resultMap;
    }

    //批量效验,阿里的api 详情批量限制100个,单个长度不能超过10000
	@TimerLog
    public List<AuditInfo> textReviews(List<String> content) {
        List<AuditInfo> result = new LinkedList<>();
        IAcsClient client = getClient();
        CommonRequest request = getDefaultCommonRequest();
        Map<String, Object> executeMap = getExecuteMap(content);
        log.info("阿里敏感词检测:[start]:\n {}", JSONUtils.toString(executeMap));
        request.setHttpContent(JSONUtils.toString(executeMap).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8.name(), JSON);
        try {
            CommonResponse response = client.getCommonResponse(request);
            log.info("阿里敏感词检测:[end]:\n {}", response.getData());
            HttpResponse httpResponse = response.getHttpResponse();
            if (httpResponse.isSuccess()) {
                log.info("敏感词效验 成功");
                String responseContent = new String(httpResponse.getHttpContent(), StandardCharsets.UTF_8);
                JSONObject scrResponse = JSONUtils.parseObject(responseContent, JSONObject.class);
                if (200 == scrResponse.getInteger("code")) {
                    JSONArray taskResults = scrResponse.getJSONArray("data");
                    for (int i = 0; i < taskResults.size(); i++) {
                        JSONObject taskResultObj = taskResults.getJSONObject(i);
                        AuditInfo auditInfo = new AuditInfo();
                        //如果被检测文本命中了自定义关键词词库中的关键词,则会返回当前字段,并将命中的关键词替换为星号(*)。
                        String filteredContent = taskResultObj.getString("filteredContent");
                        auditInfo.setContent(filteredContent);
                        if (200 == taskResultObj.getInteger("code")) {
                            JSONArray sceneResults = taskResultObj.getJSONArray("results");
                            for (int j = 0; j < sceneResults.size(); j++) {
                                JSONObject taskSubObject = sceneResults.getJSONObject(j);
                                //这里检测只使用一个 result 结果,检测文本为一个
                                String scene = taskSubObject.getString("scene");
                                //pass:文本正常,可以直接放行。 review:文本需要进一步人工审核。 block:文本违规,可以直接删除或者限制公开。
                                //@see https://help.aliyun.com/document_detail/70439.html?spm=a2c4g.11186623.6.701.1cea2188bMuZUi
                                String suggestion = taskSubObject.getString("suggestion");
                                String label = taskSubObject.getString("label");
                                double rate = taskSubObject.getDouble("rate");
                                auditInfo = convertMsg(label, auditInfo, rate);
                                result.add(auditInfo);
                            }
                        } else {
                            System.out.println("task process fail:" + taskResultObj.getInteger("code"));
                            log.error("阿里敏感词检测:请求超时!");
                        }
                    }
                } else {
                    log.error("检测状态失败 code:{}", scrResponse.getInteger("code"));
                }
            }
        } catch (ClientException e) {
            log.error("请求调用失败,检查是否是超时");
            e.printStackTrace();
        }
        return result;
    }
    
//标签效验
private AuditInfo convertMsg(String label, AuditInfo audit, double rate) {
        //正常放行  normal:正常文本 spam:含垃圾信息 ad:广告 flood:灌水  meaningless:无意义 customized:自定义(例如命中自定义关键词)
        //拦截 politics:涉政 terrorism:暴恐 abuse:辱骂 porn:色情 contraband:违禁
        audit.setResult(true);
        audit.setMsg("审核正常");
        switch (label) {
            case "normal":
                break;
            case "spam":
                if (rate > 50.0) {
                    audit.setResult(true);
                    audit.setMsg("含垃圾信息");
                }
                break;
            case "ad":
                if (rate > 50.0) {
                    audit.setResult(true);
                    audit.setMsg("广告");
                }
                break;
            case "politics":
                audit.setResult(false);
                audit.setMsg("涉政");
                break;
            case "terrorism":
                audit.setResult(false);
                audit.setMsg("暴恐");
                break;
            case "abuse":
                if (rate > 70.0) {
                    audit.setResult(false);
                    audit.setMsg("辱骂");
                }
                break;
            case "porn":
                if (rate > 90.0) {
                    audit.setResult(false);
                    audit.setMsg("色情");
                }
                break;
            case "flood":
                if (rate > 95.0) {
                    audit.setResult(true);
                    audit.setMsg("灌水");
                }
                break;
            case "contraband":
                audit.setResult(false);
                audit.setMsg("违禁");
                break;
            case "meaningless":
                if (rate > 95.0) {
                    audit.setResult(true);
                    audit.setMsg("无意义");
                }
                break;
            case "qrcode":
                if (rate > 60.0) {
                    audit.setResult(true);
                    audit.setMsg("二维码");
                }
                break;
            default:
                audit.setResult(true);
                audit.setMsg("自定义");
                break;
        }
        return audit;
    }


/**
 * @author: craywen
 * @date: 2021-05-25 14:23
 * @desc: 审核结果
 */
@Data
public class AuditInfo {

    /**
     * 审核结果
     */
    private boolean result;

    /**
     * 返回的消息
     */
    private String msg;

    /**
     * 内容
     */
    private String content;

}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以使用 Java 中的正则表达式来实现文本内容敏感词过滤。具体步骤如下: 1. 定义敏感词列表,将所有需要过滤的敏感词保存到一个数组或列表中。 2. 构造正则表达式,将敏感词列表中的所有敏感词用竖线 "|" 连接起来,形成一个正则表达式。 3. 对文本内容进行过滤,使用 String 类的 replaceAll() 方法,将文本中的敏感词替换成指定的字符或字符串。 下面是一个简单的示例代码: ```java import java.util.regex.Pattern; public class SensitiveWordFilter { private static final String[] sensitiveWords = {"敏感词1", "敏感词2", "敏感词3"}; private static final String REPLACEMENT = "***"; private static final String REGEX = String.join("|", sensitiveWords); private static final Pattern PATTERN = Pattern.compile(REGEX); public static String filter(String text) { return PATTERN.matcher(text).replaceAll(REPLACEMENT); } public static void main(String[] args) { String text = "这是一段包含敏感词文本敏感词1和敏感词2都出现了。"; String filteredText = SensitiveWordFilter.filter(text); System.out.println(filteredText); } } ``` 这个示例代码中,我们首先定义了敏感词列表 sensitiveWords,以及需要替换的字符串 REPLACEMENT。然后,我们将敏感词列表中的所有敏感词用竖线 "|" 连接起来,形成一个正则表达式 REGEX。最后,我们使用 Pattern 类将正则表达式编译成一个模式 PATTERN,然后在 filter() 方法中使用 PATTERN.matcher() 方法来匹配文本中的敏感词,并使用 replaceAll() 方法将敏感词替换成 REPLACEMENT。 在示例代码中,我们使用 main() 方法来演示如何使用 SensitiveWordFilter 类来过滤敏感词。在 main() 方法中,我们首先定义了一个包含敏感词文本 text,然后调用 SensitiveWordFilter.filter() 方法对文本进行过滤,并将过滤后的结果打印出来。 ### 回答2: 在Java中实现文本内容的敏感词过滤可以通过以下步骤完成: 步骤1:构建敏感词字典 建立一个包含敏感词的字典,可以将敏感词保存在一个List或Set等数据结构中,也可以将敏感词保存在一个文本文件中,读取到内存中进行使用。 步骤2:读取待过滤的文本 读取待过滤的文本内容,可以将文本保存在一个字符串变量中。 步骤3:敏感词过滤 遍历敏感词字典,使用正则表达式等方式在文本中查找是否存在敏感词。可以使用Java提供的正则表达式类库,例如Java.util.regex类库,或者使用Apache Commons Lang等第三方类库。 步骤4:替换敏感词 通过替换或标记的方式将敏感词文本中进行处理。可以使用String的replace方法将敏感词替换成指定的字符,例如“***”或“*”。也可以使用其他方式对敏感词进行处理,例如替换成全角空格等。 步骤5:返回过滤后的文本 返回过滤后的文本内容,可以直接输出结果或保存到文件等。 通过以上步骤,即可实现Java文本内容的敏感词过滤。根据实际需要,可以进一步优化算法和数据结构,提高过滤性能和效果。 ### 回答3: Java语言可以通过正则表达式和基本的字符串操作来实现文本内容的敏感词过滤。 首先,我们需要准备一个敏感词库,将敏感词以字符串数组的形式存储起来。 使用Java的字符串类提供的replace方法可以将文本中的敏感词替换为指定的字符串。我们可以遍历敏感词库中的敏感词,然后使用replace方法将文本中的敏感词替换为“***”等符号。 另一种方法是使用Java的正则表达式工具包,如Pattern类和Matcher类,将文本中的敏感词进行匹配。首先,将敏感词库中的敏感词使用竖线“|”连接起来,形成一个正则表达式,然后使用Pattern类进行编译。编译后的Pattern对象可以用于对文本进行匹配。当匹配到敏感词时,可以使用Matcher类的replace方法将敏感词替换为指定的字符串。 另外,为了提高敏感词过滤的效率,可以使用Trie树(字典树)数据结构来存储敏感词库。Trie树可以将敏感词库构建成一个树状结构,使得在过滤文本时能够快速查找和匹配敏感词。 最后,我们可以将实现的文本内容敏感词过滤功能封装成一个方法,供其他程序调用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值