Go语言实现敏感词过滤与特殊字符处理

小满
小满
发布时间:2026-10-15 | 4人浏览过
原创

本文将介绍如何使用 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语言字符串处理的内容请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表