背景介紹
直播系統主要是以內容為主,好的內容可以吸引用戶來欣賞,也能為公司帶來可觀的收益,既然有傳播的入口,那么必然有負面內容的出現,隨著平臺用戶量不斷擴大,內容的監管也是必不可少的一個環節,比如國家監管部門要求攔截詞語包括涉政、非法、宗教、暴恐、版權等,以及平臺自身需要攔截的詞語包括競品挖人、低俗、廣告等垃圾詞,那么我們本章就從文本內容的管控角度介紹下花椒敏感詞服務的定制和應用。
系統介紹
采用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":"加微"}]}%
延伸介紹
- 場景應用
- 以直播行業為例,一般對直播間彈幕,具備群發和被搜索看到的內容情況,必須要接入敏感詞檢測
- 比較通用的接入場景,昵稱、簽名、評論、動態文本等
- 以上再不同場景下的敏感詞控制是不一樣的,而且平臺政策可能隨時會變化,因此敏感詞一般都是快速上下線
- 效果
- 傳統的敏感詞檢測攔截做不到完全的攔截效果,一般對于漢子、數字、字母類的效果比較好
- 對特殊字符類的傳播和攔截效果不好,因此單靠敏感詞是無法完全杜絕垃圾內容的傳播
- 敏感詞檢測一般作為第一道關卡,同時結合反垃圾智能模型對文本二次識別來打到攔截垃圾內容的目的