精工品质算不算卓越品质 广告词法或者敏感词呀

1419人阅读
JavaEE开发(54)
开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图。完成了对敏感词、广告词的过滤,而且效率较好,所以分享一下。
具体实现:
&1、匹配大小写过滤
&2、匹配全角半角过滤
&3、匹配过滤停顿词过滤。
&4、敏感词重复词过滤。
支持如下类型类型过滤检测:
fuck 全小写
FuCk 大小写
fuck全角半角
f!!!u&c ###k 停顿词
fffuuuucccckkk 重复词
二、代码实现
& & 其目录结构如下:
& &其中resources资源目录中:
stopwd.txt :停顿词,匹配时间直接过滤。
wd.txt:敏感词库。
& &1、WordFilter敏感词过滤类
package org.andy.
import java.io.BufferedR
import java.io.IOE
import java.io.InputStreamR
import java.util.ArrayL
import java.util.HashM
import java.util.HashS
import java.util.L
import java.util.M
import java.util.S
import org.andy.sensitivewdfilter.util.BCC
* 创建时间:日 下午3:01:12
* 思路: 创建一个FilterSet,枚举了0~65535的所有char是否是某个敏感词开头的状态
* 判断是否是 敏感词开头 | | 是 不是 获取头节点 OK--下一个字 然后逐级遍历,DFA算法
* @author andy
* @version 2.2
public class WordFilter {
private static final FilterSet set = new FilterSet(); // 存储首字
private static final Map&Integer, WordNode& nodes = new HashMap&Integer, WordNode&(1024, 1); // 存储节点
private static final Set&Integer& stopwdSet = new HashSet&&(); // 停顿词
private static final char SIGN = '*'; // 敏感词过滤替换
long a = System.nanoTime();
a = System.nanoTime() -
System.out.println(&加载时间 : & + a + &ns&);
System.out.println(&加载时间 : & + a / 1000000 + &ms&);
} catch (Exception e) {
throw new RuntimeException(&初始化过滤器失败&);
private static void init() {
// 获取敏感词
addSensitiveWord(readWordFromFile(&wd.txt&));
addStopWord(readWordFromFile(&stopwd.txt&));
* 增加敏感词
* @param path
private static List&String& readWordFromFile(String path) {
List&String&
BufferedReader br =
br = new BufferedReader(new InputStreamReader(WordFilter.class.getClassLoader().getResourceAsStream(path)));
words = new ArrayList&String&(1200);
for (String buf = &&; (buf = br.readLine()) !=) {
if (buf == null || buf.trim().equals(&&))
words.add(buf);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (br != null)
br.close();
} catch (IOException e) {
* 增加停顿词
* @param words
private static void addStopWord(final List&String& words) {
if (words != null && words.size() & 0) {
for (String curr : words) {
chs = curr.toCharArray();
for (char c : chs) {
stopwdSet.add(charConvert(c));
* 添加DFA节点
* @param words
private static void addSensitiveWord(final List&String& words) {
if (words != null && words.size() & 0) {
WordN // 首字母节点
for (String curr : words) {
chs = curr.toCharArray();
fchar = charConvert(chs[0]);
if (!set.contains(fchar)) {// 没有首字定义
set.add(fchar);// 首字标志位 可重复add,反正判断了,不重复了
fnode = new WordNode(fchar, chs.length == 1);
nodes.put(fchar, fnode);
fnode = nodes.get(fchar);
if (!fnode.isLast() && chs.length == 1)
fnode.setLast(true);
lastIndex = chs.length - 1;
for (int i = 1; i & chs. i++) {
fnode = fnode.addIfNoExist(charConvert(chs[i]), i == lastIndex);
* 过滤判断 将敏感词转化为成屏蔽词
* @param src
public static final String doFilter(final String src) {
char[] chs = src.toCharArray();
int length = chs.
for (int i = 0; i & i++) {
currc = charConvert(chs[i]);
if (!set.contains(currc)) {
node = nodes.get(currc);// 日 2
if (node == null)// 其实不会发生,习惯性写上了
boolean couldMark =
int markNum = -1;
if (node.isLast()) {// 单字匹配(日)
couldMark =
markNum = 0;
// 继续匹配(日你/日你妹),以长的优先
// 你-3 妹-4 夫-5
for (; ++k &) {
int temp = charConvert(chs[k]);
if (stopwdSet.contains(temp))
node = node.querySub(temp);
if (node == null)// 没有了
if (node.isLast()) {
couldMark =
markNum = k -// 3-2
if (couldMark) {
for (k = 0; k &= markN k++) {
chs[k + i] = SIGN;
i = i + markN
return new String(chs);
* 是否包含敏感词
* @param src
public static final boolean isContains(final String src) {
char[] chs = src.toCharArray();
int length = chs.
for (int i = 0; i & i++) {
currc = charConvert(chs[i]);
if (!set.contains(currc)) {
node = nodes.get(currc);// 日 2
if (node == null)// 其实不会发生,习惯性写上了
boolean couldMark =
if (node.isLast()) {// 单字匹配(日)
couldMark =
// 继续匹配(日你/日你妹),以长的优先
// 你-3 妹-4 夫-5
for (; ++k &) {
int temp = charConvert(chs[k]);
if (stopwdSet.contains(temp))
node = node.querySub(temp);
if (node == null)// 没有了
if (node.isLast()) {
couldMark =
if (couldMark) {
* 大写转化为小写 全角转化为半角
* @param src
private static int charConvert(char src) {
int r = BCConvert.qj2bj(src);
return (r &= 'A' && r &= 'Z') ? r + 32 :
& &&&&isContains&:是否包含敏感词
& & &doFilter:过滤敏感词
& &2、WordNode敏感词节点
package org.andy.
import java.util.LinkedL
import java.util.L
* 创建时间:日 下午3:07:45
* @author andy
* @version 2.2
public class WordNode {
// 节点名称
private List&WordNode& subN // 子节点
private boolean isL// 默认false
public WordNode(int value) {
this.value =
public WordNode(int value, boolean isLast) {
this.value =
this.isLast = isL
* @param subNode
* @return 就是传入的subNode
private WordNode addSubNode(final WordNode subNode) {
if (subNodes == null)
subNodes = new LinkedList&WordNode&();
subNodes.add(subNode);
return subN
* 有就直接返回该子节点, 没有就创建添加并返回该子节点
* @param value
public WordNode addIfNoExist(final int value, final boolean isLast) {
if (subNodes == null) {
return addSubNode(new WordNode(value, isLast));
for (WordNode subNode : subNodes) {
if (subNode.value == value) {
if (!subNode.isLast && isLast)
subNode.isLast =
return subN
return addSubNode(new WordNode(value, isLast));
public WordNode querySub(final int value) {
if (subNodes == null) {
for (WordNode subNode : subNodes) {
if (subNode.value == value)
return subN
public boolean isLast() {
return isL
public void setLast(boolean isLast) {
this.isLast = isL
public int hashCode() {
三、测试结果
项目包含敏感词库,源码,停顿词库等,只需运行maven打jar包直接可运行。
博客来源:
项目源码:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:251093次
积分:3632
积分:3632
排名:第7559名
原创:118篇
评论:262条
阅读:52767
阅读:15514
阅读:30298
文章:104篇
阅读:156333支持HTML转义字符吗?(转义符,突破广告词、敏感词、违规词)
查看: 739|
摘要: 转义字符,所有版本都是支持的。
转义字符可以实现网站对发送内容的屏蔽,比如屏蔽了“发票”二字,那么我们转义后,依旧可以发布这个文本。(当然,空格、特殊字符等在部分网站里面也有效,相信大家经验比我多。)如“发票”,转义字符为: 发票那么,我们在 标题 或 内容里面,放入“发票”然后发布后的标题和内容,就能出现 发票 这两个字了。注意1:utf8编码的网站,才能用转义符。注意2:文章 - 高级设置 - &自动转码不能勾选其他一些特殊网站,可能屏蔽了部分代码,大家需要自己抓包分析。Q:我已经准备好了很多文档,如何批量替换?答:只需要开启 文章 - 替换 功能,输入相应的字符替换文本即可,如图:&→&*l*t; &(去掉星号)&→&*g*t;&&(去掉星号)%2B→+发票→&*#*21457;&*#*31080;&&&(去掉星号)Q、有转换工具吗?答:辅助菜单 - 编码工具 (如下图)HTML 转义字符详解:[更新][更新]
刚表态过的朋友 ()
上一篇:下一篇:
相关帮助:
免责申明:本站开发的营销神器,只为提高用户工作效率。所有规则仅供学习参考,禁止使用本工具发布低俗、违规、违法内容!欢迎举报!
Powered by
Discuz!X3.2&>&&>&&>&&>&Java DFA算法实现敏感词、广告词过滤
Java DFA算法实现敏感词、广告词过滤
上传大小:14KB
1、匹配大小写过滤
2、匹配全角半角过滤
3、匹配过滤停顿词过滤。
解析问题: 你是逗比吗?fuck!fUcK,你竟然用法轮功,法@!轮!%%%功
解析字数 : 33
加载时间 : ns
加载时间 : 325ms
解析时间 : ns
解析时间 : 330ms
你是逗比吗?****!****,你竟然用***,*********
是否包含敏感词: true
解析时间 : 149028ns
解析时间 : 0ms...展开收缩
综合评分:4.5(6位用户评分)
所需积分:1
下载次数:72
审核通过送C币
创建者:exileme
创建者:jerryshen
创建者:andy8921
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
Java DFA算法实现敏感词、广告词过滤
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
fengshizty
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:

我要回帖

更多关于 品质算不算极限词 的文章

 

随机推荐