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)


相关推荐

  • 《深入浅出WPF》——模板学习

    《深入浅出WPF》——模板学习一、前言    图形用户界面(GUI,GraphicUserInterface)应用较之控制台界面(CUI,CommandUserInterface)应用程序最大的好处就是界面友好、数据显示直观。CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本、列表、图形等多种形式立体显示。  用户体验在GUI程序设计中起着举足轻重的作用——用户界面设计成什么样子看上去才够漂亮?控件如何安排才简单易用并且少犯错误?(控件并不是越复杂

  • 2005中文博客排名报告「建议收藏」

    2005中文博客排名报告「建议收藏」2005中文博客排名报告发布机构:时代财富科技公司 摘要:2004年11月时代财富科技公司推出了中文Blog排行榜,得到了大众及媒介的广泛关注,也成为众多同行和资本市场了解中文博客网站的重要参考。历经2005年上半年中文Blog托管网站的飞速发展时期,博客网站也正经历着重新的洗牌和残酷的市场竞争。经过长时间的调查和分析,结合大量的用户体验,时代财富科技公司于2005年8月隆重推出《

  • python的concat函数_python concat函数

    python的concat函数_python concat函数test1=pd.DataFrame(np.random.randn(2,2),columns=[‘1′,’2’])test1test2=pd.DataFrame(np.random.randn(4,2),columns=[‘1′,’sss’])test2test3=pd.concat([test1,test2])test3test4=pd.concat([test1,test2],axis=1)…

  • 服务器pci数据捕获和信号处理 感叹号,PCI数据捕获和信号处理控制器win7驱动

    服务器pci数据捕获和信号处理 感叹号,PCI数据捕获和信号处理控制器win7驱动这是PCI数据捕获和信号处理控制器win7驱动下载,有些电脑在安装了系统后会在设备管理器中出现PCI数据捕获和信号处理控制器黄色感叹号提示,此时需要安装“IntelTurboBoost”驱动软件。软件介绍有时候我们装完系统的时候,各种驱动都安装完毕了,然后发现系统属性里面的设备管理器其他设备—PCI数据捕获和信号处理器控制器上还是有个问号,此款驱动就是解决这个问题的。PCI数据捕获和信号处理…

  • Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 21 path $.data

    Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 21 path $.data

  • java自适应网站成品源代码出售 h5网页推广展示型官网CMS系统源码

    java自适应网站成品源代码出售 h5网页推广展示型官网CMS系统源码QQ:464652874项目具体详情点击这企业门户网站系统源代码java响应式企业官网成品源码公司行业通用源代码web网站出售可二次开发源码项目介绍:企业门户网站系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的企业了解和熟知企业门户网站系统的便捷高效,不仅为用户提供了服务,而且也推广了自己,让更多的用户了解自己。对于企业而言,若拥有自己的企业门户网站系统,通过企业门户网站系统让企业的宣传、营销提上一个新台阶,同时提升了企业形象。技术介绍:前端页面自适应,支持PC和H5手机端、平

发表回复

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

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