当前位置: 首页 > news >正文

游戏中的敏感词算法初探

在游戏中起名和聊天需要服务器判断是否含有敏感词,从而拒绝或屏蔽敏感词显示,这里枚举一些常用的算法和实际效果。

1.字符串匹配算法

常用的有KMP,核心就是预处理出next数组,也就是失配信息,时间复杂度在O(m+n) 。还有个比较有趣的算法,我之前也用过,叫Sunday算法,实现很简单,但是不稳定,时间复杂度最差也是O(m*n)。显然这些都是单字符串匹配的,一般游戏中都是有上万行的屏蔽字库。

2.Trie树

字典树,很实用的算法,把屏蔽字预处理成树状结构,就跟翻字典一样,相同前缀的同根,所以也叫前缀树,预处理完查询就是O(n)的效率。但是对于游戏来说不太适用,因为屏蔽词前缀相同的太少。这样导致构建出来的Trie树内存占用比较严重,查询效率也比较差。最近一直在用erlang,所以用map结构写了一版出来,具体实现可以参考

trie_test() ->trie_test(33000, #{tot => 0}).
trie_test(0, Trie) -> Trie;
trie_test(N, Trie) ->Rand = integer_to_list(random_int(1, 999999)),trie_test(N - 1, build_trie(Rand, 0, Trie)).build_trie(Word) -> build_trie(Word, 0, #{tot => 0}).
build_trie([], Index, Trie) ->CurNode = maps:get(Index, Trie, #{next => #{}, v => 0}),Trie#{Index => CurNode#{v => 0}};
build_trie([H | T], Index, Trie) ->Tot = maps:get(tot, Trie),CurNode = maps:get(Index, Trie, #{next => #{}, v => 0}),NextNode = maps:get(next, CurNode, #{}),Next = maps:get(H, NextNode, 0),{NewNum, NewTrie} =case Next of0 ->TempNode = maps:get(Tot + 1, Trie, #{next => #{}, v => 0}),Trie1 = Trie#{Tot + 1 => TempNode#{v => -1}},CurNodeNext = maps:get(next, CurNode, #{}),{Tot + 1, Trie1#{Index => CurNode#{next => CurNodeNext#{H => Tot + 1}}}};Num -> {Num, Trie}end,build_trie(T, NewNum, NewTrie#{tot => Tot + 1}).query_trie(Word, Trie) -> query_trie(Word, 0, 0, Trie).
query_trie(_, _, -1, _) -> -1;
query_trie([], Index, _Exist, Trie) ->#{v := V} = maps:get(Index, Trie, #{next => #{}, v => 0}), V;
query_trie([H | T], Index, _Exist, Trie) ->CurNode = maps:get(Index, Trie, #{next => #{}, v => 0}),NextNode = maps:get(next, CurNode, #{}),Next = maps:get(H, NextNode, 0),case Next of0 -> query_trie(T, Next, -1, Trie);_ -> query_trie(T, Next, 0, Trie)end.

2.AC自动机

著名的多模匹配算法,Trie和KMP的结合,实现比较复杂,游戏中也不适用。

3.Map

一般语言都带有Map结构,底层一般是散列表,把屏蔽字库预处理成map结构,然后O(m*m)的去查询,因为游戏中屏蔽字都比较短且需要检测的语句都不会很长,所以效率很可观。之前用lua做过性能测试,结果还是这个方法效率最高,很出乎我的意料。

4.总结

个人感觉需要做敏感词检测的话,最好是有会NLP的同学支持,因为屏蔽字库其实也很死板。游戏中各种广告敏感词都在日新月异,只有AI不断学习才能打败它们。要求不高的话,可以尝试Trie树和Map实现,不同开发语言和字库效果可能都不同,选最合适的即可。

相关文章:

游戏中的敏感词算法初探

在游戏中起名和聊天需要服务器判断是否含有敏感词,从而拒绝或屏蔽敏感词显示,这里枚举一些常用的算法和实际效果。 1.字符串匹配算法 常用的有KMP,核心就是预处理出next数组,也就是失配信息,时间复杂度在O(mn) 。还有个…...

使用Java和Apache Kafka Streams实现实时流处理应用

使用Java和Apache Kafka Streams实现实时流处理应用 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 引言 实时流处理已经成为现代应用开发中不可或缺的一部分。Apache Kafka Streams是一个强大的库…...

分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法

前言 树形结构是一种很常见的数据结构,类似于现实生活中的树的结构,具有根节点、父子关系和层级结构。 所谓根节点,就是整个树的起始节点。 节点则是树中的元素,每个节点可以有零个或多个子节点,节点按照层级排列&a…...

【柴油机故障诊断】基于斑马优化算法ZOA优化柴油机故障诊断附Matlab代码

% 柴油机故障诊断 - 基于斑马优化算法(Zebra Optimization Algorithm,ZOA)优化Transformer模型 % 代码示例仅为演示用途,实际应用中可能需要根据具体情况进行适当修改 % 初始化参数 maxIterations = 100; % 最大迭代次数 populationSize = 50; % 种群大小 % 斑马优化算法…...

C1W4.Assignment.Naive Machine Translation and LSH

理论课:C1W4.Machine Translation and Document Search 文章目录 1. The word embeddings data for English and French words1.1The dataThe subset of dataLoad two dictionaries 1.2 Generate embedding and transform matricesExercise 1: Translating English…...

智能听诊器:宠物健康监测的革新者

宠物健康护理领域迎来了一项激动人心的技术革新——智能听诊器。这款创新设备以其卓越的精确度和用户友好的操作,为宠物主人提供了一种全新的健康监测方法。 使用智能听诊器时,只需将其放置在宠物身上,它便能立即捕捉到宠物胸腔的微小振动。…...

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述,在苹果电脑(Mac)上搭建一套Stable Diffusion本地服务,以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库,包括cmake,protobuf,rust,python3.10,git,wge…...

k8s一些名词解释

潮汐计算 是一种根据负载变化动态调整资源分配的计算模式。其核心思想是利用峰值和非峰值时段的资源需求差异,动态地扩展或缩减计算资源。在 Kubernetes 环境中,可以通过自动扩展(auto-scaling)机制,根据工作负载的变化自动调整计算资源,最大化资源利用率并减少不必要的…...

ArkUI组件——循环控制/List

循环控制 class Item{name: stringprice:number}private items:Array<Item> [new Item("A0",2399),new Item("BE",1999),new Item("Ro",2799)] ForEach(this.items,(item:Item) > {})List组件 列表List是一种复杂的容器&#xff0c;…...

定制开发AI智能名片商城微信小程序在私域流量池构建中的应用与策略

摘要 在数字经济蓬勃发展的今天&#xff0c;私域流量已成为企业竞争的新战场。定制开发AI智能名片商城微信小程序&#xff0c;作为私域流量池构建的创新工具&#xff0c;正以其独特的优势助力企业实现用户资源的深度挖掘与高效转化。本文深入探讨了定制开发AI智能名片商城微信…...

网络安全(含面试题版)

一、网络概念 网络&#xff1a;一组相互连接的计算机&#xff0c;多台计算机组成&#xff0c;使用物理线路进行连接 作用&#xff1a; 数据交换 资源共享 二、网络分类 计算机网络覆盖的地理区域决定了它的类型。一般分为局域网(LAN)、城域网(MAN)、广域网(WAN)。 三、www万维网…...

牛客 7.13 月赛(留 C逆元 Ddp)

B-最少剩几个&#xff1f;_牛客小白月赛98 (nowcoder.com) 思路 奇数偶数 奇数&#xff1b;奇数*偶数 奇数 所以在既有奇数又有偶数时&#xff0c;两者结合可以同时删除 先分别统计奇数&#xff0c;偶数个数 若偶个数大于奇个数&#xff0c;答案是偶个数-奇个数 若奇个数…...

LeetCode 92. 反转链表 II

LeetCode 92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4…...

mac M1 创建Mysql8.0容器

MySLQ8.0 拉取m1镜像 docker pull mysql:8.0创建挂载文件夹并且赋予权限 sudo chmod 777 /Users/zhao/software/dockerLocalData/mysql 创建容器并且挂载 docker run --name mysql_8 \-e MYSQL_ROOT_PASSWORDadmin \-v /Users/zhao/software/dockerLocalData/mysql/:/var/l…...

【Vue3】4个比较重要的设计模式!!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是 Vue 框架,然而其代码结构紊乱不堪,可维护性极度糟糕😫。 这使我深刻领会到,理解并运用 Vue 中的重要设计模式是何等关键! …...

Ubuntu安装virtualbox(win10)

virtualbox下载安装 1、下载virtualbox 下载路径&#xff1a;Linux_Downloads – Oracle VM VirtualBox 根据自己的Ubuntu版本选择对应的安装包下载 2、安装virtualbox 到下载路径&#xff08;一般为~/Download&#xff09;打开终端输入命令 sudo dpkg -i xxx.deb 继续执…...

二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5

前端&#xff1a;UNIAPP 后端&#xff1a;ThinkPHP 数据库&#xff1a; Mysql 前端使用的uniapp 可以打包APP H5 小程序 系统提供了完善的网络借贷体系&#xff0c;为金融中介平台提供从获客到贷后管理全流程服务&#xff0c;解决了借贷手续繁琐、流程缓慢等问题 此源码为运营…...

LG 选择 Flutter 来增强其智能电视操作系统 webOS

可以这个话题会让大多数人困惑&#xff0c;2024 年了为什么还会冒出 webOS 这种老古董&#xff1f;然后 LG 为什么选择 webOS &#xff1f;现在为什么又选择 Flutter &#xff1f; 其实早在 Google I/O 发布 Flutter 3.22 版本的时候&#xff0c;就提到了 LG 选择 Flutter 来增…...

[ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;VRISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。 VRISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供…...

ASP.NET Core中创建中间件的几种方式

前言 今天我们一起来盘点一下在ASP.NET Core应用程序中添加和创建中间件常见的四种方式。 中间件介绍 ASP.NET Core中间件&#xff08;Middleware&#xff09;是用于处理HTTP请求和响应的组件&#xff0c;它们被安排在请求处理管道中&#xff0c;并按顺序执行。中间件的设计是为…...

volatile、内存屏障与 CPU 缓存机制详解

一、前置认知&#xff1a;CPU 缓存模型——并发可见性问题的根源 要理解 volatile&#xff0c;首先要搞懂 CPU 缓存模型。在计算机系统中&#xff0c;CPU 的运算速度远高于内存的读写速度&#xff0c;为了弥补两者之间的性能差距&#xff0c;CPU 厂商在 CPU 和内存之间引入了缓…...

零基础玩转OpenClaw:Qwen3-32B镜像快速入门5个示例

零基础玩转OpenClaw&#xff1a;Qwen3-32B镜像快速入门5个示例 1. 为什么选择OpenClawQwen3-32B组合&#xff1f; 去年冬天&#xff0c;当我第一次看到同事用自然语言命令电脑自动整理桌面文件时&#xff0c;仿佛打开了新世界的大门。经过两周的折腾&#xff0c;我终于在本地…...

Python 3.14 JIT动态优化实战(企业级成本控制白皮书)

第一章&#xff1a;Python 3.14 JIT编译器演进与企业级定位Python 3.14 引入了首个官方集成的、生产就绪的 JIT&#xff08;Just-In-Time&#xff09;编译器——PyJIT&#xff0c;标志着 CPython 从纯解释执行向混合执行模型的战略跃迁。该 JIT 并非替代现有字节码解释器&#…...

Spring Boot中UriComponentsBuilder的5个实用技巧:从URL拼接到底层编码原理

Spring Boot中UriComponentsBuilder的5个实用技巧&#xff1a;从URL拼接到底层编码原理 在对接第三方API时&#xff0c;URL的拼接与编码往往是开发者最容易踩坑的环节之一。Spring Boot提供的UriComponentsBuilder工具&#xff0c;不仅能优雅地处理参数拼接&#xff0c;还能解决…...

location-to-phone-number:如何将电话号码转化为商业智能的地理信息平台

location-to-phone-number&#xff1a;如何将电话号码转化为商业智能的地理信息平台 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gi…...

StructBERT在代码仓库管理中的重复代码检测应用

StructBERT在代码仓库管理中的重复代码检测应用 你有没有遇到过这种情况&#xff1f;在代码审查时&#xff0c;总觉得某段代码似曾相识&#xff0c;但又说不清在哪见过。或者&#xff0c;团队里不同成员为了解决类似问题&#xff0c;各自写了一套逻辑相近但细节不同的代码&…...

避坑指南:OpenClaw连接Qwen3-32B镜像的5大常见错误

避坑指南&#xff1a;OpenClaw连接Qwen3-32B镜像的5大常见错误 1. 为什么连接Qwen3-32B镜像容易踩坑&#xff1f; 上周我在本地尝试用OpenClaw对接Qwen3-32B镜像时&#xff0c;经历了从满怀期待到怀疑人生的全过程。本以为有了官方镜像就能一键连通&#xff0c;结果从环境配置…...

SUNFLOWER MATCH LAB在CSDN技术社区的分享:从部署到创新的完整旅程

SUNFLOWER MATCH LAB在CSDN技术社区的分享&#xff1a;从部署到创新的完整旅程 最近在CSDN上看到不少关于AI模型部署和应用的讨论&#xff0c;其中SUNFLOWER MATCH LAB这个项目引起了我的注意。它不是一个简单的模型调用工具&#xff0c;更像是一个围绕特定AI能力构建的完整实…...

终极Node.js无头浏览器测试指南:Zombie.js与Mocha集成实战

终极Node.js无头浏览器测试指南&#xff1a;Zombie.js与Mocha集成实战 【免费下载链接】zombie Insanely fast, full-stack, headless browser testing using node.js 项目地址: https://gitcode.com/gh_mirrors/zo/zombie 在当今快速发展的Web开发领域&#xff0c;Zomb…...

YOLOv11赋能卡证检测矫正:新一代目标检测模型实战应用

YOLOv11赋能卡证检测矫正&#xff1a;新一代目标检测模型实战应用 最近在做一个卡证信息自动录入的项目&#xff0c;发现最头疼的不是后面的文字识别&#xff0c;而是第一步——把歪歪扭扭、角度各异的证件图片给“摆正”了。传统的图像处理方法&#xff0c;比如霍夫变换找直线…...