Go语言实现敏感词过滤与特殊字符处理
本文将介绍如何使用 Golang 编写一个敏感词过滤工具,主要用于检测用户昵称等文本中是否存在敏感内容,并提供剔除特殊转移字符的功能。
实现原理与准备
该工具的核心逻辑是将敏感词库加载到内存 Map 中,随后对输入的文本(如昵称)进行逐字扫描,检查其所有子串是否命中敏感词库。这种方式实现简单,但需要注意时间复杂度约为 O(len(name)^2),适用于对性能要求不极度苛刻的短文本场景。
你可以参考开源项目 fwwdn/sensitive-stop-words 获取常用的敏感词列表。
第1步:定义过滤器结构体
首先定义一个 filter 结构体,用于存储待处理的文本数据以及设定的最大长度限制,以防止超长输入导致性能问题或内存溢出。
package util
import (
"github.com/pkg/errors"
"strings"
)
type filter struct {
data string
maxLimitLen int
}第2步:初始化并校验长度
通过 NewKeywordFilter 构造函数创建实例。在此阶段,程序会检查传入字符串的长度,如果超过预设的最大限制 maxLimitLen,则直接返回错误。
func NewKeywordFilter(str string, maxLimitLen int) (*filter, error) {
if len(str) > maxLimitLen {
return nil, errors.Errorf("长度:%d,不能超过:%d", len(str), maxLimitLen)
}
return &filter{
data: str,
maxLimitLen: maxLimitLen,
}, nil
}
第3步:执行敏感词检测
FilterKeywords 方法接收一个布尔类型 Map keywords map[string]bool。程序会通过双重循环遍历当前文本 f.data 的所有可能子串,并在 Map 中进行查找。一旦发现匹配项,即判定为违规。
func (f *filter) FilterKeywords(keywords map[string]bool) (err error) {
if keywords == nil {
return
}
for i := 0; i < len(f.data); i++ {
for j := i + 1; j <= len(f.data); j++ {
subStr := f.data[i:j]
if _, found := keywords[subStr]; found {
err = errors.Errorf("昵称违规,建议修改")
}
}
}
return
}
第4步:剔除特殊转移字符
用户昵称中常包含空格、Emoji 或其他不可见字符。为了确保检测准确,可以先调用 TrimAllCharset 移除这些干扰字符。如果处理后文本为空,则提示错误。
func (f *filter) TrimAllCharset(ch []string) (err error) {
if ch == nil {
return
}
for _, c := range ch {
f.data = strings.Replace(f.data, c, "", -1)
}
if len(f.data) == 0 {
err = errors.New("剔除相关转移字符后,数据长度为0.")
return
}
return
}
以上就是Go语言敏感词过滤的实现详细内容,更多关于Go语言字符串处理的内容请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









