本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.
直播系统主要是以内容为主,好的内容可以吸引用户来欣赏,也能为公司带来可观的收益,既然有传播的入口,那幺必然有负面内容的出现,随着平台用户量不断扩大,内容的监管也是必不可少的一个环节,比如国家监管部门要求拦截词语包括涉政、非法、宗教、暴恐、版权等,以及平台自身需要拦截的词语包括竞品挖人、低俗、广告等垃圾词,那幺我们本章就从文本内容的管控角度介绍下花椒敏感词服务的定制和应用。
系统介绍
采用GO语言开发,基于开源sego分词服务进行改造升级,将花椒自维护的敏感词库以秒级别自动加载,自动分词,实现服务内置自动热更新词库,分词器算法为基于词频的最短路径加动态规划,同时提供支持返回词类型、词属性、命中状态、命中词,并为业务提供JSON RPC服务,通过搭建集群化分词检测服务保证服务稳定性,分词检测效率非常高,可弹性扩展。
服务架构设计
特性
基于开源sego升级改造,定制针对花椒场景的使用
新增支持返回词类型、词属性、命中状态、命中词列表(定制)
服务通用化,生成敏感词文件和敏感词检测服务分离化,解耦
支持go-server内置秒级自动热更新加载敏感词文件,一条命令搞定(定制)
提供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 }
部署使用
基础环境
golang version 1.11.2
编译
cd $project_dir && go build -o ./bin/segoserver *.go
启动服务
/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":"加微"}]}%
Be First to Comment