【数据结构与算法】DFA算法-关键词匹配-java案例实现

该算法往往是用于匹配一些敏感词、绝对词等,从一篇文章中快速找到其中包含的关键词。

实现思路

        先读取所有关键词并存入set集合中。再将set中的关键词存入HashMap中,是以每个关键词字顺序存储,key为一个字、value为一个HashMap。在每一个HashMap都有一个key为is_end键值对来代表该字之前是否为一个关键词。

 大致存储结构如下: 

        以此为例(最先、最先进、最先进科技、最先进工艺、全球、全国)

 

首先存储这些关键词

/**
 * @author CC
 * @version 1.0
 * @since2023/11/7
 */
public  class SensitiveWordMap {
    private static final String ENCODING = "utf-8";

    public static final String IS_END_KEY ="is_end";

    // 初始化敏感字库
    public Map initKeyWord() throws IOException {
        Set<String> set = readSensitiveWordFile();
        Map<String, Object> stringObjectMap = addSensitiveWordToHashMap(set);
        return stringObjectMap;
    }

    // 读取敏感词库,存入Set中
    private   Set<String> readSensitiveWordFile() throws IOException {
        Set<String> wordSet =null;
        //通过txt文件获取所有关键词并存入set集合中
        try (InputStream inputStream = SensitiveWordMap.class.getResourceAsStream("/static/words.txt");
             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, ENCODING);
             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) {
            wordSet =new HashSet<String>();
            String line =null;
            while ((line=bufferedReader.readLine())!=null){
                wordSet.add(line);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return wordSet;
    }

    // 将Set中的敏感词,存入HashMap中
    private Map<String, Object> addSensitiveWordToHashMap(Set<String> wordSet) {

        //初始化词库Map
        Map<String,Object> wordMap =new HashMap<>();

        //遍历关键词库中的每个关键词
        for (String word:wordSet){
            Map<String, Object> nowMap =wordMap;
            //遍历每个关键词的每个字
            for (int i = 0; i <word.length() ; i++) {
                //关键词中的某个字
                String keyChar =String.valueOf(word.charAt(i));
                Map<String,Object> subWordMap = (Map<String, Object>) nowMap.get(keyChar);
                if (subWordMap==null){
                    subWordMap=new HashMap<>();
                    subWordMap.put(IS_END_KEY,false);
                    nowMap.put(keyChar,subWordMap);
                }
                //切换下一层
                nowMap=subWordMap;

                //判断当前“字”是否是关键词的最后一个字
                if (i==word.length()-1){
                    nowMap.put(IS_END_KEY,true);
                }
            }
        }
        return wordMap;
    }
}

words.txt如下 

最佳
最具
最爱
最佳
最优
最优秀
最大
最大程度
最高
最高级
最高档
最高阶
最奢侈
最低
最低级
最低价
最先
最先进
最先进科技
最先进工艺
最先享受
最新
最新科技
最新理念

匹配关键词类

/**
 * @author CC
 * @version 1.0
 * @since2023/11/7
 */
public class SensitiveFilter {

    /**
     * 敏感词过滤器:利用DFA算法 进行敏感词过滤
     */
    private Map sensitiveWordMap = null;

    /**
     * 最小匹配规则,
     * 例如:敏感词库["最先","最先进","最先进工艺"],
     * 语句:"机身采用最先进工艺打造",
     * 匹配结果:[最先]
     */
    public static final int MIN_MATCH_TYPE = 1;

    /**
     * 最大匹配规则,
     * 例如:敏感词库["最先","最先进","最先进工艺"],
     * 语句:"机身采用最先进工艺打造",
     * 匹配结果:[最先进工艺]
     */
    public static final int MAX_MATCH_TYPE = 2;

    // 单例
    private static SensitiveFilter instance = null;

    /**
     * 构造函数,初始化敏感词库
     */
    private SensitiveFilter() throws IOException {
        SensitiveWordMap wordMap = new SensitiveWordMap();
        sensitiveWordMap = wordMap.initKeyWord();
    }

    /**
     * 获取单例
     */
    public static SensitiveFilter getInstance() throws IOException {
        if (instance == null) {
            instance = new SensitiveFilter();
        }
        return instance;
    }

    /**
     * 获取文字中的敏感词
     */
    public Set<String> getSensitiveWord(String txt, int matchType) {
        Set<String> set =new HashSet<>();
        for (int i = 0; i <txt.length() ; i++) {
            int count = checkSensitiveWord(txt, i, matchType);
            if (count!=0){
                set.add(txt.substring(i,count+i));
                i=i+count-1;
            }
        }
        return set;
    }

    /**
     * 检查文字中是否包含敏感字符,检查规则如下:
     * 如果存在,则返回敏感词字符的长度
     * 如果不存在,返回0
     */
    private int checkSensitiveWord(String txt, int beginIndex, int matchType) {
        //关键词库
        Map<String, Object> nowMap = sensitiveWordMap;
        //记录匹配标志次数
        int matchFlag = 0;
        //结束标志
        boolean flag = false;

        //从指定位置开始遍历“关键字“字符串
        for (int i = beginIndex; i < txt.length(); i++) {

            //获取一个字
            String keyChar = String.valueOf(txt.charAt(i));

            //根据当前关键”字“,从词库中获取该”关键字“对应的map
            nowMap = (Map<String, Object>) nowMap.get(keyChar);

            if (nowMap != null) {
                //匹配成功
                matchFlag++;
                if ((boolean) nowMap.get(SensitiveWordMap.IS_END_KEY)) {
                    //代表本次匹配状态终止
                    flag = true;

                    //如果匹配规则是最小匹配,结束匹配过程
                    if (matchType == MIN_MATCH_TYPE) {
                        break;
                    }
                }
            } else {
                //匹配失败
                break;
            }
        }

        //没有匹配结果:匹配字数少于2 或者 匹配没有结束
        if (matchFlag < 2 || !flag) {
            matchFlag = 0;
        }

        return matchFlag;
    }
}

 测试

/**
 * @author CC
 * @version 1.0
 * @since2023/11/7
 */
public class test {
    public static void main(String[] args) throws IOException {
        SensitiveFilter sensitiveFilter = SensitiveFilter.getInstance();
        String txt ="整个机身采用最先进工艺进行制造,是整个东半球最优秀产品,最大程度还原科技震撼!做出最奢侈的产品是终身的信念!";
        Set<String> sensitiveWord = sensitiveFilter.getSensitiveWord(txt, SensitiveFilter.MAX_MATCH_TYPE);
        System.out.println(sensitiveWord);
    }
}

最大匹配规则结果

最小匹配规则结果

别倒在黎明之前
关注 关注
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java关键字匹配算法_简单关键词匹配算法
weixin_39606244的博客
02-13 3178
针对微博的短篇博文,编写的简单分词和匹配算法。相对于一篇文档的复杂分词算法,能够在效率和可用性上得到较好的平衡。package com.sina.tblog.sentiment;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;imp...
Java实现DFA算法敏感词、广告词过滤功能示例
08-28
本篇文章主要介绍了Java实现DFA算法敏感词、广告词过滤功能示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java实现关键词抽取算法
07-01
基于种子的一种关键词抽取算法,并用java实现
java利用DFA算法实现敏感词过滤功能
08-30
在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解。下面这篇文章主要给大家介绍了关于java利用DFA算法实现敏感词过滤功能的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
基于java实现DFA算法代码实例
09-07
主要介绍了基于java实现DFA算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
C++ DFA实现敏感词匹配
12-08
算法基于DFA并进行相应的简化,大概流程是将敏感词库按模块聚合构建成一个词树,然后从头到尾扫描一遍目标文本,当遇到以敏感词树中的索引的字时,查看后面的文本是否构成敏感词,构成敏感词即记录(当查找到敏感词时,记录下来敏感词位置,接着往下匹配,如果后续匹配不上,则以之前匹配到的为主,如若后续匹配上了,则将之前匹配到的节点后移,以此匹配到最长的敏感词) 该DEMO已实现添加敏感词 设置敏感词的等级 敏感词低于何种等级不屏蔽 实现了最长的敏感词匹配(即敏感词为:中国,中国人,中国人民 )当输入:我是一个中国人民时,匹配到中国人民
DFA 算法实现关键词匹配
weixin_34362790的博客
08-13 404
起因: 从网页中爬去的页面。须要推断是否跟预设的关键词匹配(是否包括预设的关键词),并返回全部匹配到的关键词 。 眼下pypi 上两个实现 ahocorasick https://pypi.python.org/pypi/ahocorasick/0.9 esmre https://pypi.python.org/pypi/esmre/0.3.1 可是事实上包都是基于...
java implements_这些Java关键字,及详细的介绍。非常值得收藏
weixin_39994270的博客
11-21 1180
一、 关键字总览:二、 详细解释1. 访问控制1) private 私有的private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。 只能在声明 private(内部)类、方法或字段的类中引用这些类、方法或字段。在类的外部或者对于子类而言,它们是不可见的。 所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中...
DFA算法实现敏感词过滤
09-27
已在项目中使用,绝对是你想要的,高效的DFA算法实现敏感词过滤功能。
文本中关键字匹配算法实现
06-16
文本中关键字匹配算法实现
DFA-Regex:Java中的DFA正则表达式引擎
05-07
这是Java DFA regex引擎的实现。 高兼容性-单个jar库,无第3个依赖项 高性能-O(n)线性时间复杂度可用于避免 用例 RegexMatcher matcher = new RegexMatcher ( " \\ d{1,3} \\ . \\ d{1,3} \\ . \\ d{1,3} \\ . \\...
高效敏感词过滤JAVA实现DFA算法) 5000字2ms
05-01
高效敏感词过滤JAVA实现DFA算法) 5000字2ms 节点 + 2进制标识(节省空间/提高查询效率) 附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,...
编译原理(二)词法分析:3.记号的识别―NFA与DFA
sandalphon4869的博客
11-18 6047
文章目录NFA状态转换矩阵 两种有限自动机(FA,Finite Automation): NFA(Nondeterministic Finite Automata,不确定的有限自动机) DFA (Deterministic Finite Automata,确定的有限自动机) 三种转化形式 NFA 的抽象定义 状态转换图 状态转换矩 NFA M =(S,∑,move,s0,F) 其中: ...
正则表达式和自动机(DFA&NFA)
weixin_43541528的博客
03-28 5785
文章目录一 正则表达式匹配原理1.1 正则表达式1.2 DFA1.3 正则表达式和DFA的关系1.4 正则匹配过程二 DFA的构建三 DFA与正则的转化3.1 DFA转正则表达式3.2 正则表达式转DFA3.2.1 正则表达式转NFA3.2.2 NFA确定化四 js中的正则 一 正则表达式匹配原理 1.1 正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。例如,筛选所有以包含连续
dfa算法(dfa算法)
计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。
02-25 1940
dfa和nfa的基本概念及其区别? 基本概念: 1. 确定有限自动机(Deterministic Finite Automaton) 简称DFAdfa匹配速度,是确定的。 2. 非确定有限自动机(Nondeterministic Finite Automaton) 简称NFA,nfa是匹配结果,是不确定的。 1...
DFA敏感词算法
BarryLee的博客
07-03 1685
然而,DFA算法的构建过程比较耗时,因为需要预先构建状态转换表和敏感词字典树,但这个过程通常在系统启动时进行,不会影响到实际的匹配性能。DFA算法的核心是构建一个有限状态自动机,该自动机由一个有限数量的状态和状态之间的转换构成。在字符串匹配过程中,算法会从字符串的开头开始,根据字符逐步转移到下一个状态,直到匹配完整个模式或者无法继续匹配。在状态转换表中,每个状态代表当前匹配到的字符串前缀,表格中的每一项表示在当前状态下,接受某个字符后转移到的下一个状态。本文代码基于Spring Boot。
java关键字匹配
白高林的专栏
03-25 4287
java关键字匹配 /** * 关键字匹配 * @param word * @param key * @return */ public boolean compileKeyWord(String word, String keyWord) { Pattern pn = Pattern.comp...
java DFA算法
最新发布
08-16
这个表可以使用Java中的数据结构(如二维数组或哈希表)来表示。 3. 初始化有限状态自动机的初始状态。 4. 遍历目标字符串中的每个字符: - 根据当前字符和当前状态,在状态转换表中查找下一个状态。 - 如果找到下...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【Redis】Redis使用和RedisTemplate的方法介绍 1773
  • 【JavaSE】Java哈希算法。Hmac算法的加密和校验的实现方法 1355
  • 【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用 994
  • 【设计模式】单例模式的7种实现方法 981
  • 【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解 773

最新评论

  • 【数据结构与算法】常用排序,查找算法的实现。

    白话机器学习: 文章写得专业、深入、详细,收藏啦

  • 【JavaSE】实现通过JavaMail发送邮件

    CSDN-Ada助手: 恭喜您开始博客创作!标题确实很吸引眼球,想必您在使用JavaMail方面有了很大的突破。接下来,我建议您可以分享一些具体的使用经验和技巧,让读者更好地了解如何在实际项目中运用JavaMail。期待您的下一篇博客!祝您写作愉快! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1

  • 【JavaSE】FTP协议实现列表展示,文件上传,文件下载

    CSDN-Ada助手: 评论:非常高兴看到您写了第二篇博客!您对通过FTP协议实现列表展示、文件上传和文件下载的内容进行了详细的介绍,让读者能够更好地理解和应用这些技术。希望您能够继续创作,分享更多有趣和实用的知识。 除了您在标题和摘要中提到的内容,还有一些与FTP协议相关的扩展知识和技能可以进一步了解。例如,FTP协议的安全性,如何配置FTP服务器来实现更好的访问控制和权限管理,以及FTP客户端的其他高级功能,如断点续传和多线程传输等。同时,您还可以分享一些使用FTP协议进行文件传输的最佳实践,例如如何处理大文件的传输、如何处理文件冲突和重复上传等问题。 谦虚地说,我相信您一定还有很多其他有价值的知识和技能,能够为读者提供更多实用的指导和帮助。期待您的下一篇博客!加油! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2

  • 【JavaSE】Java哈希算法。Hmac算法的加密和校验的实现方法

    CSDN-Ada助手: 恭喜您写了这么受欢迎的博客!标题中的Java哈希算法和Hmac算法的加密和校验实现方法确实是一个非常热门的话题。不仅吸引了全世界80万人的关注,也展示了您对这些算法的深入理解和实践经验。 在下一步的创作中,我建议您可以继续分享Java相关的实用技巧或者深入解析一些经典的算法设计。您的博客能够帮助广大读者更好地理解和应用这些知识,对他们的学习和工作都会有所帮助。期待您的下一篇作品! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3

大家在看

  • [ROS报错问题]SystemError: initialization of cv_bridge_boost raised unreported exception 201
  • 【华为OD】C卷真题 100分:幼儿园篮球游戏 C语言代码实现[思路+代码] 4
  • JVM(Java虚拟机)、JMM(Java内存模型)笔记 496
  • 你的年薪多少?看看程序员如何做到年薪 50 万! 559
  • 哈哈哈哈哈

最新文章

  • 【数据结构与算法】Snowflake雪花算法Java实现
  • 【数据结构与算法】链表的分割
  • 【数据结构与算法】二叉树的镜像实现
2023年41篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司龙华网站搭建价格北海SEO按天计费哪家好北京至尊标王推荐抚顺企业网站改版阜新百度网站优化排名哪家好商丘seo排名价格衡阳阿里店铺运营报价邢台SEO按天收费公司布吉关键词排名哪家好东莞阿里店铺托管报价南充网页设计价格张北seo网站推广推荐株洲设计公司网站价格淮安推广网站价格上饶seo排名报价河源SEO按天扣费公司潮州网站搭建多少钱和县百姓网标王哪家好鹰潭建站民治网站定制多少钱漳州网络推广德州网站开发报价德阳seo优化多少钱威海模板网站建设价格临沧关键词排名多少钱邯郸百度seo价格钦州企业网站制作公司忻州网站改版推荐甘孜百度标王多少钱鞍山百度网站优化价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化