java文本敏感词、关键字搜索检测

背景

在做一些跟内容相关的项目的时候,经常需要对内容文本中的内容进行检测,检测文本中是否包含某个敏感、违法等词汇,例如“贷款”、“发票”之类的。有些狡猾的用户可能知道“贷款”在你的系统中是敏感词,不能审核通过,便使用“贷 款”、“贷$款”、"贷;款"等这种方式故意欺骗你的系统,让你的系统无法简单找出这些敏感词。

解决方案

解决方案一:使用List的contains方法检测文本中是否有敏感词

这个是最容易想到的,将所有敏感词存放在List中,每次需要检测文本中是否有敏感词的时候,for循环list列表,使用contains方法判断文本中是否包含关键词,如果有则返回true,如果循环结束还没有找到的话则不包含敏感词。代码大概如下:

String text="贷款测试";
for(String str: blackList){
  if(text.contains(str)){
    return true;
  }
}
return false;

使用这种方式的优点就是简单,但是每次检测的时候,如果文本中没有敏感词,都得把每个黑词循环一遍,如果系统对性能要求比较高,可能速度满足不了性能需求。

解决方案二:使用开源项目https://github.com/toolgood/ToolGood.Words

1、该项目大致思路为将所有黑词加载到List

public static List<String> loadKeywords(File file){
		List<String> keyArray=new ArrayList<String>();
		try{
			BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
			String s = null;
			while((s = br.readLine())!=null){//使用readLine方法,一次读一行
				keyArray.add(s);
			}
			br.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return keyArray;
    }

示例代码是从txt文本文件中加载黑词,在我们实际项目中可以改为从数据库中读取

2、定义IllegalWordsSearch对象

IllegalWordsSearch iwords = new IllegalWordsSearch();
iwords.SetKeywords(list);

3、使用IllegalWordsSearch敏感词过滤方法,常用的有如下:

(1)ContainsAny 判断文本是否包含关键字

(2)FindFirst 找出文本中第一个关键字

(3)FindAll 在文本中查找所有的关键字

……

值得一提的是该项目支持过滤跳词,即如果你的关键词为“贷款”,如果文本是“贷 款”、“贷;款”之类的也是可以识别的。

作者在项目中也给出了速度测试,速度也很不错。

另外项目中也包含一些繁体简体互转,汉字转拼音,中文数字互转的功能,非常不错。值得推荐

解决方案三:使用hutool中的dfa

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.1</version>
</dependency>
public static void main(String[] args) {
    WordTree tree = new WordTree();
    tree.addWord("彩票");
    tree.addWord("发票");

     Filter<Character> charFilter = StopChar::isNotStopChar;
    tree.setCharFilter(charFilter);

    //正文
    String text = "我有一颗大土豆,刚出锅的彩.票发票";

    System.out.println(tree.isMatch(text));
    List<String> matchAll = tree.matchAll(text, -1, false, false);

    System.out.println(matchAll);
}

这里只是给个🌰,具体可以看hutool官方文档https://www.hutool.cn/docs/#/dfa/%E6%A6%82%E8%BF%B0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值