背景介紹
直播系統(tǒng)主要是以內(nèi)容為主,好的內(nèi)容可以吸引用戶來(lái)欣賞,也能為公司帶來(lái)可觀的收益,既然有傳播的入口,那么必然有負(fù)面內(nèi)容的出現(xiàn),隨著平臺(tái)用戶量不斷擴(kuò)大,內(nèi)容的監(jiān)管也是必不可少的一個(gè)環(huán)節(jié),比如國(guó)家監(jiān)管部門要求攔截詞語(yǔ)包括涉政、非法、宗教、暴恐、版權(quán)等,以及平臺(tái)自身需要攔截的詞語(yǔ)包括競(jìng)品挖人、低俗、廣告等垃圾詞,那么我們本章就從文本內(nèi)容的管控角度介紹下花椒敏感詞服務(wù)的定制和應(yīng)用。
系統(tǒng)介紹
采用Go語(yǔ)言開(kāi)發(fā),基于開(kāi)源sego分詞服務(wù)進(jìn)行改造升級(jí),將花椒自維護(hù)的敏感詞庫(kù)以秒級(jí)別自動(dòng)加載,自動(dòng)分詞,實(shí)現(xiàn)服務(wù)內(nèi)置自動(dòng)熱更新詞庫(kù),分詞器算法為基于詞頻的最短路徑加動(dòng)態(tài)規(guī)劃,同時(shí)提供支持返回詞類型、詞屬性、命中狀態(tài)、命中詞,并為業(yè)務(wù)提供JSON RPC服務(wù),通過(guò)搭建集群化分詞檢測(cè)服務(wù)保證服務(wù)穩(wěn)定性,分詞檢測(cè)效率非常高,可彈性擴(kuò)展。
服務(wù)架構(gòu)設(shè)計(jì)

特性
- 基于開(kāi)源sego升級(jí)改造,定制針對(duì)花椒場(chǎng)景的使用
- 新增支持返回詞類型、詞屬性、命中狀態(tài)、命中詞列表(定制)
- 服務(wù)通用化,生成敏感詞文件和敏感詞檢測(cè)服務(wù)分離化,解耦
- 支持go-server內(nèi)置秒級(jí)自動(dòng)熱更新加載敏感詞文件,一條命令搞定(定制)
- 提供JSON RPC服務(wù)
- 多機(jī)房部署負(fù)載,易于彈性擴(kuò)展(定制)
敏感詞文件字典格式
不同的業(yè)務(wù)對(duì)敏感詞的定制不盡相同,以花椒為例,對(duì)敏感詞做了分類以及場(chǎng)景使用標(biāo)識(shí),格式如下:

- 每一列對(duì)應(yīng)含義:敏感詞、詞頻、詞屬性、詞類型
核心代碼
- 服務(wù)自動(dòng)熱重載
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"))
}
- 定制返回命中列表、命中類型、場(chǎng)景標(biāo)識(shí)等
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}
部署使用
- 基礎(chǔ)環(huán)境
- golang version 1.11.2
- 編譯
cd $project_dir && go build -o ./bin/segoserver *.go

- 啟動(dòng)服務(wù)
/bin/segoserver --port=8080 --dict=/tmp/segoserver-user-dict.txt --reloadInterval=30s
- 參數(shù)說(shuō)明
- port 指定敏感詞分詞檢測(cè)服務(wù)端口
- dict 指定要加在敏感詞文件的路徑
- reloadInterval 自動(dòng)熱重載文件時(shí)間間隔
- 敏感詞字典文件生成
- 可以另啟一個(gè)腳本刷新敏感詞字典文件到sego服務(wù)加載的路徑即可(/tmp/segoserver-user-dict.txt)
- 測(cè)試驗(yàn)證
~/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":"加微"}]}%
延伸介紹
- 場(chǎng)景應(yīng)用
- 以直播行業(yè)為例,一般對(duì)直播間彈幕,具備群發(fā)和被搜索看到的內(nèi)容情況,必須要接入敏感詞檢測(cè)
- 比較通用的接入場(chǎng)景,昵稱、簽名、評(píng)論、動(dòng)態(tài)文本等
- 以上再不同場(chǎng)景下的敏感詞控制是不一樣的,而且平臺(tái)政策可能隨時(shí)會(huì)變化,因此敏感詞一般都是快速上下線
- 效果
- 傳統(tǒng)的敏感詞檢測(cè)攔截做不到完全的攔截效果,一般對(duì)于漢子、數(shù)字、字母類的效果比較好
- 對(duì)特殊字符類的傳播和攔截效果不好,因此單靠敏感詞是無(wú)法完全杜絕垃圾內(nèi)容的傳播
- 敏感詞檢測(cè)一般作為第一道關(guān)卡,同時(shí)結(jié)合反垃圾智能模型對(duì)文本二次識(shí)別來(lái)打到攔截垃圾內(nèi)容的目的