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.mzph.cn/news/589074.shtml

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

相关文章

R306指纹识别模块指令系统

一&#xff1a;指令集 1. GR_GetImage 指令代码&#xff1a;01H 功能&#xff1a;从传感器上读入图像存于图像缓冲区 2. GR_GenChar 指令代码&#xff1a;02H 功能&#xff1a;根据原始图像生成指纹特征存于 CharBuffer1 或 CharBuffer2 3. GR_Match 指令代码&#xff…

SpringCloud(H版alibaba)框架开发教程,使用eureka,zookeeper,consul,nacos做注册中心——附源码(1)

源码地址&#xff1a;https://gitee.com/jackXUYY/springboot-example 创建订单服务&#xff0c;支付服务&#xff0c;公共api服务&#xff08;共用的实体&#xff09;&#xff0c;eureka服务 1.cloud-consumer-order80 2.cloud-provider-payment8001 3.cloud-api-commons 4.…

kubeadm来搭建k8s集群。

我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群搭建 主机配置建议&#xff1a;2c 4G 主机节点 IP …

Spring@Scheduled定时任务与SQLSERVER distinct order by的错误吞噬

目录 Scheduled 提供的调度机制 遇到错误不会抛出 数据库SQL差异 Scheduled 提供的调度机制 cronzonefixedDelayfixedDelayStringfixedRatefixedRateStringinitialDelayinitialDelayString 上面具体怎么用自己代码定位到API上去看注释说明。 遇到错误不会抛出 在SqlSe…

【力扣题解】P700-二叉搜索树中的搜索-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P700-二叉搜索树中的搜索-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f…

智慧园区物联综合管理平台之架构简述

总体架构 系统总体划分为物联感知系统层、 核心平台层、 综合运营服务平台和展示层四部分。 物联感知系统层 物联感知系统主要是支撑园区智能化运行的各子系统, 包括门禁系统、 视频监控系统、 车辆管理系统等。 核心平台层 核心平台层包括: 园区物联综合管理平台和园区…

x-cmd pkg | gum - 很好看的终端 UI 命令行工具

目录 简介首次用户功能特点Bubbles 与 Lip Gloss进一步探索 简介 gum 由 Charm 组织于 2022 年使用 Go 语言开发。旨在帮助用户编写 Shell 脚本与 dotfiles 时提供一系列快捷使用&#xff0c;可配置&#xff0c;可交互&#xff0c;美观的 Terminal UI 组件。 首次用户 使用 x…

[Angular] 笔记 25:指令

组件指令 (chatgpt 回答) 在 Angular 中&#xff0c;组件本身可以被视为指令&#xff0c;这种指令被称为组件指令。组件是 Angular 应用的构建块之一&#xff0c;它封装了一段具有特定功能和特性的用户界面&#xff0c;并且可以在应用中重复使用。 组件指令具有以下特征&…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

Docker九 | Swarm mode

目录 Swarm基本概念 节点 服务和任务 创建Swarm集群 创建管理节点 增加工作节点 查看集群 部署服务 新建服务 查看服务 服务伸缩 增加服务 减少服务 删除服务 Swarm基本概念 节点 节点分为管理节点(manager)和工作节点(worker) 管理节点 管理节点用于Swarm集群的…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPISDK获…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于在编写应用程序时无需重新发…

自定义事件

自定义事件 自定义事件 AAA"fn1"&#xff1a;向子组件的事件池中注入AAA事件&#xff0c;方法是父组件的fn1 发布订阅&#xff1a;子组件某个操作把父组件中的某个方法执行了 参数可以传多个 $listeners* $listeners&#xff1a;事件池中的方法 { aaa:fn1, bbb:fn2 }…

RestClient操作索引库_创建索引库(二)

ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c; 通过http请求发送给ES。 官方文档地址: https://www.elastic.co/quide/en/elasticsearch/client/index.html 目录 一、初始化JavaRestClient 1.1.依赖引入 1.2.初始化…

Mybatis枚举类型处理和类型处理器

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

MySQL之复合查询

目录 单表查询回顾 多表查询 自连接 子查询 在from子句中使用子查询 合并查询 单表查询回顾 在讲解多表查询前&#xff0c;我们先回顾一下单表查询&#xff0c;这是因为多表查询本质上依然是单表查询&#xff08;其原因在下文中讲解多表查询时再说明&#xff09;&#x…

【vue】Easy Player实现视频播放:

文章目录 一、效果&#xff1a;二、文档&#xff1a;三、实现&#xff1a;【1】安装插件&#xff1a;【2】引入js文件&#xff1a;【3】使用&#xff1a; 四、方法&#xff1a; 一、效果&#xff1a; 二、文档&#xff1a; GitCode - EasyPlayer.js npm-easydarwin/easyplayer…

uni-app 前后端调用实例 基于Springboot 下拉刷新实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

关于“Python”的核心知识点整理大全54

目录 18.4 创建其他网页 18.4.1 模板继承 1. 父模板 base.html 注意 2. 子模板 index.html 注意 18.4.2 显示所有主题的页面 1. URL模式 urls.py 2. 视图 views.py 3. 模板 topics.html 18.4.3 显示特定主题的页面 1. URL模式 urls.py 2. 视图 views.py 往…

Delphi6函数大全3-SysUtils.pas

Delphi6函数大全3-SysUtils.pas首部 function FindNext(var F: TSearchRec): Integer; $[SysUtils.pas功能 返回继续文件搜索说明 搜索成功则返回0参考 function Windows.FindNextFile例子 <参见FindFirst>━━━━━━━━━━━━━━━━━━━━━首部…