构建健康游戏环境:DFA算法在敏感词过滤的应用

现在的游戏有敏感词检测这一点,相信大家也不陌生了,不管是聊天,起名,签名还是简介,只要是能让玩家手动输入的地方,一定少不了敏感词识别,至于识别之后是拒绝修改还是星号替换,这个就各有各的做法了,但是绕不开的一定是需要高效的敏感词检测机制。

DFA

相信大家对于游戏里聊天框的以下内容已经不陌生了

  • “我***”
  • “你真牛*”
  • “你是不是傻*”

一个垃圾的游戏环境是非常影响玩游戏的心情的,看到这些***,就知道游戏已经帮我们屏蔽掉了那些屏蔽字了,对于玩游戏而言,心里会好受很多。敏感词识别对于游戏的重要性不言而喻。当然,除了游戏,也有很多业务场景可能需要敏感词检测,如果你接到这样一个需求的时候,你会怎么做?

一、原生API

作为Java程序员,我的第一反应,一定是使用jdk原生的String类提供的contain或replace方法来进行包含判断或字符替换,这是最简单直接的方式。那我们就来看看String的实现方式:

contains

String在java中以char数组形式存储,而String.contains的实现,实际上是对数组的遍历查找匹配

// 最终调用方法
static int indexOf(char[] source, int sourceOffset, int sourceCount,
        char[] target, int targetOffset, int targetCount,
        int fromIndex) {
   
		// ...
}

replace

String.replace有4个接口,实现为正则匹配替换或直接遍历替换

public String replace(char oldChar, char newChar) {
   
	// 直接进行字符串遍历,替换第一个匹配的字符串
}
public String replace(CharSequence target, CharSequence replacement) {
   
	// 创建Pattern,使用LITERAL模式进行正则匹配替换replaceAll
    	// 当设置LITERAL标志时,输入字符串中的所有字符都被视为普通字符。
        // 这意味着正则表达式的特殊字符,如点号(.)、星号(*)、加号(+)等,都将失去它们在正则表达式中的特殊意义,被直接视为普通字符。
}
public String replaceAll(String regex, String replacement) {
   
	// 创建Pattern,使用正则表达式模式匹配替换replaceAll
}
public String replaceFirst(String regex, String replacement) {
   
	// 创建Pattern,使用正则表达式模式匹配替换replaceFirst,仅替换第一个匹配的字符串
}

通过jdk提供的String源码我们可以得到以下结果:

  • 使用contains方法进行包含判断,它的底层实现原理其实就是通过遍历目标字符串的字符数组进行挨个匹配;少量敏感词检测的时候是可行的,但如果目标字符串很大,并且要匹配的敏感词足够多的时候,它的遍历匹配效率是很低的。
  • replace则分两种实现,其中一种是类似contains方法,也是进行对目标字符串进行字符数组的遍历替换。
  • replace的另一种实现,是通过java的正则表达式去做匹配,正则匹配相比于遍历匹配,效率上不会有明显提升,但对于复杂模式的解析匹配会有比较明显的优势

其他语言的字符串操作API大同小异,具体看源码的实现方式

DFA

二、正则表达式

另外一种我们能想到的方式就是进行正则表达式的匹配了。前面提到,在java中如果使用String的api,它有部分接口就是使用正则表达式来实现的。
使用正则表达式有一定优势,也有一定缺陷。这就不得不提正则表达式的实现原理:FA(Finite Automaton:有限自动机)

DFA与NFA

FA又分为DFA和NFA,我们以正则ab|ac举例

  • NFA(Nondeterministic finite automaton:非确定性有限状态自动机)
    在NFA中表达式会构建为以下结构
    nfa

    • 非确定性:对于给定的输入符号,NFA可以从一个状态转移到多个状态。这意味着存在多种可能的状态转换路径,NFA在任何时间点都可以处于多个状态。
    • 回溯:由于NFA在处理输入时可以选择多条路径,因此可能需要回溯。当某条路径未能达到接受状态时,NFA会返回并尝试其他可能的路径。
    • 构造:NFA相对容易构造,特别是对于复杂的或包含多种可能的语言(例如正则表达式)。
    • 运行效率:由于其非确定性特性,NFA在运行时可能需要更多的计算资源,特别是在处理长输入字符串时。
  • DFA(Deterministic finite automaton:确定性有限自动机)
    在DFA中表达式会构建为以下结构
    dfa

    • 确定性:对于给定的输入符号,DFA从一个状态转移到另一个唯一确定的状态。这意味着DFA在任何时间点只能处于一个状态。
    • 无回溯&

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

25. 数组作为函数参数

写代码时,我们会将数组作为参数传给函数 冒泡排序: 两两相邻的元素进行比较,可能的话进行交换 一趟冒泡排序会将一个元素放在其最后应该在的位置 10个数字只需9趟,第一趟10个数字待排序,9对比较;第二趟…

Hotspot源码解析-第十二章-线程栈保护页

了解保护页,先从几个问题开始吧 1、为什么线程栈有栈帧了,还要有保护页? 答:在操作系统中内存可以看成是一个大数组,这就有一个问题,线程之间可能会互相踩了别人的内存空间,所以栈空间也存在这…

OPENGL,GPU图形库Skia在Windows下编译多种VS版本的DLL

这几天刚改了改Duilib,之前为了让Duilib更好的支持透明异形窗体所以把Duilib改为Gdi和Gdi的双渲染引擎。于是想到了有时间就把渲染引擎完全独立为渲染接口,可以增加更多的渲染引擎。现在来说Skia是个很不错的渲染,之前我只是单独编译了VS2013…

集群部署篇--Redis 集群动态伸缩

文章目录 前言一、redis 节点的添加1.1 redis 的实例部署:1.2 redis 节点添加:1.3 槽位分配:1.4 添加从节点: 二、redis 节点的减少2.1 移除主节点2.1.1 迁移槽位2.1.1 删除节点: 三、redis 删除节点的重新加入3.1 加入…

Android Studio新手实战——深入学习Activity组件

目录 前言 一、Activity简介 二、任务栈相关概念 三、常用Flag 四、结束当前Activity 五、Intent跳转Activity 六、更多资源 前言 Android是目前全球最流行的移动操作系统之一,而Activity作为Android应用程序的四大组件之一,是Android应用程序的核…

一文讲透怎样用SPSS做二项Logistic回归分析?结果如何解释?

推荐采用《SPSS统计分析入门与应用精解(视频教学版)》 杨维忠、张甜 清华大学出版社“7.4 二元Logistic回归分析” 的解答。 本节内容选自《SPSS统计分析入门与应用精解(视频教学版)》 杨维忠、张甜 清华大学出版社“7.4 二元Logi…

对象克隆学习

假如说你想复制一个简单变量。很简单: int apples 5; int pears apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象,情况就有些复杂了。 …

VMware Workstation虚拟机CentOS 7.9 配置固定ip的步骤

VMware Workstation虚拟机CentOS7.9配置固定ip的步骤 编辑虚拟机 打开VMware Workstation。 选择要配置的虚拟机,但不要启动它。 点击“编辑虚拟机设置”(Edit virtual machine settings)。 选择“网络适配器”(Network Adapter&…

Mybatis源码基本原理--XML版

文章目录 mybatis是什么架构设计首先建立起Mapper的代理工程和代理映射器的注册和使用XML文件解析数据源解析、创建和使用SQL执行器(Executor)的定义与实现SQL解析参数处理器:策略模式实现封装处理结果注解 mybatis 是什么 MyBatis 是一款优…

光掩膜基板,到2024年全球市场规模将超过30亿美元

光掩膜基板是一种用于微电子加工的关键材料,其特点是具有高透光性和高平整度,能够提升微电子元器件的成品率和品质。全球市场分析 从全球市场来看,光掩膜基板市场规模持续增长。据分析,到2024年,全球光掩膜基板市场规模…

全志R128硬件设计指南①

原理图设计 硬件系统框图 R128是一颗专为“音视频解码”而打造的全新高集成度 SoC,主要应用于智能物联和专用语音交互处理解决方案。 单片集成 MCURISCVDSPCODECWIFI/BTPMU,提供生态配套成熟、完善的用于系统、应用和网络连接开发的高效算力&#xff…

JavaScript高级程序设计读书记录(一):语言基础,语法,变量,数据类型

1. 语法 很大程度上借鉴了 C 语言和其他类 C 语言,如 Java 和 Perl. 1.1 区分大小写 1.2 标识符 第一个字符必须是一个字母、下划线(_)或美元符号($); 剩下的其他字符可以是字母、下划线、美元符号或数…

企业培训系统开发:构建灵活高效的学习平台

企业培训系统的开发在当今数字化时代是至关重要的。本文将介绍一些关键技术和代码示例,以帮助您构建一个灵活、高效的企业培训系统。 1. 技术选型 在开始企业培训系统的开发之前,首先需要选择合适的技术栈。以下是一个基本的技术选型示例:…

Spring Boot整合Spring Security:构建安全的Web应用

文章目录 1. 添加依赖2. 配置Spring Security3. 创建用户服务4. 控制器和视图5. 运行应用 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:Java框架 ✨文章内容:…

RK3568驱动指南|第九篇 设备模型-第108章 驱动注册流程分析实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

计算机创新协会冬令营——暴力枚举题目04

说句实话,单纯的暴力枚举题目太难找了┭┮﹏┭┮,接招吧~~ 题目 2094. 找出 3 位偶数 - 力扣(LeetCode) 给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。…

光伏效果图是用什么软件建模设计的?

光伏效果图是展示光伏系统在建筑或地面上的外观和效果的图像。要创建这样的效果图,需要使用专业的建模和设计软件。那么,光伏效果图是用什么软件建模设计的呢? 鹧鸪云光伏设计软件:鹧鸪云是一款集开发、设计和施工为一体的设计软…

【每日一题】被列覆盖的最多行数

文章目录 Tag题目来源解题思路方法一:二进制枚举 写在最后 Tag 【二进制枚举】【矩阵】【2024-01-04】 题目来源 2397. 被列覆盖的最多行数 解题思路 方法一:二进制枚举 思路 使用二进制枚举所有选中列的集合,对于集合中的每一个二进制数…

whistle+SwitchyOmega前端api代理调试

1、whistle介绍 whistle官网whistle githubwhistle主要用于查看、修改HTTP、HTTPS、Websocket的请求、响应,也可以作为HTTP代理服务器,功能很强大 2、安装教程 官方安装文档 // 全局安装whistle npm install -g whistle// 安装whistle的inspect插件&a…

three.js gltf后处理颜色异常(伽马校正)

效果&#xff1a; 应用了伽马校正&#xff0c;好像效果不明显 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…