敏感词过滤--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"…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
