背景介绍
直播系统主要是以内容为主,好的内容可以吸引用户来欣赏,也能为公司带来可观的收益,既然有传播的入口,那么必然有负面内容的出现,随着平台用户量不断扩大,内容的监管也是必不可少的一个环节,比如国家监管部门要求拦截词语包括涉政、非法、宗教、暴恐、版权等,以及平台自身需要拦截的词语包括竞品挖人、低俗、广告等垃圾词,那么我们本章就从文本内容的管控角度介绍下花椒敏感词服务的定制和应用。
系统介绍
采用GO语言开发,基于开源sego分词服务进行改造升级,将花椒自维护的敏感词库以秒级别自动加载,自动分词,实现服务内置自动热更新词库,分词器算法为基于词频的最短路径加动态规划,同时提供支持返回词类型、词属性、命中状态、命中词,并为业务提供JSON RPC服务,通过搭建集群化分词检测服务保证服务稳定性,分词检测效率非常高,可弹性扩展。
服务架构设计
![fd88d7a8-4c1b-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/fd88d7a8-4c1b-eb11-8da9-e4434bdf6706.png)
特性
- 基于开源sego升级改造,定制针对花椒场景的使用
- 新增支持返回词类型、词属性、命中状态、命中词列表(定制)
- 服务通用化,生成敏感词文件和敏感词检测服务分离化,解耦
- 支持go-server内置秒级自动热更新加载敏感词文件,一条命令搞定(定制)
- 提供JSON RPC服务
- 多机房部署负载,易于弹性扩展(定制)
敏感词文件字典格式
不同的业务对敏感词的定制不尽相同,以花椒为例,对敏感词做了分类以及场景使用标识,格式如下:
![ff88d7a8-4c1b-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/ff88d7a8-4c1b-eb11-8da9-e4434bdf6706.png)
- 每一列对应含义:敏感词、词频、词属性、词类型
核心代码
- 服务自动热重载
func init() {
flag.Parse()
c := cron.New()
_ = c.AddFunc("@every "+*reloadInterval, reloadDict)
c.Start()
}
func reloadDict() {
logToFile(logFile, "reload "+ fmt.Sprintf("%d", *port) +" start interval : "+*reloadInterval+" "+time.Now().Format("2006/01/02 15:04:05"))
segmenter.LoadDictionary(*dict)
logToFile(logFile, "reload "+ fmt.Sprintf("%d", *port) +" end :"+*reloadInterval+" "+time.Now().Format("2006/01/02 15:04:05"))
}
- 定制返回命中列表、命中类型、场景标识等
func HitFilter(text string, words []map[string]string) (map[string][]string, bool) {
hitMap := make(map[string][]string)
length := len(words)
hit := false
for i := length - 1; i >= 0; i-- {
tmpMap := strings.Split(words[i]["Pos"], "|")
for j := 0; j len(tmpMap); j++ {
hitMap[tmpMap[j]] = append(hitMap[tmpMap[j]], words[i]["Text"])
}
}
if len(hitMap) > 0 {
hit = true
}
return hitMap, hit
}
部署使用
- 基础环境
- golang version 1.11.2
- 编译
cd $project_dir && go build -o ./bin/segoserver *.go
![0089d7a8-4c1b-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/0089d7a8-4c1b-eb11-8da9-e4434bdf6706.png)
- 启动服务
/bin/segoserver --port=8080 --dict=/tmp/segoserver-user-dict.txt --reloadInterval=30s
- 参数说明
- port 指定敏感词分词检测服务端口
- dict 指定要加在敏感词文件的路径
- reloadInterval 自动热重载文件时间间隔
- 敏感词字典文件生成
- 可以另启一个脚本刷新敏感词字典文件到sego服务加载的路径即可(/tmp/segoserver-user-dict.txt)
- 测试验证
~/huajiao_sego/ » curl -i http://1270.0.01:8080/json\?text\=加微
HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 25 Mar 2020 03:25:31 GMT
Content-Length: 142
{"Hit":true,"HitMap":{"3":["加微"],"4":["加微"],"5":["加微"],"6":["加微"]},"Segment":[{"Newtyp":"2","Pos":"3|4|5|6","Text":"加微"}]}%
延伸介绍
- 场景应用
- 以直播行业为例,一般对直播间弹幕,具备群发和被搜索看到的内容情况,必须要接入敏感词检测
- 比较通用的接入场景,昵称、签名、评论、动态文本等
- 以上再不同场景下的敏感词控制是不一样的,而且平台政策可能随时会变化,因此敏感词一般都是快速上下线
- 效果
- 传统的敏感词检测拦截做不到完全的拦截效果,一般对于汉子、数字、字母类的效果比较好
- 对特殊字符类的传播和拦截效果不好,因此单靠敏感词是无法完全杜绝垃圾内容的传播
- 敏感词检测一般作为第一道关卡,同时结合反垃圾智能模型对文本二次识别来打到拦截垃圾内容的目的
推荐阅读
花椒服务端4个开源项目介绍
喜欢本文的朋友,欢迎关注“Go语言中文网”:
Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎