业务中敏感字校验遇到的问题
最近业务中有这么个需求,需要对付款对象名称做关键字校验,如果名称中包含烟、酒等关键敏感字样,则做预警处理;最开始 写了个简单的逻辑去处理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;
}
}
}
但是后来看了下付款对象的名称发现 想的过于简单了。
名称里包含酒或者烟,但不在预警规则内的数据不在少数 比如:烟台某某公司、某某大酒店;
各位大佬,有没有做过类似业务的。能给提供个解题思路吗
是需要在付款对象中新加字段用来区分对方具体的营业范围吗 地名加入白名单 楼上的地名数量少可以加入白名单,但是公司的就很难加入白名单了。我觉得增加字段校验是个不错的办法,但我没具体实施过,看下别的大神有没有更加好的办法 senmsenm2010 发表于 2023-4-6 15:49
地名加入白名单
地名有固定的名称可以增加白名单
但是公司名称没有固定写法 酒楼、酒店这个不太好维护 一只大菜猫 发表于 2023-4-6 16:39
楼上的地名数量少可以加入白名单,但是公司的就很难加入白名单了。我觉得增加字段校验是个不错的办法,但我 ...
刚刚突然想到,付款对象那块已经用了好一段时间了 数据量已经比较大了。这时候再加字段 让实施维护根本不现实{:17_1084:} 或者可以再加一个判断啊,存在酒店两个字的就排除 本帖最后由 林逸欣 于 2023-4-6 18:26 编辑
可以试试 中文分词比如
烟台某某公司分词以后变成['烟台','xx','公司']
某某大酒店分词["某某", "大酒店"]
有个扩展叫 jieba 你试试看只校验一下 单独的 酒,烟 搞个敏感词库看看行不行 去用一下ik分词器吧,这就以个分词的应用 # 框架
可以考虑使用开源敏感词过滤框架来解决这个问题,比如 (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]