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算法已经实现,可继续开发我们的业务代码

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 游戏服务器架构演化史pdf_分布式游戏服务器

    游戏服务器架构演化史pdf_分布式游戏服务器类型1:卡牌、跑酷等弱交互服务端卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的HTTP服务器:登录时可以使用非对称加密(RSA,DH),服务器根据客户端uid,当前时间戳还有服务端私钥,计算哈希得到的加密key并发送给客户端。之后双方都用HTTP通信,并用那个key进行RC4加密。客户端收到key和时间

    2022年10月21日
    3
  • vue解决跨域的几种办法_前端跨域解决方案

    vue解决跨域的几种办法_前端跨域解决方案什么是跨域  跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据。源指协议,端口,域名。只要这个3个中有一个不同就是跨域。这里列举一个经典的列子:#协议跨域http://a.baidu.com访问https://a.baidu.com;#端口跨域http://a.baidu.com:8080访问http://a.baidu.com:80;#域名跨域http://a.baidu.com访问http://b.baidu.com;  现在很多公司都是采用前后分离的方式开发。那么出

    2022年10月1日
    2
  • QT基本介绍

    QT基本介绍一、什么是QT?Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。二、发展历史1991年Qt最早由奇趣科技开发1996年进入商业领域,它也是目前流行的Linux桌面环境…

    2022年5月13日
    109
  • Django之用户认证系统分析

    1.用户模型在django.contrib.auth.models.py包中定义了classUser(AbstractUser)类(1)User模型字段我在django中使用的是MySql,

    2021年12月30日
    44
  • Debian 6 字体显示效果调整

    Debian 6 字体显示效果调整在给cairo打了补丁之后,我发现debian的字体显示效果还是跟ubuntu有差别,于是我把ubuntu下/etc/fonts的所有文件都打包放在了debian的/etc/fonts下,这里面ubuntu对字体的渲染做了优化,我直接拿过来用了,:)。可是效果还是不一样,最后发现了问题所在。打开“Appearance”设置对话框,选中“Fonts”标签,点击”Details”,Hintin

    2022年10月9日
    2
  • jq正则表达式_JAVA 正则表达式

    jq正则表达式_JAVA 正则表达式一、JavaScript正则表达式正则表达式(英语:RegularExpression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。什么是正则表达式?正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。正则表达式可以是一个简单的字符,或一个更…

    2022年9月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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