hgnb1 发表于 2023-4-6 14:38

业务中敏感字校验遇到的问题

最近业务中有这么个需求,需要对付款对象名称做关键字校验,如果名称中包含烟、酒等关键敏感字样,则做预警处理;最开始 写了个简单的逻辑去处理
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

senmsenm2010 发表于 2023-4-6 15:49
地名加入白名单

地名有固定的名称可以增加白名单
但是公司名称没有固定写法 酒楼、酒店这个不太好维护

hgnb1 发表于 2023-4-6 16:53

一只大菜猫 发表于 2023-4-6 16:39
楼上的地名数量少可以加入白名单,但是公司的就很难加入白名单了。我觉得增加字段校验是个不错的办法,但我 ...

刚刚突然想到,付款对象那块已经用了好一段时间了 数据量已经比较大了。这时候再加字段 让实施维护根本不现实{:17_1084:}

一只大菜猫 发表于 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

# 框架
可以考虑使用开源敏感词过滤框架来解决这个问题,比如 (https://github.com/NLPchina/ansj_seg) 或 (https://github.com/wks/ik-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`。

# 正则表达式

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

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

示例代码如下:

```java
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`方法,用于检查给定的付款对象名称中是否包含敏感词。

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

```java
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`方法来检查付款对象名称是否包含敏感词。如果包含,则输出警告信息。

需要注意的是,这种处理敏感词的方式并不是完美的,因为可能会出现一些误判的情况。例如,如果敏感词列表中包含“大酒店”,则付款对象名称为“烟台某某大酒店”也会被视为敏感。仅供参考吧
页: [1]
查看完整版本: 业务中敏感字校验遇到的问题