DFA 算法实现敏感词过滤

背景

项目中APP端发帖,评论可能包含多个关键词,铭感词。此时需要对该内容进行过滤处理。此前都是在客户端层面操作,这样不仅带来了性能的损耗,而且新增铭感词时,需要客户端重新打包上架,显得十分不合理。所以应该在服务端层面进行算法数据处理。

DFA 算法

DFA 全称为: Deterministic Finite Automaton, 即确定有穷自动机。其特征为:有一个有效状态的集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA 中不会有从同一个状态触发的两条边标志有相同的符号。

  • 确定:状态以及引起状态转换的事件都是可确定的,不存在“意外”
  • 有穷: 状态以及事件的数量都是可穷举的

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}
}

用通俗易懂的话来解释,就是将数据库中的铭感词进行建立树结构,举个例子,数据库的铭感词汇有三个,分别是:今天,今天很好,今天真烦
建立树结构,并且标记好三个词汇的非叶子节点和叶子节点 (即最后一个字符是非叶子节点),并且制定好匹配规则,只有碰到叶子节点才算一次过滤:
!

模拟用户输入以下一句话:

我觉得今天还行。

接下来我们将这句话逐个字拆分并将每一个字代入到上面的树状结构图中。

  • 前面三个字不在铭感词树种直接可以跳过,直到遇到这个字,发现匹配上铭感词树,接下来看树状结构发现只有一个字是才能捕获。
  • 再接着走发现在树结构中这个字的下一个字只有匹配到或者才能继续匹配,
  • 而用户输入的下一个字是,第一步判断当前已经走到了叶子节点,故先将今天置为敏感词。
  • 然后将这个字从Top顶节点中重新继续流转,发现无法匹配。
  • 过滤结束,且当前的节点是叶子节点,故这句话仅仅被[敏感词过滤]了今天这两个字,最终的过滤结果应该是:

我觉得**还行

要注意的是只有完整的碰到过一次叶子节点才算一次过滤,且一句话可以被多次过滤。以上就是针对DFA算法的简单说明。

简单使用

Hutool 工具类中通过WordTree 实现类DFA 算法,能构方便的做到开箱即用
这是源码中的一个简单介绍
在这里插入图片描述

import cn.hutool.dfa.WordTree;public static void main(String[] args) {WordTree wordTree = new WordTree();wordTree.addWords("希望", "这是真的", "哈哈");// 搜索出内容中名并输出String text = "我希望你是最好的";List<String> matchWords = wordTree.matchAll(text, -1, true, true);System.out.println(matchWords);   // [希望]// 是否匹配上内容的铭感词,匹配上返回trueboolean match = wordTree.isMatch(text);System.out.println(match);  // true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/312441.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派eMMC扩容分区

1. Raspbian系统&#xff08;树莓派官方系统&#xff09; 使用命令 raspi-config选择 Advanced Options 选择 Expand Filesystem 重启即可扩容成功。 2. 非树莓派官方系统 查看硬盘列表及分区信息 [rootlocalhost install]# lsblk NAME MAJ:MIN RM SIZE RO TYPE…

14 2023.12.31 --------release--------misc--------

呵呵 一部分 misc 存在草稿箱好久了 而且 也并没有那么重要, 直接放出去吧 今年的 专业技能方面的收获主要是一些方面 linux 方面, 这部分内容主要是集中在上半年 90 telnet 连接上对方服务之后 立即 “Connection closed by foreign host.“ 89 重写 /proc/sys/vm/nr_pd…

HarmonyOS4.0系统性深入开发07创建一个ArkTS卡片

创建一个ArkTS卡片 在已有的应用工程中&#xff0c;创建ArkTS卡片&#xff0c;具体操作方式如下。 创建卡片。 根据实际业务场景&#xff0c;选择一个卡片模板。 在选择卡片的开发语言类型&#xff08;Language&#xff09;时&#xff0c;选择ArkTS选项&#xff0c;然后单…

【AIGC-图片生成视频系列-4】DreamTuner:单张图像足以进行主题驱动生成

目录 一. 项目概述 问题&#xff1a; 解决&#xff1a; 二. 方法详解 a) 整体结构 b) 自主题注意力 三. 文本控制的动漫角色驱动图像生成的结果 四. 文本控制的自然图像驱动图像生成的结果 五. 姿势控制角色驱动图像生成的结果 2023年的最后一天&#xff0c;发个文记录…

vmware部署docker+springboot+MySQL(超详细)

一、前期准备 (一)安装jdk #docker search openjdk #docker pull openjdk:8 (二)确认网络 如果局域网其他终端(如手机访问),虚拟机网络连接需要选择《桥接》模式,而且,需要使用有线连接,不能使用Wi-Fi,切忌切忌! 并且要选择实际的那个有线连接。比如我这里是“R…

解算人生--写于2023跨年之夜

最近买了一本书&#xff0c;书名叫《计算》 读了部分内容&#xff0c;虽然理解上还需要再下下功夫&#xff0c;但是直观的感觉冲击还是挺大的&#xff0c;最明显的就是表面与本质的把握。大家可能都有这样一种感觉&#xff0c;初步涉足某一领域时&#xff0c;开始我们都会被大量…

读书笔记1-C++ Primer Plus

C是在C语言基础上开发的一种集面向对象编程&#xff08;OOP&#xff09;、通用编程和传统的过程化编程于一体的编程语言。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了C的基本概念和技术。 全书分17章和10个附录&#xff0c;分…

异常检测 | Matlab基于GNN图神经网络的数据异常数据检测

异常检测 | Matlab基于GNN图神经网络的数据异常数据检测 目录 异常检测 | Matlab基于GNN图神经网络的数据异常数据检测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 Matlab基于GNN图神经网络的数据异常数据检测。其核心思想是学习一个函数映射。本次使用人类活…

抖音详情API:从零开始构建抖音应用

随着短视频的兴起&#xff0c;抖音已经成为了一个全球范围内的热门平台。对于开发人员而言&#xff0c;利用抖音详情API从零开始构建抖音应用具有巨大的潜力和机会。本文将为你提供从零开始构建抖音应用的指南&#xff0c;包括开发环境搭建、API请求格式、用户认证等关键环节&a…

很想写一个框架,比如,spring

很想写一个框架&#xff0c;比如&#xff0c;spring。 原理很清楚&#xff0c;源码也很熟悉。 可惜力不从心&#xff0c;是不是可以找几个小弟一起做。

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下&#xff0c;相应进行开发环境搭建&#xff0c;然后做一个文档记录…

1.项目简介

本次项目建立的基础是基于Django后台admin管理功能上的二次加工以符合实际情况&#xff0c;所以需要读者对Django这个架构有一定的了解&#xff0c;具体可以查看作者的另一个专栏Django详解。 随着信息技术的迅猛发展&#xff0c;图书馆的借阅系统也在不断地进行更新和改进。传…