<返回更多

花椒基于 Go 语言的敏感词系统架构讲解

2020-06-02    
加入收藏

背景介绍

直播系统主要是以内容为主,好的内容可以吸引用户来欣赏,也能为公司带来可观的收益,既然有传播的入口,那么必然有负面内容的出现,随着平台用户量不断扩大,内容的监管也是必不可少的一个环节,比如国家监管部门要求拦截词语包括涉政、非法、宗教、暴恐、版权等,以及平台自身需要拦截的词语包括竞品挖人、低俗、广告等垃圾词,那么我们本章就从文本内容的管控角度介绍下花椒敏感词服务的定制和应用。

系统介绍


采用Go语言开发,基于开源sego分词服务进行改造升级,将花椒自维护的敏感词库以秒级别自动加载,自动分词,实现服务内置自动热更新词库,分词器算法为基于词频的最短路径加动态规划,同时提供支持返回词类型、词属性、命中状态、命中词,并为业务提供JSON RPC服务,通过搭建集群化分词检测服务保证服务稳定性,分词检测效率非常高,可弹性扩展。

服务架构设计


花椒基于 Go 语言的敏感词系统架构讲解

 

特性


敏感词文件字典格式


不同的业务对敏感词的定制不尽相同,以花椒为例,对敏感词做了分类以及场景使用标识,格式如下:

花椒基于 Go 语言的敏感词系统架构讲解

 

核心代码

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}

部署使用


cd $project_dir && go build -o ./bin/segoserver  *.go
花椒基于 Go 语言的敏感词系统架构讲解

 

/bin/segoserver --port=8080 --dict=/tmp/segoserver-user-dict.txt --reloadInterval=30s
~/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":"加微"}]}%

延伸介绍


声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>