高效的關鍵詞替換和敏感詞過濾工具

kevwan發表於2020-08-19

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
更多原創文章乾貨分享,請關注公眾號
  • 高效的關鍵詞替換和敏感詞過濾工具
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章