go实现敏感词过滤

go敏感词过滤

实现思路:

1.敏感词库加载

2.敏感词匹配

3.敏感词替换

敏感词库

这里使用的的是敏感词库

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

go 复制代码
//go:embed sensitive_words_lines.txt
var sensitiveWordsFile string

func 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

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

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

敏感词匹配和替换

go 复制代码
// 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 复制代码
//go:embed files/sensitive_words_lines.txt
var sensitiveWordsFile string

func 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)
}
相关推荐
码匠许师傅7 分钟前
【C++ 面试真题】聊聊 volatile 和 mutable
开发语言·c++·面试
xcLeigh14 分钟前
Go入门:短变量声明的陷阱与最佳实践
java·redis·golang·教程·变量
(Charon)16 分钟前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
liwulin050627 分钟前
【PYTHON】使用Selenium + ChromeDriver以及XPATH语法
开发语言·python·selenium
JavaPub-rodert30 分钟前
我又把自己的 Go 后台管理系统升级了一遍:文件管理、2GB 上传、私有文件预览、Docker 镜像全安排上了
开发语言·docker·golang·shiyuadmin
动力 continue36 分钟前
Python 元类与异常类:类的“制造工厂”与“报错定制师”
开发语言·python·制造
quantdash_cc36 分钟前
基于 QuantDash 5 分钟 K 线的网格交易策略参数网格搜索寻优实战
android·开发语言·pandas·量化·quantdash
雪隐39 分钟前
个人电脑玩AI-16让5060 Ti给你打工——MiniMax H3 提速实录:从"泡杯茶等视频"到"视频等你",一张 5060 Ti 的自我修养
前端·人工智能·后端
147API44 分钟前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
青 春 记 忆1 小时前
零基础入门python04:用注册校验理解字典、集合和条件判断
开发语言·vscode·python·python3.11