DFA算法简单理解实现
背景:因为最近项目要使用到敏感词过滤服务,在网上了解到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. 引言 模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来 在一个大的搜寻空间内找寻命题的最优解 .模拟退火是由S.Kirkpatrick, ...
- Blossom算法,开花算法简单理解
有条件的建议去油管上看,讲的很清楚https://www.youtube.com/watch?v=3roPs1Bvg1Q 引例:如果你是夏令营负责人,你的任务是将一群人分为两组.为了公平起见,每个人在 ...
- 蒙特卡洛算法简单理解与demo
所谓蒙特卡洛算法,实际上就是用频率估计概率. 首先我们知道一个边长为2的正方形面积是2*2=4,他的内接圆的面积是π*1,那么我们在这样一个正方形内随机生成10000个点,落在圆里的点的个数/1000 ...
- crc32算法简单理解
最近用到CRC校验算法,就找了些资料,学习了一下,网上关于CRC32的资料也多,但感觉不是很完整,或者太高深. CRC算法查表法很常见,但表是怎么来的,有些资料说得不很清楚. 我来说一下我的看法: 1 ...
- 基于错误扩散的Floyd-Steinbery抖动算法简单理解
1. 图像处理中的dithering技术 它是一种欺骗你眼睛,使用有限的色彩让你看到比实际图象更多色彩的显示方式.通过在相邻像素间随机的加入不同的颜色来修饰图象,通常这种方式被用于颜色较少的情 ...
- python实现dfa过滤算法_Python实现DFA算法,完成实体词匹配和敏感词过滤等功能
一.什么是DFA算法 DFA 全称为:Deterministic Finite Automaton,即确定有穷自动机.其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个 ...
- DFA算法的简单说明与案例实现以及优化思路
1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直接将敏感词组织成String后,利用indexOf方法来查询. b.传统的敏感词入库后SQL查询. c.利用Lucene建立分词 ...
- 对敏感词过滤(DFA算法)的思考与理解
对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...
- CPD配准算法及代码的简单理解(Coherent Point Drift)
我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...
最新文章
- CentOS7 service network start命令启动时报错解决方法
- 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译
- 深度学习浪潮下的自然语言处理,百度NeurIPS 2019展现领域新突破
- 理性解读中国科技实力:不震惊式吹捧,也不全盘抹杀
- linspace--创建线性等分向量
- KVM虚拟机的优化历程---按需优化
- 遍历Map要选择好的遍历方式(洛谷P1097题题解,Java语言描述)
- WordPressmodown收费模板
- Spring学习总结(12)——Druid连接池及监控在spring配置
- ThinkPHP 多语言的实现
- Facebook宣布进一步推广Live Video功能
- malloc(): corrupted top size
- 在html页面中加入矢量图,在html中引用矢量图
- centos异常断电重启后,无法进入系统
- Vue-组件自定义事件
- 正则表达式/\$\{id\}/gi详解
- handler机制--handler概览
- VSCode远程开发 Resolver error: Error: Failed to install the VS Code Server
- C++:标准错误流Cerr
- CentOS7 从零安装NVIDA、CUDA、cuDNN