高效的关键词替换和敏感词过滤工具

1. 算法介绍

利用高效的Trie树建立关键词树,如下图所示,然后依次查找字符串中的相连字符是否形成树的一条路径

trie

发现掘金上这篇文章写的比较详细,可以一读,具体原理在此不详述。

2. 关键词替换

支持关键词重叠,自动选用最长的关键词,代码示例如下:

  1. replacer := stringx.NewReplacer(map[string]string{
  2. "日本": "法国",
  3. "日本的首都": "东京",
  4. "东京": "日本的首都",
  5. })
  6. fmt.Println(replacer.Replace("日本的首都是东京"))

可以得到:

```Plain Text 东京是日本的首都

  1. 示例代码见`stringx/replace/replace.go`
  2. ## 3. 查找敏感词
  3. 代码示例如下:
  4. ```go
  5. filter := stringx.NewTrie([]string{
  6. "AV演员",
  7. "苍井空",
  8. "AV",
  9. "日本AV女优",
  10. "AV演员色情",
  11. })
  12. keywords := filter.FindKeywords("日本AV演员兼电视、电影演员。苍井空AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演")
  13. fmt.Println(keywords)

可以得到:

```Plain Text [苍井空 日本AV女优 AV演员色情 AV AV演员]

  1. ## 4. 敏感词过滤
  2. 代码示例如下:
  3. ```go
  4. filter := stringx.NewTrie([]string{
  5. "AV演员",
  6. "苍井空",
  7. "AV",
  8. "日本AV女优",
  9. "AV演员色情",
  10. }, stringx.WithMask('?')) // 默认替换为*
  11. safe, keywords, found := filter.Filter("日本AV演员兼电视、电影演员。苍井空AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演")
  12. fmt.Println(safe)
  13. fmt.Println(keywords)
  14. fmt.Println(found)

可以得到:

Plain Text 日本????兼电视、电影演员。?????女优是xx出道, ??????们最精彩的表演是??????表演 [苍井空 日本AV女优 AV演员色情 AV AV演员] true

示例代码见stringx/filter/filter.go

5. Benchmark

Sentences Keywords Regex go-zero
10000 10000 16min10s 27.2ms