背景:因为最近项目要使用到敏感词过滤服务,在网上了解到dfa实现这个功能性能还不错,特此学习了一下

1. 什么是DFA算法

引用 简书作者:浪人与酒丶的解释
原文链接:https://www.jianshu.com/p/c67f917c9363

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。
确定:状态以及引起状态转换的事件都是可确定的,不存在“意外”。
有穷:状态以及事件的数量都是可穷举的。

2. DFA算法模型

state_event_dict = {"匹": {"配": {"算": {"法": {"is_end": True},"is_end": False},"关": {"键": {"词": {"is_end": True},"is_end": False},"is_end": False},"is_end": False},"is_end": False},"信": {"息": {"抽": {"取": {"is_end": True},"is_end": False},"is_end": False},"is_end": False}
}

3. 通过java程序加载敏感词库,构建一个DFA算法模型

private static void addSensitiveWordToHashMap(Set<String> keyWordSet) {// 初始化HashMap对象并控制容器的大小sensitiveWordMap = new HashMap(keyWordSet.size());// 敏感词String key = null;// 用来按照相应的格式保存敏感词库数据Map nowMap = null;// 用来辅助构建敏感词库Map<String, String> newWorMap = null;// 使用一个迭代器来循环敏感词集合Iterator<String> iterator = keyWordSet.iterator();while (iterator.hasNext()) {key = iterator.next();nowMap = sensitiveWordMap;for (int i = 0; i < key.length(); i++) {// 截取敏感词当中的字,在敏感词库中字为HashMap对象的Key键值char keyChar = key.charAt(i);// 判断这个字是否存在于敏感词库中Object wordMap = nowMap.get(keyChar);if (wordMap != null) {nowMap = (Map) wordMap;} else {newWorMap = new HashMap<>();newWorMap.put("isEnd", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}// 如果该字是当前敏感词的最后一个字,则标识为结尾字if (i == key.length() - 1) {nowMap.put("isEnd", "1");}}}}

至此我们的DFA算法已经实现,可继续开发我们的业务代码

DFA算法简单理解实现相关推荐

  1. 模拟退火算法简单理解

    模拟退火算法 算法流程图 1. 引言 模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来 在一个大的搜寻空间内找寻命题的最优解 .模拟退火是由S.Kirkpatrick, ...

  2. Blossom算法,开花算法简单理解

    有条件的建议去油管上看,讲的很清楚https://www.youtube.com/watch?v=3roPs1Bvg1Q 引例:如果你是夏令营负责人,你的任务是将一群人分为两组.为了公平起见,每个人在 ...

  3. 蒙特卡洛算法简单理解与demo

    所谓蒙特卡洛算法,实际上就是用频率估计概率. 首先我们知道一个边长为2的正方形面积是2*2=4,他的内接圆的面积是π*1,那么我们在这样一个正方形内随机生成10000个点,落在圆里的点的个数/1000 ...

  4. crc32算法简单理解

    最近用到CRC校验算法,就找了些资料,学习了一下,网上关于CRC32的资料也多,但感觉不是很完整,或者太高深. CRC算法查表法很常见,但表是怎么来的,有些资料说得不很清楚. 我来说一下我的看法: 1 ...

  5. 基于错误扩散的Floyd-Steinbery抖动算法简单理解

    1. 图像处理中的dithering技术     它是一种欺骗你眼睛,使用有限的色彩让你看到比实际图象更多色彩的显示方式.通过在相邻像素间随机的加入不同的颜色来修饰图象,通常这种方式被用于颜色较少的情 ...

  6. python实现dfa过滤算法_Python实现DFA算法,完成实体词匹配和敏感词过滤等功能

    一.什么是DFA算法 DFA 全称为:Deterministic Finite Automaton,即确定有穷自动机.其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个 ...

  7. DFA算法的简单说明与案例实现以及优化思路

    1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直接将敏感词组织成String后,利用indexOf方法来查询. b.传统的敏感词入库后SQL查询. c.利用Lucene建立分词 ...

  8. 对敏感词过滤(DFA算法)的思考与理解

    对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...

  9. CPD配准算法及代码的简单理解(Coherent Point Drift)

    我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...

最新文章

  1. CentOS7 service network start命令启动时报错解决方法
  2. 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译
  3. 深度学习浪潮下的自然语言处理,百度NeurIPS 2019展现领域新突破
  4. 理性解读中国科技实力:不震惊式吹捧,也不全盘抹杀
  5. linspace--创建线性等分向量
  6. KVM虚拟机的优化历程---按需优化
  7. 遍历Map要选择好的遍历方式(洛谷P1097题题解,Java语言描述)
  8. WordPressmodown收费模板
  9. Spring学习总结(12)——Druid连接池及监控在spring配置
  10. ThinkPHP 多语言的实现
  11. Facebook宣布进一步推广Live Video功能
  12. malloc(): corrupted top size
  13. 在html页面中加入矢量图,在html中引用矢量图
  14. centos异常断电重启后,无法进入系统
  15. Vue-组件自定义事件
  16. 正则表达式/\$\{id\}/gi详解
  17. handler机制--handler概览
  18. VSCode远程开发 Resolver error: Error: Failed to install the VS Code Server
  19. C++:标准错误流Cerr
  20. CentOS7 从零安装NVIDA、CUDA、cuDNN

热门文章

  1. python爬取同花顺_python 爬虫--同花顺-使用代理
  2. MAC 最小化不显示缩略图标
  3. 【人工智能】【Java 】【微信支付】【架构高性能网站】
  4. phpcms v9 模板标签技巧,模板标签常用方法
  5. Win8风格界面效果
  6. 安卓手机软件开发_无代码,手机app软件开发,让人人都是专业开发工程师
  7. vue 适配Markdown格式
  8. pipenv虚拟环境目录设置
  9. 基于opencv的车辆数量检测
  10. MySQL系统流程图怎么画_流程图怎么画,教你正确使用流程图模板