开源推荐 高效的关键词替换和敏感词过滤工具

kevwan · 2020年08月19日 · 991 次阅读
本帖已被设为精华帖!

1. 算法介绍

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

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

2. 关键词替换

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

package main

import (
    "fmt"

    "github.com/tal-tech/go-zero/core/stringx"
)

func main() {
    replacer := stringx.NewReplacer(map[string]string{
        "日本":    "法国",
        "日本的首都": "东京",
        "东京":    "日本的首都",
    })
    fmt.Println(replacer.Replace("日本的首都是东京"))
}

可以得到:

东京是日本的首都

示例代码见这里

3. 查找敏感词

代码示例如下:

package main

import (
    "fmt"

    "github.com/tal-tech/go-zero/core/stringx"
)

func main() {
    filter := stringx.NewTrie([]string{
      "AV演员",
      "苍井空",
      "AV",
      "日本AV女优",
      "AV演员色情",
    })
    keywords := filter.FindKeywords("日本AV演员兼电视、电影演员。苍井空AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演")
    fmt.Println(keywords)
}

可以得到:

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

4. 敏感词过滤

代码示例如下:

package main

import (
    "fmt"

    "github.com/tal-tech/go-zero/core/stringx"
)

func main() {
    filter := stringx.NewTrie([]string{
        "AV演员",
        "苍井空",
        "AV",
        "日本AV女优",
        "AV演员色情",
    }, stringx.WithMask('?'))
    safe, keywords, found := filter.Filter("日本AV演员兼电视、电影演员。苍井空AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演")
    fmt.Println(safe)
    fmt.Println(keywords)
    fmt.Println(found)
}

可以得到:

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

示例代码见这里

5. Benchmark

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

6. 项目地址

https://github.com/tal-tech/go-zero

7. 微信交流群

wechat

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
kevin 将本帖设为了精华贴 08月20日 15:01
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册