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

2020-08-31 21:08:00 +08:00
 kevinwan

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

6. 项目地址

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

7. 微信交流群

3650 次点击
所在节点    Go 编程语言
20 条回复
sarvatathagata
2020-08-31 22:26:23 +08:00
AC 自动机了解一下?
dingyaguang117
2020-09-01 09:15:10 +08:00
嗯嗯 再加上 fail 指针就是 AC 自动机了!

https://github.com/dingyaguang117/ACAutomation
a7217107
2020-09-01 09:23:16 +08:00
DFA?
kevinwan
2020-09-02 22:56:09 +08:00
@sarvatathagata she/sheng/her 这三个关键词都要找出来,你用 AC 自动机怎么走?不是匹配最长的,是要把所有的关键字都找出来
sarvatathagata
2020-09-03 20:59:52 +08:00
@kevinwan Fail 树了解一下
zhoushuguangking
2020-09-04 09:37:09 +08:00
不错的算法
KesonAn
2020-09-04 09:41:43 +08:00
有了 go-zero 这个库,微服务、关键字过滤不在话下
zhoushuguangking
2020-09-04 09:45:19 +08:00
自研敏感词过滤成本还是比较高的
KesonAn
2020-09-04 09:48:15 +08:00
@zhoushuguangking 有 @kevinwan 大佬在,不要怕,就是干
KesonAn
2020-09-04 09:50:31 +08:00
👍👍👍👍
kingxt
2020-09-04 10:29:05 +08:00
👍👍👍👍
zhoushuguangking
2020-09-04 10:29:31 +08:00
go-zreo 是个很不错的微服务框架
zhoushuguangking
2020-09-04 10:29:53 +08:00
看了下 go-zero 源码挺不错的,追求极简
zhoushuguangking
2020-09-04 10:30:17 +08:00
工具大于文档和约定
KesonAn
2020-09-04 10:30:24 +08:00
更多干货尽在 core 包中
zhoushuguangking
2020-09-04 13:14:03 +08:00
每天都学习下新的知识
KesonAn
2020-09-04 13:19:21 +08:00
👍👍👍👍
dylanre
2020-09-04 13:19:56 +08:00
@dingyaguang117 这个看起来也不错哦。
zhoushuguangking
2020-09-04 13:20:35 +08:00
👍👍👍👍
bittoy
2020-09-04 15:24:34 +08:00
解决了关键字过滤的痛点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702937

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX