golang高效文本敏感词过滤插件库shamoji的使用
golang高效文本敏感词过滤插件库shamoji的使用
关于shamoji
shamoji是一个高效的文本敏感词过滤库。
安装
$ go get github.com/osamingo/shamoji@latest
使用示例
下面是一个完整的shamoji使用示例代码:
package main
import (
"fmt"
"sync"
"github.com/osamingo/shamoji"
"github.com/osamingo/shamoji/filter"
"github.com/osamingo/shamoji/tokenizer"
"golang.org/x/text/unicode/norm"
)
var (
o sync.Once
s *shamoji.Serve
)
func main() {
// 检查文本中是否包含敏感词
yes, word := Contains("我が生涯に一片の悔い無し")
fmt.Printf("Result: %v, Word: %s", yes, word)
}
func Contains(sentence string) (bool, string) {
// 使用sync.Once确保初始化只执行一次
o.Do(func() {
// 创建分词器,使用NFKC规范化形式
tok, err := tokenizer.NewKagomeTokenizer(norm.NFKC)
if err != nil {
panic(err)
}
// 初始化shamoji服务
s = &shamoji.Serve{
Tokenizer: tok, // 设置分词器
Filer: filter.NewCuckooFilter("涯に", "悔い"), // 设置敏感词过滤器,这里添加了两个敏感词
}
})
// 执行敏感词检查
return s.Do(sentence)
}
代码说明
- 首先导入必要的包,包括shamoji主库及其filter和tokenizer子包
- 使用sync.Once确保初始化只执行一次
- 创建分词器时使用了unicode的NFKC规范化形式
- 初始化shamoji服务时设置了分词器和敏感词过滤器
- 调用s.Do()方法执行敏感词检查,返回是否包含敏感词及匹配到的敏感词
输出结果
当运行上面的代码检查文本"我が生涯に一片の悔い無し"时,输出会是:
Result: true, Word: 悔い
因为文本中包含我们设置的敏感词"悔い"。
许可证
shamoji使用MIT许可证发布。
更多关于golang高效文本敏感词过滤插件库shamoji的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高效文本敏感词过滤插件库shamoji的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用shamoji进行高效文本敏感词过滤
shamoji是一个高效的Golang敏感词过滤库,基于DFA(Deterministic Finite Automaton)算法实现,具有高性能和低内存占用的特点。下面我将详细介绍如何使用shamoji。
安装shamoji
首先使用go get安装shamoji:
go get github.com/rocketlaunchr/shamoji
基本使用方法
1. 创建过滤器实例
package main
import (
"fmt"
"github.com/rocketlaunchr/shamoji"
)
func main() {
// 初始化敏感词列表
words := []string{"敏感词1", "敏感词2", "badword"}
// 创建过滤器
filter := shamoji.New(words)
// 检查文本是否包含敏感词
text := "这是一段包含badword的文本"
if filter.Test(text) {
fmt.Println("文本包含敏感词")
} else {
fmt.Println("文本安全")
}
}
2. 替换敏感词
// 将敏感词替换为指定字符
filteredText := filter.Replace(text, '*')
fmt.Println(filteredText) // 输出: 这是一段包含*******的文本
// 自定义替换函数
filteredText = filter.ReplaceFunc(text, func(word string) string {
return "<censored>"
})
fmt.Println(filteredText) // 输出: 这是一段包含<censored>的文本
高级功能
1. 添加/删除敏感词
// 添加新敏感词
filter.Add("newbadword")
// 删除敏感词
filter.Remove("badword")
2. 并发安全使用
shamoji的Filter结构体是并发安全的,可以在多个goroutine中安全使用:
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
if filter.Test(text) {
// 处理敏感词
}
}()
}
wg.Wait()
3. 从文件加载敏感词
func loadWordsFromFile(path string) ([]string, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
var words []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
words = append(words, scanner.Text())
}
return words, scanner.Err()
}
words, err := loadWordsFromFile("sensitive_words.txt")
if err != nil {
log.Fatal(err)
}
filter := shamoji.New(words)
性能优化建议
-
预加载敏感词库:在服务启动时初始化过滤器,避免每次请求都重新构建
-
使用单例模式:
var (
filterInstance *shamoji.Filter
filterOnce sync.Once
)
func GetFilter() *shamoji.Filter {
filterOnce.Do(func() {
words := []string{"敏感词1", "敏感词2"}
filterInstance = shamoji.New(words)
})
return filterInstance
}
- 批量处理文本:如果需要处理大量文本,考虑使用worker pool模式
实际应用示例
package main
import (
"fmt"
"net/http"
"github.com/rocketlaunchr/shamoji"
)
var filter *shamoji.Filter
func init() {
// 初始化敏感词库
words := []string{"暴力", "色情", "政治敏感"}
filter = shamoji.New(words)
}
func commentHandler(w http.ResponseWriter, r *http.Request) {
comment := r.FormValue("comment")
if filter.Test(comment) {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "评论包含敏感内容")
return
}
// 处理合法评论
fmt.Fprintf(w, "评论发布成功")
}
func main() {
http.HandleFunc("/comment", commentHandler)
http.ListenAndServe(":8080", nil)
}
与其他库的比较
shamoji相比其他敏感词过滤库有以下优势:
- 基于DFA算法,查询时间复杂度为O(n)
- 内存占用低
- 完全用Go实现,无外部依赖
- 提供丰富的API(测试、替换、添加/删除词等)
注意事项
-
中文分词:shamoji对中文支持良好,但要注意一些变体或拆字形式的敏感词可能需要特殊处理
-
性能测试:在实际业务中建议进行性能测试,特别是敏感词数量很大时
-
敏感词库更新:可以考虑定时从数据库或文件重新加载敏感词库,实现热更新
shamoji是一个简单高效的敏感词过滤解决方案,适合大多数Go应用的文本过滤需求。