import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/**
* User: eternity
* Date: 2014/8/11
* Time: 16:17
* User:zxt 2019/7/22 15:00 up 修复拦截大小写Bug
* 敏感词检测类
* 敏感词检测初始化规则:
* 将敏感词从词库载入,按照2字、3字、4字、5字等字数各生成一个敏感词哈希表。
* 在将这些哈希表组成一个数组banWordsList,数组下标表示该敏感词表字数
* banWordsList[2] = {某马:true,屏蔽:true,啦啦:true};
* banWordsList[3] = {某个马:true,三个字:true,啦啦啦:true,小广告:true};
* banWordsList[4] = {某个坏银:true,四个字符:true,哈哈哈哈:true,就爱凤姐:true};
* banWordsList[5] = {某个大法好:true,五个敏感字:true};
* 根据上面几组组敏感词,自动生成以下索引
* 生成规则为,索引名是敏感词第一个字,值是一个int
* 该int的规则为,该int转换成二进制时,第i位为1表示上面4表存在长度为i的敏感词,否则不存在长度为i的敏感词(10000)
* wordIndex = {二:0x04,三:0x08,四:0x10,五:0x20,某:0x3c,啦:0x0c,哈:0x10,小:0x08,就:0x10};
*
* 检查规则如下:
* 1,逐字检验,是否该字在wordIndex索引表中。
* 2,如果不在表中,继续检验
* 3,如果在表中,根据索引表该键的值,取此字以及此字后的若干字检验详细表banWordsList[索引词长]。
*
* 检验例子
* 有一段如下文字,检验其是否包含敏感词:
* “我就打小广告,气死版主”
*  ——检测“我”
* |-不在索引表
* ——检测“就”
* |-在索引表
* |-“就”的索引值是0x10,表示有4字以“就”开头的敏感词
* |-取“就”和后面的字共4个,组成“就打小广”
* |-查4字敏感词表,没有这项,继续
* ——检测“打”
* |-不在索引表
* ——检测“小”
* |-在索引表
* |-索引值是0x08,表示有3字长度的敏感词
* |-取“小”和“小”后面的字,共3个字组成一个词“小广告”
* |-“小广告”在3字敏感词中,此帖包含敏感词,禁止发布
*/
public class NickWordsUtil {// public Logger logger = Logger.getLogger(this.getClass());public static final int WORDS_MAX_LENGTH = 30;//敏感词列表@SuppressWarnings("rawtypes")public static Map[] banWordsList = null;//敏感词索引public static Map<String, Integer> wordIndex = new HashMap<String, Integer>();/** 初始化敏感词库*/@SuppressWarnings("unchecked")public static void initBanWordsList(List<String> words) {if (banWordsList == null) {banWordsList = new Map[WORDS_MAX_LENGTH];for (int i = 0; i < banWordsList.length; i++) {banWordsList[i] = new HashMap<String, String>();}}for (String w : words) {if (StringUtils.isNotBlank(w)) {//将敏感词按长度存入mapbanWordsList[w.length()].put(w.toLowerCase(), "");Integer index = wordIndex.get(w.substring(0, 1));//生成敏感词索引,存入mapif (index == null) {index = 0;}int x = (int) Math.pow(2, w.length());index = (index | x);wordIndex.put(w.substring(0, 1).toLowerCase(), index);}}}/*** 检索敏感词* @param content* @return*/public static List<String> searchBanWords(List<String> words,String content) {if (banWordsList == null) {initBanWordsList(words);}List<String> result = new ArrayList<String>();for (int i = 0; i < content.length(); i++) {Integer index = wordIndex.get(content.substring(i, i + 1));int p = 0;while ((index != null) && (index > 0)) {p++;index = index >> 1;String sub = "";if ((i + p) < (content.length())) {sub = content.substring(i, i + p);} else {sub = content.substring(i);}if (((index % 2) == 1) && banWordsList[p].containsKey(sub)) {result.add(content.substring(i, i + p));}}}return result;}/*** 检索敏感词* @param content* @return*/public static boolean isBanWords(List<String> words,String content) {boolean b = false;if (banWordsList == null) {initBanWordsList(words);}OUT:for (int i = 0; i < content.length(); i++) {Integer index = wordIndex.get(content.substring(i, i + 1));int p = 0;while ((index != null) && (index > 0)) {p++;index = index >> 1;String sub = "";if ((i + p) < (content.length())) {sub = content.substring(i, i + p);} else {sub = content.substring(i);}if (((index % 2) == 1) && banWordsList[p].containsKey(sub)) {b = true;break OUT;}}}return b;}/*** @function 检索敏感词并返回所有违规的敏感词汇* @author zhaoxutao* @param content(自动转化为小写,请勿重复操作)* @since @param : content 将自动转化为小写,请勿重复操作;* @return List<String> :违规词组 * */public static List<String> isBanWordsList(List<String> words,String content) {if (banWordsList == null) {initBanWordsList(words);}List<String> list = new ArrayList<>();//转小写校对String lowerCaseContent = content.toLowerCase();for (int i = 0; i < lowerCaseContent.length(); i++) {//词汇长度索引获取Integer index = wordIndex.get(lowerCaseContent.substring(i, i + 1));int p = 0;while ((index != null) && (index > 0)) {p++;index = index >> 1;String sub = "";//记录当前词汇在源词汇中的索引地址int stringIndex = 0;if ((i + p) < (lowerCaseContent.length())) {sub = lowerCaseContent.substring(i, i + p);stringIndex = i + p;} else {sub = lowerCaseContent.substring(i);stringIndex = lowerCaseContent.length() - 1;}if (((index % 2) == 1) && banWordsList[p].containsKey(sub)) {//根据词汇索引在源词汇中提取源词汇list.add(content.substring(i, stringIndex));break ;}}}return list;}/*** @function 重置内存* @author zhaoxutao* @date 2019-8-10 10:03* @param content* @return*/public static void recover() {if (banWordsList != null) {banWordsList = null;wordIndex = new HashMap<String, Integer>();}}

敏感词汇检测及返回敏感源词汇相关推荐

  1. php 敏感关键词检测,字符串 - PHP 敏感词违法关键字检测 算法方案

    已有6000条关键字,分3批次. 一批为替换 replace,一批为遇到需要审核 censor,最后一批为遇到就禁止发布banned. 设计数据表如下: mysql> desc tbl_cens ...

  2. 小程序中关于敏感词汇检测

    小程序审核增加敏感词汇校验,避免违法违规而被停用服务或者投诉. 本文例子引用的百度AI开发者提供的API: 链接位置:https://console.bce.baidu.com/ai/#/ai/ocr ...

  3. 【敏感词检测】用DFA构建字典树完成敏感词检测任务

    任务概述 敏感词检测是各类平台对用户发布内容(UGC)进行审核的必做任务. 对于文本内容做敏感词检测,最简单直接的方法就是规则匹配.构建一个敏感词词表,然后与文本内容进行匹配,如发现有敏感词,则提交报 ...

  4. 敏感词检测:整合阿里云与腾讯云相关API

    前言 项目地址:Text-Sensitivity 笔者在开发小程序时,由于需要对用户输入内容进行敏感词检查,故需要使用现有服务商的相关API(自行开发NLP产品,难度大). 我们技术团队初步使用的是腾 ...

  5. 敏感字检测or替换,并可以限定字符串长度

    大概测试了一下,效率还算可以的,. 用到了log4net这个包做debug,不用的删掉就行. using log4net; using System; using System.Collections ...

  6. 写一个高性能的敏感词检测组件

    最近写了一个高性能的敏感词检测组件[ToolGood.Words]. 一.高性能,它的效率到底有多快? 如果将正则表达式的算法效率设为1,高性能可达到正则表达式的1.5万倍. 二.选一个巧妙的算法: ...

  7. Go+PHP实现敏感词检测

    概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的.今天封禁了这个词,明天又会有新的违禁词冒出来,比起愚公无穷尽的子孙更甚. 敏感词匹配这种治标不治本的方法,在一 ...

  8. php访问小程序内容检测接口,关于小程序接入敏感词检测接口的坑

    接入 msgSecCheck 接口47001 错误码踩坑! 这是官方文档要求,写的有些笼统,根据开发者社区提供需要进行编码后在传参,以下为 php 代码示例/** * 敏感词检测 * @param $ ...

  9. 敏感号码检测 API数据接口

    敏感号码检测 计费模式 免费额度 点数单价 每日限制 会员免费 100次 免费 1000次 更新时间:2022-07-12 19:10:28接口状态:正常 检测要发送的手机号,是否敏感异常. 请求地址 ...

最新文章

  1. Linux中crontab无法执行java程序的问题
  2. 递归函数(九):最小不动点定理
  3. [Swift通天遁地]一、超级工具-(13)使用PKHUD制作各种动态提示窗口
  4. 周末巨献:100+诡异的数据集,20万Eclipse Bug、死囚遗言
  5. 【系统分析师之路】2019年上系统分析师综合知识真题
  6. telnet指令输入账户密码后出现“句柄无效”无法连接的问题
  7. python处理复杂excel_python高手之路python处理excel文件(方法汇总)
  8. Python绘制节点是饼状图的社交网络图(Plot network with pie chart)
  9. 关于电视剧《狂飙》的一点感悟--贵人相助的重要性
  10. 飞腾PHYTIUM FT-1500a性能测试-内存-PCIe
  11. 接口监控,系统监控,服务保证
  12. JSP设置Excel表格换行_Excel表格技巧—如何调整工作表打印页面设置
  13. via导出书签html,书签助手,迈出换用 Via 浏览器的第一步 | App+1
  14. 虚拟机VMware使用U盘装系统
  15. 真实案例解析OO理论与实践
  16. spring组合注解
  17. C#之泛型实例化对象的理解
  18. mysql查询未讲课教师_MySQL基础(查) - osc_hghvwmhn的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. java用模板生成word(docx)文档(含动态表格)
  20. MySQL用年、月、日、季度、周分别统计数据

热门文章

  1. 职场28岁现象:最好的关于职业规划的文章
  2. 一文看懂!百度对话系统PLATO家族
  3. Windows Server 2022 超融合部署
  4. 关于统计学中P值的理解
  5. 计算机考研838难吗,838初试经验教训分享
  6. r计算百分位数_R中产生的分位数和百分位数之间的差异
  7. 大天使之剑服务器维修公告,大天使之剑————【维护】6月12日更新维护公告...
  8. jmonkeyEngineSDK安装部署及IDEA集成JME3开发
  9. mysql注入单引号和双引号的区别_mysql单引号和双引号的用法
  10. 关于银河麒麟系统配置本地yum源配置流程说明