利用函數計算實現網路遊戲或視頻直播中的敏感詞檢測

摘要: 目前,網路遊戲和視頻直播都是很火爆的產業,然而,無論在多人在線網路遊戲(MMORPG)中,還是在遊戲視頻直播或者其他直播中(彈幕),玩家或者用戶的在線交流和互動都是它們的核心樂趣所在,但是玩家之間的交流和互動不可避免地會涉及到一些敏感詞,對玩家或者用戶交流中出現的敏感詞進行過濾,提供一個健康和諧的網路環境是非常重要有意義的。

原文:click.aliyun.com/m/4132

一、概述

目前,網路遊戲和視頻直播都是很火爆的產業,然而,無論在多人在線網路遊戲(MMORPG)中,還是在遊戲視頻直播或者其他直播中(彈幕),玩家或者用戶的在線交流和互動都是它們的核心樂趣所在,但是玩家之間的交流和互動不可避免地會涉及到一些敏感詞,對玩家或者用戶交流中出現的敏感詞進行過濾,提供一個健康和諧的網路環境是非常重要有意義的。

二、現有技術方案

現有技術中,通常採用兩種方式進行敏感詞的過濾:

第一種方式:客戶端完成敏感詞的過濾

客戶端存儲有敏感詞庫;由玩家輸入的文本內容經過客戶端敏感詞過濾模塊過濾,然後將過濾後的文本由客戶端發送至伺服器,再由伺服器轉發至接收方客戶端顯示,有時為了擔心發送端的過濾模塊被hacker繞過,需要在接收方在接收的時候,也經過下客戶端敏感詞過濾模塊。

  • 優勢:

    每個客戶端單獨執行敏感詞過濾,效率高,且不佔用伺服器資源,伺服器沒有計算消耗。

  • 劣勢:

    敏感詞具有時效性,針對最新出現的敏感詞,不能實時的增加到客戶端的敏感詞庫,只能等下次客戶端打新包或者patch才可以添加進去,這個時間成本有點大。

第二種方式:伺服器完成敏感詞的過濾

在伺服器中存儲敏感詞庫,並設置敏感詞過濾模塊,將伺服器接收到的文本內容進行敏感詞過濾,並將執行完敏感詞過濾後的文本內容發送至客戶端。

  • 優勢:

    在於可實時增加敏感詞,當出現突發事件後,不需要停服就可實現動態添加新的敏感詞。
  • 劣勢:由伺服器執行敏感詞過濾會導致增加大量額外計算消耗,影響伺服器性能。有的特殊的輸入可能會導致執行某些檢測規則時間過長造成伺服器進程卡頓。

三、函數計算可以提供的解決方案

將敏感詞檢測的模塊放在函數計算實現,至於是由客戶端和服務端發起函數調用看具體需求,在本示例中,我們把發起的敏感詞檢測過程放在客戶端發起,如下圖所示:

優勢:不會增加伺服器的計算消耗,同時只需要更新下函數,就可以達到實時更新敏感詞目的。

具體步驟

1 . 函數計算作為 API 網關後端服務, 具體的教程可以參考官方教程和函數計算獲取臨時token

2 . 函數計算實現敏感詞檢測的功能,本文主要講解這個過程, 以python作為編程語言,給出具體的示例代碼。

在本教程中,選用正則式作為我們的敏感詞檢測,也就是python的re模塊,但是做敏感詞檢查還存在一些性能問題需要我們去解決,問題是:當遊戲或者視頻直播上線的時候,敏感詞正則庫一般有幾百個,在python中通過 re.compile 編譯正則表達式是很耗時的,幾百個正則編譯完可能需要10幾秒甚至20多秒,但是如果正則式如果是編譯完的,那麼直接進行匹配match或者search還是很快的,十幾毫秒可以搞定。

初始方案:我們可以將正則表達式的編譯結果 cPickle.dumps 序列化保存到文件中。待下次程序啟動時直接從文件讀取內容, cPickle.loads 反序列化成正則表達式對象。但是這個有坑,根本沒有耗時改善,詳情見cPickle正則表達式對象

最終方案:基於cPickle正則表達式對象的處理方案,對於最耗時的結果壓縮再序列化,反之,反序列的時候記得再解壓一下就行,這樣的好處是,中間的序列化文件大小可以大大壓縮,本教程測試一般顯示能壓縮5倍以上,但是對整個運行時間影響不是很大,如果對時間特別敏感的,可以不考慮壓縮過程。

核心處理代碼文件re_pickple.py

假設我們有一個檢測昵稱的正則字型檔,一個有150條正則規則,部分內容如下:

2.1 我們對其中間最耗時的結果進行序列化, 序列化結果保存在name_prog.pkl文件中:

2.2 敏感詞檢測demo

輸出如下:

因此,只要我們將name_prog.pkl和我們的檢測函數、re_pickple.py一起,構建我們的函數,假設我們的函數如下,一次性檢查4個名字,我們測試下調用100消耗時間的情況。

調用100次所消耗的時間情況如下:

avg: 0.000343136787415

min: 0.000230073928833

max: 0.000503063201904

總結

採用函數計算實現自定義的敏感詞檢測模塊方案是一個很好的選擇,自己預編譯的的正則序列化中間結果除了第一次load大約是100來毫秒以外,其他的檢測結果基本毫秒級就能給出結果,而且函數計算能做到自動按流量來scale,即使出現大量的文字交流,也能快速及時處理,很火的視頻直播再也不怕海量彈幕了。同時,進一步擴展,針對網路遊戲中出現的語音信息的翻譯成文字,文字敏感性檢測都可以通過函數計算來實現。

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎


推薦閱讀:

高數書解答看不懂,求教一道基礎的導函數連續題?
c++ lambda 函數的 static 屬性是否無效?
任意一條曲線是否可以找到方程或者函數來描繪?

TAG:Python | 服务器 | 函数 |