go-zero/doc/keywords.md

87 lines
2.1 KiB
Markdown
Raw Normal View History

2020-08-19 17:58:57 +08:00
# 高效的关键词替换和敏感词过滤工具
## 1. 算法介绍
利用高效的Trie树建立关键词树如下图所示然后依次查找字符串中的相连字符是否形成树的一条路径
2020-08-19 18:19:38 +08:00
<img src="images/trie.png" alt="trie" width="350" />
2020-08-19 17:58:57 +08:00
发现掘金上[这篇文章](https://juejin.im/post/6844903750490914829)写的比较详细,可以一读,具体原理在此不详述。
## 2. 关键词替换
2020-08-19 22:34:54 +08:00
支持关键词重叠,自动选用最长的关键词,代码示例如下:
2020-08-19 17:58:57 +08:00
```go
2020-08-19 18:09:03 +08:00
replacer := stringx.NewReplacer(map[string]string{
2020-08-19 22:34:54 +08:00
"日本": "法国",
"日本的首都": "东京",
"东京": "日本的首都",
2020-08-19 18:09:03 +08:00
})
2020-08-19 22:34:54 +08:00
fmt.Println(replacer.Replace("日本的首都是东京"))
2020-08-19 17:58:57 +08:00
```
可以得到:
```Plain Text
2020-08-19 22:34:54 +08:00
东京是日本的首都
2020-08-19 17:58:57 +08:00
```
示例代码见`example/stringx/replace/replace.go`
2020-08-19 18:22:41 +08:00
## 3. 查找敏感词
2020-08-19 17:58:57 +08:00
2020-08-19 22:34:54 +08:00
代码示例如下:
2020-08-19 17:58:57 +08:00
```go
2020-08-19 18:09:03 +08:00
filter := stringx.NewTrie([]string{
"AV演员",
"苍井空",
"AV",
"日本AV女优",
"AV演员色情",
2020-08-19 18:22:41 +08:00
})
keywords := filter.FindKeywords("日本AV演员兼电视、电影演员。苍井空AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演")
fmt.Println(keywords)
```
可以得到:
```Plain Text
2020-08-19 18:22:41 +08:00
[苍井空 日本AV女优 AV演员色情 AV AV演员]
```
## 4. 敏感词过滤
2020-08-19 22:34:54 +08:00
代码示例如下:
2020-08-19 18:22:41 +08:00
```go
filter := stringx.NewTrie([]string{
"AV演员",
"苍井空",
"AV",
"日本AV女优",
"AV演员色情",
}, stringx.WithMask('?')) // 默认替换为*
2020-08-19 18:09:03 +08:00
safe, keywords, found := filter.Filter("日本AV演员兼电视、电影演员。苍井空AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演")
fmt.Println(safe)
fmt.Println(keywords)
fmt.Println(found)
2020-08-19 17:58:57 +08:00
```
可以得到:
```Plain Text
2020-08-19 17:58:57 +08:00
日本????兼电视、电影演员。?????女优是xx出道, ??????们最精彩的表演是??????表演
[苍井空 日本AV女优 AV演员色情 AV AV演员]
true
```
示例代码见`example/stringx/filter/filter.go`
2020-08-19 18:22:41 +08:00
## 5. Benchmark
2020-08-19 17:58:57 +08:00
2020-08-19 18:23:37 +08:00
| Sentences | Keywords | Regex | go-zero |
| --------- | -------- | -------- | ------- |
| 10000 | 10000 | 16min10s | 27.2ms |