一、利用正则表达式

关键正则表达式

.*(关键词1|关键词2|关键词3).*

模拟业务代码

@WebServlet(name = "PatternControl", urlPatterns = {"/p"})

public class PatternControl extends HttpServlet {

private static final Pattern pattern = initPattern();

private static Pattern initPattern() {

List stringList = null;

try {

stringList = Files.readAllLines(Paths.get("/Users/hans/Documents/word.txt"));

} catch (IOException e) {

e.printStackTrace();

}

StringBuilder stringBuilder = new StringBuilder(".*(");

stringBuilder.append(stringList.get(0));

for (int i = 1; i < stringList.size(); i++) {

stringBuilder.append("|" + stringList.get(i));

}

stringBuilder.append(").*");

Pattern pattern = Pattern.compile(stringBuilder.toString());

return pattern;

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

if (pattern == null) {

response.sendError(500, "pattern is null");

return;

}

if (request.getParameter("word") == null) {

response.sendError(500, "word is null");

return;

}

boolean isMatcher = pattern.matcher(request.getParameter("word")).matches();

if (isMatcher) {

response.sendError(209);

} else {

response.sendError(409);

}

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response);

}

}

时间空间占用情况

前提

关键词共有28448个,将其编译成上述的正则表达式

CPU2.2GHz Intel i7四核

内存

16GB 1600 MHz DDR3

时间情况(多次实验平均结果)

阶段耗时(ms)

初始化

读取敏感词:38

编译正则表达式:41

每次匹配

47

空间情况(多次实验平均结果)

阶段消耗内存(MB)

初始化 编译正则表达式

11

每次匹配

极小

cpu和堆运行时情况图

结论

利用正则表达式过滤敏感词效果较好

二、利用字符串暴力匹配

核心思路

循环总共关键词个数次,判断时候在待匹配字符串中 是否包含 本次循环的关键词

模拟业务代码

@WebServlet(name = "PatternControl", urlPatterns = {"/p"})

public class PatternControl extends HttpServlet {

private static final List stringList = initStringList();

private static List initStringList() {

List stringList = null;

try {

stringList = Files.readAllLines(Paths.get("/Users/hans/Documents/word.txt"));

} catch (IOException e) {

e.printStackTrace();

}

return stringList;

}

private boolean matchKeyWord(String text) {

for (String markWord : stringList) {

if (text.contains(markWord)) {

return true;

}

}

return false;

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

if (request.getParameter("word") == null) {

response.sendError(500, "word is null");

return;

}

boolean isMatcher = matchKeyWord(request.getParameter("word"));

if (isMatcher) {

response.sendError(209);

} else {

response.sendError(409);

}

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response);

}

}

时间空间占用情况

时间情况(多次实验平均结果)

阶段耗时(ms)

初始化

读取敏感词:38

每次匹配

10

空间情况(多次实验平均结果)

阶段消耗内存(MB)

初始化

3

每次匹配

极小

结论

利用暴力匹配的效果更好

三、利用Tire树匹配

核心思路

将所有的敏感词构成一棵路径树,每个节点只有一个字符

模拟业务代码

public class TestAcWithoutFail {

public void insert(String str, Node root) {

Node p = root;

for (char c : str.toCharArray()) {

if (p.childrenNodes.get(c) == null) {

p.childrenNodes.put(c, new Node());

}

p = p.childrenNodes.get(c);

}

p.isEnd = true;

}

public boolean isContainSensitiveWord(String text, Node root) {

for (int i = 0; i < text.length(); i++) {

Node nowNode = root;

for (int j = i; j < text.length(); j++) {

char word = text.charAt(j);

nowNode = nowNode.childrenNodes.get(word);

if (nowNode != null) {

if (nowNode.isEnd) {

return true;

}

} else {

break;

}

}

}

return false;

}

public String containSensitiveWord(String text, Node root) {

for (int i = 0; i < text.length(); i++) {

Node nowNode = root;

for (int j = i; j < text.length(); j++) {

char word = text.charAt(j);

nowNode = nowNode.childrenNodes.get(word);

if (nowNode != null) {

if (nowNode.isEnd) {

return text.substring(i, j + 1);

}

} else {

break;

}

}

}

return "";

}

public static void main(String[] args) throws IOException, InterruptedException {

List stringList = Files.readAllLines(Paths.get("/Users/hans/Documents/word.txt"));

TestAcWithoutFail acNoFail = new TestAcWithoutFail();

Node root = new Node();

for (String text : stringList) {

acNoFail.insert(text, root);

}

String string = "tiresdfsdffffffffffaaaaaaaaaa";

Thread.sleep(10 * 1000);

for (int i = 0; i < 1; i++) {

System.out.println(acNoFail.isContainSensitiveWord(string, root));

}

}

}

class Node {

Map childrenNodes = new HashMap<>();

boolean isEnd;

}

时间空间占用情况

时间情况(多次实验平均结果)

阶段耗时(ms)

初始化

读取敏感词:38

构建比较树:36

每次匹配

0.01量级(执行1000遍34ms、执行10000遍130ms)

空间情况(多次实验平均结果)

阶段消耗内存(MB)

初始化

读取字符串:3

构建比较树:24

每次匹配

极小

结论

在该业务中和暴力匹配效果哪个好值得商榷

四、服务部署方式

主站的做法(刘乐那边的做法一样)

单独部署一台服务器

将关键词放到一张表中

设置定时任务每天初始化一次

我的方案

将关键词放到一张表中

设置定时任务每天初始化一次(其实感觉每天更新都挺浪费的,写个接口,表中数据改了之后,调用一下就可以)

多台机器上每个机器都每天读取一次数据库,解决同步的问题(或者用Tair缓存这些数据,但我感觉是不是弄麻烦了)

mysql 敏感词_过滤敏感词方式相关推荐

  1. python去除中文停用词_删除停止词Python

    你不需要在用户定义的函数中构造所有的代码,我不确定这背后是否有原因,但问题非常简单,在阅读完你的datafrme之后,可以用实际上2行代码简洁地解决.在import pandas as pd from ...

  2. python判断是否为变位词_[python]变位词的判别与分类

    最近老师留了个作业,是对近12万的单词进行变位词的判断与分类,最开始博主按着非常普通的想法,先写了个函数来判断两个单词是不是变位词,然后再对所有单词遍历判别.因为单词数量实在是多,所以运行时间很长.所 ...

  3. mysql 从库_通过两种方式增加从库——不停止mysql服务

    一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库 ...

  4. mysql安装文件格式_一、安装方式       MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的。下面来看看这两种方式:       MSI格式的可以直接点击安...

    一.安装方式 MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的.下面来看看这两种方式: MSI格式的可以直接点击安装,按照它给出的安装提示进行安装,Windows操作系统下一般MyS ...

  5. java 热词_一个热词推荐的简单实现

    为什么想做这个东西 一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章:Redis 与搜索热词推荐,然而只写了思路.所以,就是想自己实现一个. 先上个效果图,再聊: P.S. 按四年 ...

  6. SpringBoot使用前缀树实现敏感词的过滤

    记录一下使用SpringBoot中使用前缀树对敏感词的一个过滤. 首先呢在resources目录下建立一个文件用来装敏感词例如我在resources/sensitive-words.txt如下: 敏感 ...

  7. python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法

    利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...

  8. python中哪些词是敏感字词_python实现敏感词过滤的几种方法

    1.replace过滤 最简单也是最直接的就是直接循环敏感词,然后使用replace过滤关键词,文章和敏感词少的时候还可以,多的时候效率就真的很一般了. 2.使用正则过滤 有两个技术要点, 1.使用P ...

  9. java敏感词屏蔽器,“敏感词过滤”功能设置

    "敏感词过滤"功能设置 "敏感词过滤"是指对互联网发布的言论和文章中含有的敏感词进行过滤.敏感词经过在互联网的传播和扩散会影响社会的稳定和用户的使用.云锁的&q ...

  10. 汉字转拼音 敏感词过滤 禁用词查找 提高程序效率另外一种思路:反向思维

    汉字转拼音 敏感词过滤 禁用词查找 这些很常用的互联网需求 大家出道时是怎么做的? 大家偷懒时是怎么做的? 常规算法 - 从数据库到用户提交内容去匹配: 把数据库中所有数据压到大数组中(这时数据越多, ...

最新文章

  1. 安装gym库_强化学习Gym库学习实践(一)
  2. html标签一对一绑定的组件,一种原生组件替换HTML标签的轻量级方法尝试
  3. 面试 -- Java基础(一)
  4. php中的类 对象的方法的区别,php中类和对象的区别是什么
  5. 由VMWorld2010想到的Social Media宣传
  6. iOS ReactiveCocoa 最全常用API整理(可做为手册查询)
  7. ubuntu16.04 升级内核
  8. C++中STL-全排列
  9. Listener 快速开始
  10. react router 4
  11. 【阙值分割】基于matlab粒子群算法自适应多阈值图像分割【含Matlab源码 1459期】
  12. 一文读懂机器学习(转)
  13. [JAVA毕业设计]大数据在线考试系统在线阅卷系统及大数据统计分析源码获取和系统演示
  14. java sqlite sqlite_busy_sqlite3出现SQLITE_BUSY错误码的原因以及解决方法
  15. JDK1.8新特性(八):还在重复写空指针检查代码?赶紧使用Optional吧!
  16. firefox 护眼
  17. 手绘图解:从零维到十维空间
  18. 孙陶然:有能力的第二个标准是业绩好
  19. Arduino uno 驱动安装问题解决(win10)
  20. vb通过网址下载pdf

热门文章

  1. java实现socket网络编程
  2. 笔记本linux电脑系统下载软件,戴尔笔记本 linux 系统下载软件
  3. windows 下安装redis
  4. 动软代码生成器使用心得
  5. win8计算机无法安装打印机驱动程序,win8.1安装打印机驱动的方法 惠普打印机驱动程序安装教程...
  6. VirtualBox装VBoxGuestAdditions增强工具失败
  7. 2022-10-10 Android 在其他应用上的悬浮窗View
  8. 电脑黑屏但光标、杀毒软件加速球可见
  9. 13个大数据应用案例,告诉你最真实的大数据故事
  10. ajaxSubmit异步提交