敏感词过滤--golang
目录
- 1. 建立敏感词数据库表
- 2. 定时任务,读数据并建立敏感词树
- 2.1 开启定时任务
- 2.2 读数据并建立敏感词树
- 3. 使用
思路:
- 将敏感词都存到数据库表中
- 定时读取数据到内存中,构建敏感词前缀树
- 写工具方法,使用内存中的前缀树判断消息中是否包含敏感词或完成替换操作
1. 建立敏感词数据库表
CREATE TABLE `bad_words` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',`content` text COMMENT '敏感词内容',`create_user_id`bigint(20) unsigned COMMENT '创建用户id',`extra` text COMMENT '扩展信息',`create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',`modify_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '修改时间',`status` int DEFAULT 0 COMMENT '0存在,1删除',PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_general_ci;
2. 定时任务,读数据并建立敏感词树
项目启动的时候,开始执行这一块。
2.1 开启定时任务
var (ctx context.ContextBadWordsTrie *BadWordsTrieNode
)func InitCronLoader() {var err errorctx = context.Background()err = getBadWordsAndInitBadWordsTrie() // 初始化敏感词树if err != nil {panic(err)}gocron.Every(3).Minutes().Do(getBadWordsAndInitBadWordsTrie)go func() {<-gocron.Start()}()
}
2.2 读数据并建立敏感词树
func getBadWordsAndInitBadWordsTrie() error {// 从数据库获取信息badWordsList := getBadWordsFromDB()// 初始化敏感词树BadWordsTrie = initTrie(badWordsList)return nil
}func getBadWordsFromDB() []string {badWords := make([]*models.BadWord, 0)caller.LyhTestDB.Debug().Table(models.TableNameBadWord).Where("status=0").Find(&badWords)badWordsList := make([]string, 0)for _, item := range badWords {if item.Content != "" {badWordsList = append(badWordsList, item.Content)}}return badWordsList
}func initTrie(badWordsList []string) *BadWordsTrieNode {root := &BadWordsTrieNode{}for _, word := range badWordsList {addWord(root, word)}return root
}type BadWordsTrieNode struct {Children map[rune]*BadWordsTrieNode
}func addWord(root *BadWordsTrieNode, word string) {node := rootfor _, char := range word {if node.Children == nil {node.Children = make(map[rune]*BadWordsTrieNode)}if _, ok := node.Children[char]; !ok {node.Children[char] = &BadWordsTrieNode{}}node = node.Children[char]}
}
3. 使用
可以写到工具中
// 检查是否包含敏感词
func CheckBadWords(message string) bool {return isContain(message, cronloader.BadWordsTrie)
}// 将敏感词字符替换为*
func CheckAndReplaceBadWords(message string) string {return replaceBadWords(message, '*', cronloader.BadWordsTrie)
}// 将敏感词字符替换为自定义字符
func CheckAndReplaceBadWordsWithSep(message string, sep rune) string {return replaceBadWords(message, sep, cronloader.BadWordsTrie)
}func isContain(message string, root *cronloader.BadWordsTrieNode) bool {message = strings.ToLower(message)runes := []rune(message)for i := 0; i < len(runes); i++ {p := rootj := ifor j < len(runes) && p.Children != nil {char := runes[j]if _, ok := p.Children[char]; ok {p = p.Children[char]j++} else {break}}if p.Children == nil {return true}}return false
}func replaceBadWords(message string, sep rune, root *cronloader.BadWordsTrieNode) string {message = strings.ToLower(message)runes := []rune(message)for i := 0; i < len(runes); i++ {p := rootj := ifor j < len(runes) && p.Children != nil {char := runes[j]if _, ok := p.Children[char]; ok {p = p.Children[char]j++} else {break}}if p.Children == nil {for k := i; k < j; k++ {runes[k] = sep}}}return string(runes)
}
相关文章:
敏感词过滤--golang
目录 1. 建立敏感词数据库表2. 定时任务,读数据并建立敏感词树2.1 开启定时任务2.2 读数据并建立敏感词树 3. 使用 思路: 将敏感词都存到数据库表中定时读取数据到内存中,构建敏感词前缀树写工具方法,使用内存中的前缀树判断消息…...
NVIDIA cuda安装时全部失败
查看了很多博客,有写的非常详细清楚的博客,csdn上真的是一个很好的学习平台,我在学习过程中遇到的好多bug,都能在这上面找到解决方法,就是一个老师的存在。 我安装NVIDIA cuda安装时失败了N次,数不清了&am…...
APScheduler-调度器AsyncIOScheduler
AsyncIOScheduler 是一个调度器,基于异步IO的库 AsyncIO。它允许你按照指定的时间表执行异步任务。 下面是实现 AsyncIOScheduler 的步骤,我将使用表格展示每个步骤以及需要做的事情。 1 导入必要的库2 创建异步函数3 创建调度器对象4 添加任务到调度器…...
二十三种设计模式全面解析-原型模式(Prototype Pattern)详解:创造对象的奇妙之道
在软件开发的世界中,创新和效率是永恒的追求。然而,频繁的对象实例化过程可能成为我们创新和效率的绊脚石。随着技术的不断进步,一种被广泛应用的设计模式——原型模式(Prototype Pattern)应运而生。通过克隆现有对象来…...
el-input 给icon图标绑定点击事件
选择suffix-icon,添加点击事件 <temeplate><el-form-item :label"$t(company[Company address])" prop"address"><el-input v-model"enterpriseForm.address"><i slot"suffix" class"el-icon-m…...
计算机网络——物理层
一、物理层的基本概念 (一)四大特征 机械特性 接口是怎样的 电器特性 用多少伏的电 功能特性 线路上电平电压的特性 过程特性 实现不同功能所发射的信号的顺序 (二)两种信号 (三)调制和编码 (…...
常用排序算法
目录 直接插入排序 希尔排序 编辑 选择排序 堆排序 冒泡排序 快速排序 hoare版 挖坑法 前后指针法 非递归 归并排序 非递归 计数排序 直接插入排序 直接插入排序跟依次模扑克牌一样,将最后一张牌依次与前面的牌比较,最后将牌插入到指定位…...
MGRE环境下的OSPF
实验拓扑 需求 1 R6为ISP只能配置IP地址,R1-R5的环回为私有网段 2 R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构,R1为中心站点 3 所有私有网段可以互相通讯,私有网段使用OSPF完成。 IP规划 配置IP R1 # interface GigabitEt…...
【计算机毕设】微信小程序案例-学生签到系统
前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 👉IT源码社-SpringBoot优质案例推荐👈 👉IT源码社-小程序优质案例…...
【数据分析】上市公司半年报数据分析
前言 前文介绍过使用网络技术获取上市公司半年报数据的方法,本文将对获取到的数据进行简要的数据分析。 获取数据的代码介绍在下面的两篇文章中 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 【java爬虫】公司半年报数据展示-CSDN博客 全量数…...
【C++初阶】类和对象——操作符重载const成员函数取地址重载日期类的实现
个人主页点击直达:小白不是程序媛 C系列专栏:C头疼记 目录 前言: 运算符重载 运算符重载 赋值运算符重载 前置和后置重载 const成员 取地址及const取地址操作符重载 使用函数操作符重载完成日期类的实现 前言: 上篇文…...
JAVA中的垃圾回收器(2)
一)G1垃圾回收器: 垃圾收集器迭代停顿时间越少越好,但是垃圾回收的总时间会增多,默认暂停时间默认是200ms 一)垃圾收集器介绍 1)G1垃圾回收器是一款面向服务器的垃圾收集器,主要针对的是配备多颗处理器以及大容量内存的机器,以极高…...
mac 安装homebrew ,golang
mac 安装homebrew ,golang 安装homebrew安装golang选择 apple arm 版本安装配置环境变量 安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"回车执行指令后,根据提示操作。具体包括以下提示操作&am…...
李沐——论文阅读——VIT(VIsionTransformer)
一、终极结论: 如果在足够多的数据上面去做预训练,那么,我们也可以不用 卷积神经网络,而是直接用 自然语言处理那边搬过来的 Transformer,也能够把视觉问题解决的很好 (tips:paperswithcode.co…...
uniapp表单验证
以下是一个简单的uniapp表单验证示例: <template><view class"uni-form"><view class"uni-form-item"><view class"uni-form-label">用户名</view><input type"text" v-model"user…...
Crawler4j实例爬取爱奇艺热播剧案例
前言 热播剧数据在戏剧娱乐产业中扮演着着名的角色。热了解播剧的观众喜好和趋势,对于制作方和广告商来说都具有重要的参考价值。然而,手动收集和整理这些数据是在本文中,我们将介绍如何利用 Python 爬虫技术和 Crawler4j 实例来自动化爬取爱…...
uniapp项目APP端安卓ios权限检测教程
导语:在 APP 的日常开发过程中,权限检测与授权是不可避免的一项重要的功能,下面就简单介绍一下如何检测和授权的方法。 目录 原理方法实战原理 此授权方法主要是依托于 HTML5 产业联盟的HTML5+规范实现的。 HTML5 产业联盟官网 获取当前操作系统名称 可以使用uni.getSys…...
java多进程间(父进程与子进程)通信
一般我们在java中运行其它类中的方法时,无论是静态调用,还是动态调用,都是在当前的进程中执行的,也就是说,只有一个java虚拟机实例在运行。而有的时候,我们需要通过java代码启动多个java子进程。这样做虽然…...
【从0到1设计一个网关】整合Nacos-服务注册与服务订阅的实现
文章目录 Nacos定义服务注册与订阅方法服务信息加载与配置实现将网关注册到注册中心实现服务的订阅 Nacos Nacos提供了许多强大的功能: 比如服务发现、健康检测。 Nacos支持基于DNS和基于RPC的服务发现。 同时Nacos提供对服务的实时的健康检查,阻止向不…...
【uniapp】短信验证码输入框
需求是短信验证码需要格子输入框 如图 网上找了一个案例改吧改吧 直接上代码 结构 <template><view class"verify-code"><!-- 输入框 --><input id"input" :value"code" class"input" :focus"isFocus"…...
Akagi技术深度解析:开源雀魂AI辅助工具完全实战指南
Akagi技术深度解析:开源雀魂AI辅助工具完全实战指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuk…...
告别教材下载烦恼:国家中小学智慧教育平台电子课本解析工具如何实现3分钟高效获取
告别教材下载烦恼:国家中小学智慧教育平台电子课本解析工具如何实现3分钟高效获取 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地…...
CryptoJS不同加密模式对比:AES-CBC vs GCM在前端安全中的选择指南
AES加密模式深度解析:CBC与GCM在前端安全中的实战抉择 前端开发者在处理用户敏感数据时,AES加密已成为标配技术方案。但在具体实施过程中,加密模式的选择往往成为决策难点——是选择经典的CBC模式,还是拥抱更现代的GCM模式&#x…...
从零到一:在Trae平台构建网页数据智能抓取与分析引擎
1. 为什么你需要一个网页数据智能抓取引擎? 每次看到同事手动复制网页数据到Excel,我都忍不住想递杯咖啡——这活儿太费时了!去年我帮市场部做竞品分析,发现他们每周要花8小时手工整理20个电商平台的价格数据。直到我们用Trae平台…...
企业微信考勤自动化解决方案:基于EasyWeChat的实战指南
企业微信考勤自动化解决方案:基于EasyWeChat的实战指南 【免费下载链接】easywechat 📦 一个 PHP 微信 SDK 项目地址: https://gitcode.com/gh_mirrors/ea/easywechat 在数字化办公普及的今天,企业考勤管理面临着数据采集繁琐、统计分…...
MSSQL03:SQLServer数据库中的高级语法及其技巧
目录 一、日期相关 1.查询当前日期相关数据 2.查询特定时间区间 3.时间加减法 (1)加法 (2)减法 4.格式化日期 二、数据类型转化 1.Int -> Decimal 2.DateTime->OtherTime 3.DateTime->string 三、条件判断相关…...
毕业查重不踩坑!Paperxie 免费查重,给毕业生的安心 buff
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/checkhttps://www.paperxie.cn/check 又是一年毕业季,当毕业论文的最后一个句号落下,查重就成了横亘在无数本科生面前的 “毕业拦路虎”。多少人熬了几…...
Mermaid Live Editor:重新定义图表创作的开源利器
Mermaid Live Editor:重新定义图表创作的开源利器 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...
天问Block环境下ASRPRO语音芯片实战:语音交互、GPIO控制与PWM调光开发指南
1. 天问Block与ASRPRO芯片开发入门 第一次接触天问Block和ASRPRO语音芯片时,我被它们的组合惊艳到了。这个开发环境就像乐高积木一样,通过拖拽代码块就能完成复杂的功能开发,特别适合像我这样的硬件爱好者。ASRPRO作为一款专为语音交互设计的…...
别再自己写驱动了!用STM32CubeMX HAL库5分钟搞定TM1637数码管显示
5分钟用STM32CubeMX HAL库驱动TM1637数码管:告别底层代码的终极方案 每次面对数码管驱动时,那些繁琐的GPIO初始化、时序控制和寄存器配置是否让你头疼不已?传统开发方式需要手动编写大量底层代码,不仅耗时耗力,还容易因…...
