吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 873|回复: 9
收起左侧

[求助] 业务中敏感字校验遇到的问题

[复制链接]
hgnb1 发表于 2023-4-6 14:38
最近业务中有这么个需求,需要对付款对象名称做关键字校验,如果名称中包含烟、酒等关键敏感字样,则做预警处理;最开始 写了个简单的逻辑去处理
[Asm] 纯文本查看 复制代码
public void test1(){
        Set<String>  sensitiveWords=new HashSet<>();
        sensitiveWords.add("烟");
        sensitiveWords.add("酒");
        String text="酒水";
        for(String sensitiveWord:sensitiveWords){
            if(text.contains(sensitiveWord)){
                System.out.println("输入的文本存在敏感词。——"+sensitiveWord);
                break;
            }
        }
    }


但是后来看了下付款对象的名称发现 想的过于简单了。
名称里包含酒或者烟,但不在预警规则内的数据不在少数 比如:烟台某某公司、某某大酒店;
各位大佬,有没有做过类似业务的。能给提供个解题思路吗

是需要在付款对象中新加字段用来区分对方具体的营业范围吗

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

m99 发表于 2023-4-6 15:49
地名加入白名单
一只大菜猫 发表于 2023-4-6 16:39
楼上的地名数量少可以加入白名单,但是公司的就很难加入白名单了。我觉得增加字段校验是个不错的办法,但我没具体实施过,看下别的大神有没有更加好的办法
 楼主| hgnb1 发表于 2023-4-6 16:49

地名有固定的名称  可以增加白名单
但是公司名称没有固定写法 酒楼、酒店  这个不太好维护
 楼主| hgnb1 发表于 2023-4-6 16:53
一只大菜猫 发表于 2023-4-6 16:39
楼上的地名数量少可以加入白名单,但是公司的就很难加入白名单了。我觉得增加字段校验是个不错的办法,但我 ...

刚刚突然想到,付款对象那块已经用了好一段时间了 数据量已经比较大了。这时候再加字段 让实施维护根本不现实
一只大菜猫 发表于 2023-4-6 17:40
或者可以再加一个判断啊,存在酒店两个字的就排除
godonlyknow 发表于 2023-4-6 18:22
本帖最后由 林逸欣 于 2023-4-6 18:26 编辑

可以试试 中文分词  比如
     烟台某某公司  分词以后变成  ['烟台','xx','公司']
     某某大酒店  分词  ["某某", "大酒店"]
有个扩展叫 jieba 你试试看  只校验一下 单独的 酒,烟
d199212 发表于 2023-4-7 09:09
搞个敏感词库看看行不行
yimi88 发表于 2023-4-20 15:51
去用一下ik分词器吧,这就以个分词的应用
chris3will 发表于 2023-4-21 10:54

框架

可以考虑使用开源敏感词过滤框架来解决这个问题,比如 ansj_segIK Analyzer。这些框架都支持用户自定义敏感词词库,并且提供了丰富的 API 来满足不同的需求。你可以将付款对象名称作为输入文本,然后使用敏感词过滤框架来检测是否存在敏感词,如果存在则做相应的预警处理。以下是一个简单的使用 ansj_seg 的例子:

import org.ansj.splitWord.analysis.DicAnalysis;
import java.util.HashSet;
import java.util.Set;

public class SensitiveWordFilter {
    private Set<String> sensitiveWords = new HashSet<>();

    public SensitiveWordFilter() {
        // 加载敏感词词库
        sensitiveWords.add("烟");
        sensitiveWords.add("酒");
    }

    public boolean containsSensitiveWord(String text) {
        // 使用 ansj_seg 进行分词
        String[] words = DicAnalysis.parse(text).toStringWithOutNature(", ").split(", ");
        // 检测是否存在敏感词
        for (String word : words) {
            if (sensitiveWords.contains(word)) {
                return true;
            }
        }
        return false;
    }
}

在上面的例子中,我们首先在构造函数中加载了敏感词词库,然后定义了一个 containsSensitiveWord 方法来检测文本是否存在敏感词。在方法中,我们使用 ansj_seg 对文本进行分词,然后检测每个词语是否是敏感词。如果存在敏感词,则返回 true,否则返回 false

正则表达式

同时也可以考虑对分词结果进行过滤、对敏感词进行打码等。

或者可以用正则表达式的方式处理,我们可以先将敏感词列表转换为正则表达式,然后使用正则表达式匹配付款对象名称,从而判断是否触发预警规则。

示例代码如下:

import java.util.*;
import java.util.regex.*;

public class SensitiveWordsDetector {
    private Set<String> sensitiveWords;
    private Pattern pattern;

    public SensitiveWordsDetector(Set<String> sensitiveWords) {
        this.sensitiveWords = sensitiveWords;
        // 将敏感词列表转换为正则表达式
        String regex = String.join("|", sensitiveWords);
        pattern = Pattern.compile(regex);
    }

    public boolean containsSensitiveWords(String text) {
        Matcher matcher = pattern.matcher(text);
        return matcher.find();
    }
}

在上面的代码中,我们将敏感词列表转换为正则表达式,并编译成一个Pattern对象。然后,我们定义了一个containsSensitiveWords方法,用于检查给定的付款对象名称中是否包含敏感词。

接下来,我们可以使用如下代码来使用上述类:

public void test2() {
    Set<String> sensitiveWords = new HashSet<>();
    sensitiveWords.add("烟");
    sensitiveWords.add("酒");
    SensitiveWordsDetector detector = new SensitiveWordsDetector(sensitiveWords);
    String text = "酒水";
    if (detector.containsSensitiveWords(text)) {
        System.out.println("输入的文本存在敏感词。——" + text);
    }
}

上述代码中,我们首先创建了一个SensitiveWordsDetector对象,并将敏感词列表传递给构造函数。然后,我们使用containsSensitiveWords方法来检查付款对象名称是否包含敏感词。如果包含,则输出警告信息。

需要注意的是,这种处理敏感词的方式并不是完美的,因为可能会出现一些误判的情况。例如,如果敏感词列表中包含“大酒店”,则付款对象名称为“烟台某某大酒店”也会被视为敏感。仅供参考吧

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表