DFA算法简单理解实现

背景:因为最近项目要使用到敏感词过滤服务,在网上了解到dfa实现这个功能性能还不错,特此学习了一下1.什么是DFA算法引用简书作者:浪人与酒丶的解释原文链接:https://www.jianshu.com/p/c67f917c9363DFA全称为:DeterministicFiniteAutomaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,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算法已经实现,可继续开发我们的业务代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126635.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • fatal error解决方法_游戏fatal error

    fatal error解决方法_游戏fatal error开发环境:VisualStudio2017opencv-4.0.0-vc14_vc15首先区别几个选项:(1)***d.lib和***.lib区别:Release版本选择(通过在x64旁边的下拉栏中可以选择调试的版本)opencv_world400.libDebug版本选择opencv_world400d.lib(2)vc14和vc15区别:VC14构建需要安…

  • 普通索引与唯一索引的区别_唯一索引怎么设置

    普通索引与唯一索引的区别_唯一索引怎么设置所谓普通索引,就是在创建索引时,不附加任何限制条件(唯一、非空等限制)。该类型的索引可以创建在任何数据类型的字段上。所谓唯一索引,就是在创建索引时,限制索引的值必须是唯一的。通过该类型的索引可以更快速地查询某条记录。普通索引还是唯一索引?假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会…

  • nginx如何处理TIMEWAIT过多?

    nginx如何处理TIMEWAIT过多?在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。首先先查看tcp连接状态及数量:#netstat-n|awk‘/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}’或者#netstat-ant|awk’/^tcp/{++S[$NF]}END{for(ainS)print(a,S[a])}

  • PyCharm使用教程 — 9、PyCharm中的搜索技巧(文件/函数/内容)「建议收藏」

    PyCharm使用教程 — 9、PyCharm中的搜索技巧(文件/函数/内容)「建议收藏」PyCharm搜索(文件、函数、内容)Pycharm对搜索有很强大的支持,非常方便我们在项目中搜索某个关键词,或者函数等等1、文件内检索在文件内Ctrl+F,如下图所示2、文件内替换快捷键Ctrl+R,将搜索到的内容替换成目标内容。说明:保留原有大小写,比如原来的首字母是大写,替换之后仍旧保留首字母大写。如下所示3、项目中查找1、Ctrl+Shift+F该快捷键容易冲突,比如本地如果安装了搜狗输入法,可以先将对应的快捷键关闭再使用。或者通过菜单栏进入,如下图

  • jar运行发生ClassNotFound的完整解决方案

    jar运行发生ClassNotFound的完整解决方案原文地址:http://www.java2000.net/viewthread.jsp?tid=6053转载请注明上述链接或者CSDN的链接1今天彻底测试了jar程序TestJar.javapackagenet.java2000.test.jar;importjavax.swing.JOptionPane;importorg.springframework.beans.fa

  • IT外包服务流程

    IT外包服务流程转载于:https://blog.51cto.com/lovezzl/93544

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号