直播系统主要是以内容为主,好的内容可以吸引用户来欣赏,也能为公司带来可观的收益,既然有传播的入口,那么必然有负面内容的出现,随着平台用户量不断扩大,内容的监管也是必不可少的一个环节,比如国家监管部门要求拦截词语包括涉政、非法、宗教、暴恐、版权等,以及平台自身需要拦截的词语包括竞品挖人、低俗、广告等垃圾词,那么我们本章就从文本内容的管控角度介绍下花椒敏感词服务的定制和应用。
采用Go语言开发,基于开源sego分词服务进行改造升级,将花椒自维护的敏感词库以秒级别自动加载,自动分词,实现服务内置自动热更新词库,分词器算法为基于词频的最短路径加动态规划,同时提供支持返回词类型、词属性、命中状态、命中词,并为业务提供JSON RPC服务,通过搭建集群化分词检测服务保证服务稳定性,分词检测效率非常高,可弹性扩展。
不同的业务对敏感词的定制不尽相同,以花椒为例,对敏感词做了分类以及场景使用标识,格式如下:
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
/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":"加微"}]}%