go实现敏感词过滤

devtools/2025/2/28 18:47:46/

go敏感词过滤

实现思路:

1.敏感词库加载

2.敏感词匹配

3.敏感词替换

敏感词库

这里使用的的是敏感词库

下载后将敏感词处理成一个字符串切片加载到内存中

//go:embed sensitive_words_lines.txt
var sensitiveWordsFile stringfunc InitSensitiveWords() (sensitiveWords []string) {scanner := bufio.NewScanner(strings.NewReader(sensitiveWordsFile))for scanner.Scan() {line := scanner.Text()sensitiveWords = append(sensitiveWords, line)}logrus.Info("SensitiveWords加载成功")return
}

敏感词匹配

我选择使用的是AhoCorasick算法进行匹配

算法简介:

​ Aho-Corasick算法是一种多模式字符串匹配算法,由Alfred V. Aho和Margaret J. Corasick在1975年提出。该算法旨在有效地在一个文本串中同时搜索多个模式串。它通过构建一个有限状态机(实际上是一个特殊的前缀树或Trie)来实现高效的搜索过程,这个状态机能够一次性处理所有模式串的搜索请求。

算法原理

  1. 构建Trie树:首先将所有的模式串插入到一个Trie树(也称作字典树)中。每个节点代表一个字符,从根节点开始,沿着路径向下可以找到对应的模式串。
  2. 添加失败指针:接下来为Trie树中的每个节点计算“失败指针”(failure link)。失败指针的作用类似于KMP算法中的部分匹配表,用于当当前字符不匹配时跳转到另一个可能的匹配位置。具体来说,对于某个节点n,如果从根到n表示的字符串是s,那么n的失败指针指向的是最长的、既是s的一个后缀又是某个模式串前缀的字符串所对应的节点。这一步骤确保了在搜索过程中遇到不匹配字符时,算法能够快速地重新尝试匹配而不需要回溯。
  3. 模式匹配:使用构建好的自动机对目标文本进行扫描。从根节点开始,根据当前读取的字符移动到下一个节点;如果不存在对应边,则跟随失败指针直到找到一个存在对应边的节点或者回到根节点。每当到达一个终止节点(即表示一个完整模式串的节点),就报告一次匹配。

特点与优势

  • 高效性:Aho-Corasick算法的时间复杂度为O(n + m + z),其中n是文本长度,m是所有模式串的总长度,z是输出结果的数量。这种效率使得它非常适合需要在大量文本中查找多个关键字的应用场景。
  • 一次性处理多个模式串:相比于逐一应用单模式匹配算法(如KMP),Aho-Corasick算法只需遍历文本一次即可完成所有模式串的匹配工作。
  • 广泛的应用领域:包括但不限于文本编辑器中的查找功能、网络入侵检测系统(NIDS)、生物信息学中的DNA序列分析等。

第三方AhoCorasick库

https://github.com/cloudflare/ahocorasick

使用时需要预先加载词库到算法中

func InitAhoCorasick() (ahoCorasick *ahocorasick.Matcher) {ahoCorasick = ahocorasick.NewStringMatcher(global.SensitiveWords)logrus.Info("敏感词匹配AhoCorasick加载成功")return
}

敏感词匹配和替换

// ReplaceSensitiveWords 替换敏感词
func ReplaceSensitiveWords(text string, replaceWord string) string {// 将匹配位置转换为区间//hits := ahocorasick.NewStringMatcher(global_gse.SensitiveWords).Match([]byte(text))hits := AhoCorasick.Match([]byte(text))for _, val := range hits {oldReplaceWord := global.SensitiveWords[val]text = strings.Replace(text, oldReplaceWord, strings.Repeat(replaceWord, len([]rune(oldReplaceWord))), -1)}return text
}
//使用
text = ReplaceSensitiveWords(text, "*")

完整代码

//go:embed files/sensitive_words_lines.txt
var sensitiveWordsFile stringfunc InitSensitiveWords() (sensitiveWords []string) {scanner := bufio.NewScanner(strings.NewReader(sensitiveWordsFile))for scanner.Scan() {line := scanner.Text()sensitiveWords = append(sensitiveWords, line)}logrus.Info("SensitiveWords加载成功")return
}func InitAhoCorasick() (ahoCorasick *ahocorasick.Matcher) {ahoCorasick = ahocorasick.NewStringMatcher(global.SensitiveWords)logrus.Info("敏感词匹配AhoCorasick加载成功")return
}// ReplaceSensitiveWords 替换敏感词
func ReplaceSensitiveWords(text string, replaceWord string) string {// 将匹配位置转换为区间//hits := ahocorasick.NewStringMatcher(global_gse.SensitiveWords).Match([]byte(text))hits := AhoCorasick.Match([]byte(text))for _, val := range hits {oldReplaceWord := SensitiveWords[val]text = strings.Replace(text, oldReplaceWord, strings.Repeat(replaceWord, len([]rune(oldReplaceWord))), -1)}return text
}func main(){text:="xxx"SensitiveWords:=InitSensitiveWords()AhoCorasick:=InitAhoCorasick()text:ReplaceSensitiveWords(text,"*")fmt.Println(text)
}

http://www.ppmy.cn/devtools/163418.html

相关文章

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO,每个GPIO用于管理多个芯片进行输入,输出工作 引脚电平 0v ~3.3v,部分引脚可容任5v 输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议&a…

RFID测温技术:为生产安全与稳定保驾护航

在科技浪潮汹涌澎湃的当下,工业生产对于安全性和稳定性的追求达到了全新高度。各类保障生产安全的技术百花齐放,而RFID测温技术凭借其独树一帜的特性,在其中崭露头角,如同一位坚毅可靠的守护者,全方位筑牢生产安全的坚…

倚光科技:助力玻璃非球面的打样与小批量生产

在现代光学和精密制造领域,非球面光学元件凭借其卓越的光学性能,已成为推动高端科技发展的核心组件。相比于传统的球面透镜,非球面透镜能够显著减少光学系统中的像差和畸变,大幅提升成像质量、系统紧凑性和能量利用率。因此&#…

CSS 媒体查询:从入门到精通,打造跨设备完美体验

在当今移动互联网时代,用户访问网站的设备早已不再局限于桌面电脑,手机、平板等各种屏幕尺寸的设备层出不穷。为了确保用户在不同设备上都能获得良好的浏览体验,响应式网页设计应运而生。而 CSS 媒体查询,正是实现响应式设计的核心…

【图文详解】论文《Attention Is All You Need》的Encoder和Decoder的流程

文章目录 前言一、Transformer总体结构二、Encoder(编码器)流程三、Decoder(解码器)流程四、Decoder 中两个多头注意力机制区别五、QKV 计算方式六、总结 前言 亲爱的家人们,创作很不容易,若对您有帮助的话…

MATLAB基础学习相关知识

MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…

Linux中Vim编辑器日常使用

一,Vim编辑器的配置 CtrlAltT打开终端输入命令 cd /etc/vim输入命令 ls 会出现vimrc vimrc.tiny的配置文件输入命令 cp vimrc ~/.vimrc 复制文件输入命令 ls -l ~/.vimrc 进行查看(会出现:-rw-r--r-- 1 wqp wqp 2266 Feb 26 17:00 /home/wqp…

HDFS扩缩容及数据迁移

1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理,决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…