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)
}

代码说明

  1. 首先导入必要的包,包括shamoji主库及其filter和tokenizer子包
  2. 使用sync.Once确保初始化只执行一次
  3. 创建分词器时使用了unicode的NFKC规范化形式
  4. 初始化shamoji服务时设置了分词器和敏感词过滤器
  5. 调用s.Do()方法执行敏感词检查,返回是否包含敏感词及匹配到的敏感词

输出结果

当运行上面的代码检查文本"我が生涯に一片の悔い無し"时,输出会是:

Result: true, Word: 悔い

因为文本中包含我们设置的敏感词"悔い"。

许可证

shamoji使用MIT许可证发布。


更多关于golang高效文本敏感词过滤插件库shamoji的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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)

性能优化建议

  1. 预加载敏感词库:在服务启动时初始化过滤器,避免每次请求都重新构建

  2. 使用单例模式

var (
	filterInstance *shamoji.Filter
	filterOnce     sync.Once
)

func GetFilter() *shamoji.Filter {
	filterOnce.Do(func() {
		words := []string{"敏感词1", "敏感词2"}
		filterInstance = shamoji.New(words)
	})
	return filterInstance
}
  1. 批量处理文本:如果需要处理大量文本,考虑使用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相比其他敏感词过滤库有以下优势:

  1. 基于DFA算法,查询时间复杂度为O(n)
  2. 内存占用低
  3. 完全用Go实现,无外部依赖
  4. 提供丰富的API(测试、替换、添加/删除词等)

注意事项

  1. 中文分词:shamoji对中文支持良好,但要注意一些变体或拆字形式的敏感词可能需要特殊处理

  2. 性能测试:在实际业务中建议进行性能测试,特别是敏感词数量很大时

  3. 敏感词库更新:可以考虑定时从数据库或文件重新加载敏感词库,实现热更新

shamoji是一个简单高效的敏感词过滤解决方案,适合大多数Go应用的文本过滤需求。

回到顶部