V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
kevinwan
V2EX  ›  Go 编程语言

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

  •  4
     
  •   kevinwan · 2020-08-31 21:08:00 +08:00 · 3481 次点击
    这是一个创建于 1327 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    benchmark

    6. 项目地址

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

    7. 微信交流群

    微信交流群

    20 条回复    2020-09-04 15:24:34 +08:00
    sarvatathagata
        1
    sarvatathagata  
       2020-08-31 22:26:23 +08:00
    AC 自动机了解一下?
    dingyaguang117
        2
    dingyaguang117  
       2020-09-01 09:15:10 +08:00
    嗯嗯 再加上 fail 指针就是 AC 自动机了!

    https://github.com/dingyaguang117/ACAutomation
    a7217107
        3
    a7217107  
       2020-09-01 09:23:16 +08:00
    DFA?
    kevinwan
        4
    kevinwan  
    OP
       2020-09-02 22:56:09 +08:00
    @sarvatathagata she/sheng/her 这三个关键词都要找出来,你用 AC 自动机怎么走?不是匹配最长的,是要把所有的关键字都找出来
    sarvatathagata
        5
    sarvatathagata  
       2020-09-03 20:59:52 +08:00
    @kevinwan Fail 树了解一下
    zhoushuguangking
        6
    zhoushuguangking  
       2020-09-04 09:37:09 +08:00
    不错的算法
    KesonAn
        7
    KesonAn  
       2020-09-04 09:41:43 +08:00
    有了 go-zero 这个库,微服务、关键字过滤不在话下
    zhoushuguangking
        8
    zhoushuguangking  
       2020-09-04 09:45:19 +08:00
    自研敏感词过滤成本还是比较高的
    KesonAn
        9
    KesonAn  
       2020-09-04 09:48:15 +08:00
    @zhoushuguangking 有 @kevinwan 大佬在,不要怕,就是干
    KesonAn
        10
    KesonAn  
       2020-09-04 09:50:31 +08:00
    👍👍👍👍
    kingxt
        11
    kingxt  
       2020-09-04 10:29:05 +08:00
    👍👍👍👍
    zhoushuguangking
        12
    zhoushuguangking  
       2020-09-04 10:29:31 +08:00
    go-zreo 是个很不错的微服务框架
    zhoushuguangking
        13
    zhoushuguangking  
       2020-09-04 10:29:53 +08:00
    看了下 go-zero 源码挺不错的,追求极简
    zhoushuguangking
        14
    zhoushuguangking  
       2020-09-04 10:30:17 +08:00
    工具大于文档和约定
    KesonAn
        15
    KesonAn  
       2020-09-04 10:30:24 +08:00
    更多干货尽在 core 包中
    zhoushuguangking
        16
    zhoushuguangking  
       2020-09-04 13:14:03 +08:00
    每天都学习下新的知识
    KesonAn
        17
    KesonAn  
       2020-09-04 13:19:21 +08:00
    👍👍👍👍
    dylanre
        18
    dylanre  
       2020-09-04 13:19:56 +08:00
    @dingyaguang117 这个看起来也不错哦。
    zhoushuguangking
        19
    zhoushuguangking  
       2020-09-04 13:20:35 +08:00
    👍👍👍👍
    bittoy
        20
    bittoy  
       2020-09-04 15:24:34 +08:00
    解决了关键字过滤的痛点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2760 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 128ms · UTC 13:23 · PVG 21:23 · LAX 06:23 · JFK 09:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.