敏感词

编程珠玑

倾然丶 夕夏残阳落幕 提交于 2019-12-10 06:22:23
如果发布内容不存在敏感词第一个字集合情况下,test2做出了很大优化,循环次数为发布内容个数。 但是如果发布内容村子敏感词,还是使用了test1方法,问题还存在。 怎样脱离test1方法?我们可以考虑把敏感词进一步分析,第二个字集合也进行规整、第三个字集合、第四个...。 这个让我想到了树形结构: 办 气 裸 土 证 枪 聊 表 枪 出 演 卖 售 每一层进行规整,但是不同的层可能出现相同的字,怎么区分他们? 我们进行从根到层的一个map拓展,这样可以区分不同的分支。 简单说,就是第二层有两个“枪”,但是第一个属于“气”父亲,第二个属于“土”父亲,我们根据“气枪”找到它下面的集合“出”,根据“土枪”找到集合“卖”。 package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.HashMap; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static HashMap

编程珠玑

六月ゝ 毕业季﹏ 提交于 2019-12-10 06:17:27
在第四步中,我们看到,使用排序好的String[] 要比 ArrayList<String> 查找时候快速的多,因为ArrayList<String>的查找复杂度O(n),而排序好的String[]查找复杂度O(1)。 但是我们还是过量依赖String,这个对象本身效率就不高,于是我们需要换成更底层的原始类型进行优化: package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst; static

编程珠玑

て烟熏妆下的殇ゞ 提交于 2019-12-10 06:01:27
就像上一步说的那样, 当敏感词超过了一定量时候,效率将会急剧下降 。 假设发布内容“再顶”,敏感词达到了1000个,按照快速实现的方法,循环1000次,显然不是最优方法。 因为“再”,“顶”并没有出现在 "办证、 气枪、 裸聊" 的第一个字集合"办、气、裸"中,所以我们可以考虑当搜集所有敏感词第一个字集合来快速判断发布内容是否含有敏感词。 package test; import static util.PrintUtil.print; import java.util.ArrayList; public class Test { static String[] keys = {"办证", "气枪", "裸聊"}; static String tContent = "再顶"; static ArrayList<String> list = new ArrayList<String>(); static { for (String k : keys) { if (!list.contains(k.substring(0, 1))) { list.add(k.substring(0, 1)); } } } /** * 快速实现的方法 */ public final static String test1(String content) { for (String k : keys) {

编程珠玑

好久不见. 提交于 2019-12-07 15:32:29
第五步已经完成了所有工作,但是新的需求来了,就是发布广告的人有一些特殊字符来绕过敏感词判断,我们需要把特殊字符过滤掉,那么正常想法就是使用正则表达式来过滤,但是我们实现的这个算法中,可以把特殊字符判断消化在其中: package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static int key_max = 0; // 敏感词最大长度 static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst; static HashMap<String,

编程珠玑

…衆ロ難τιáo~ 提交于 2019-12-07 15:32:16
到第三步,已经把算法优化的精髓掌握了,用树形结构来承载。 但是有些细节不容忽视,我们大量使用了ArrayList.contains,效率非常不高。 这里进行进一步优化,就是“疯狂的排序、疯狂的二分查找”。 package test; import static util.PrintUtil.print; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

编程珠玑

萝らか妹 提交于 2019-12-07 15:32:01
厚着脸皮,使用“编程珠玑”。 需求: 判断出发布内容是否含有敏感词。 敏感词:办证、气枪、裸聊 发布内容:***************** 第一步:快速实现 实现主要功能,没有什么特别地方。但是有个很重要问题, 当敏感词超过了一定量时候,效率将会急剧下降 。 因为不管发布内容多少,每次需要循环敏感词个数,假设发布内容“顶”,敏感词达到了1000个,循环1000次,将明显消耗性能。 package test; import static util.PrintUtil.*; public class Test { static String[] keys = {"办证", "气枪", "裸聊"}; static String tContent = "测试内办证容"; /** * 快速实现的方法 */ public final static String test1(String content) { for (String k : keys) { if (content.indexOf(k) > -1) return k; } return null; } public static void main(String[] args) { long time1 = System.currentTimeMillis(); print(test1(tContent)); print(

正则表达式-字符串-敏感词

只谈情不闲聊 提交于 2019-12-07 12:33:03
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>正则表达式-敏感词过滤</title> </head> <body> <script type="text/javascript"> var str='中国军队和阿扁一起办证'; var pattern=/国军|阿扁|办证/g; //$0表示0个分组的内容 console.log(str.replace(pattern,function($0){ var result=''; for(var i=0;i<$0.length;i++){ result+='*'; } return result; })); </script> </body> </html> 来源: CSDN 作者: weixin_40533188 链接: https://blog.csdn.net/weixin_40533188/article/details/99327120

编程珠玑

独自空忆成欢 提交于 2019-12-07 01:41:01
到了第六步,我们只是理论上探讨优化的步骤,最后,我们进行集体测试,使用敏感词越多,效果越明显: package test; import static util.PrintUtil.print; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { static int key_max = 0; // 敏感词最大长度 static String[] keys = {"办证", "气枪出售", "裸聊", "裸表演", "土枪卖"}; static String tContent = "再办证顶"; static ArrayList<String> first = new ArrayList<String>(); static String[] sortFirst; static char[] charFirst;

js实现敏感词过滤算法

走远了吗. 提交于 2019-12-03 09:13:16
本文转载于: 猿2048 网站☞ https://www.mk2048.com/blog/blog.php?id=hkbk21i00j 大半个月没有更新了,因为最近有点忙(其实是懒) 最近弄了一个用户发表评论的功能,用户上传了评论,再文章下可以看到自己的评论,但作为社会主义接班人,践行社会主义核心价值观,所以给评论敏感词过滤的功能不可少,在网上找了资料,发现已经有非常成熟的解决方案。 常用的方案用这么两种 全文搜索,逐个匹配。这种听起来就不够高大上,在数据量大的情况下,会有效率问题,文末有比较 DFA算法-确定有限状态自动机 附上百科链接 确定有限状态自动机 DFA算法介绍 DFA是一种计算模型,数据源是一个有限个集合,通过当前状态和事件来确定下一个状态,即 状态+事件=下一状态,由此逐步构建一个有向图,其中的节点就是状态,所以在DFA算法中只有查找和判断,没有复杂的计算,从而提高算法效率 参考文章  Java实现敏感词过滤 实现逻辑 构造数据结构 将敏感词转换成树结构,举例敏感词有着这么几个 ['日本鬼子','日本人','日本男人'] ,那么数据结构如下(图片引用参考文章) 每个文字是一个节点,连续的节点组成一个词, 日本人 对应的就是中间的那条链,我们可以使用对象或者map来构建树,这里的栗子采用 map 构建节点,每个节点中有个状态标识,用来表示当前节点是不是最后一个