云栖君导读:目前,网络游戏和视频直播都是很火爆的产业,然而,无论在多人在线网络游戏(MMORPG)中,还是在游戏视频直播或者其他直播中(弹幕),玩家或者用户的在线交流和互动都是它们的核心乐趣所在,但是玩家之间的交流和互动不可避免地会涉及到一些敏感词,对玩家或者用户交流中出现的敏感词进行过滤,提供一个健康和谐的网络环境是非常重要有意义的。
一、概述
目前,网络游戏和视频直播都是很火爆的产业,然而,无论在多人在线网络游戏(MMORPG)中,还是在游戏视频直播或者其他直播中(弹幕),玩家或者用户的在线交流和互动都是它们的核心乐趣所在,但是玩家之间的交流和互动不可避免地会涉及到一些敏感词,对玩家或者用户交流中出现的敏感词进行过滤,提供一个健康和谐的网络环境是非常重要有意义的。
二、现有技术方案
现有技术中,通常采用两种方式进行敏感词的过滤:
第一种方式:客户端完成敏感词的过滤
客户端存储有敏感词库;由玩家输入的文本内容经过客户端敏感词过滤模块过滤,然后将过滤后的文本由客户端发送至服务器,再由服务器转发至接收方客户端显示,有时为了担心发送端的过滤模块被hacker绕过,需要在接收方在接收的时候,也经过下客户端敏感词过滤模块。
-
优势:
每个客户端单独执行敏感词过滤,效率高,且不占用服务器资源,服务器没有计算消耗。
-
劣势:
敏感词具有时效性,针对最新出现的敏感词,不能实时的增加到客户端的敏感词库,只能等下次客户端打新包或者patch才可以添加进去,这个时间成本有点大。
第二种方式:服务器完成敏感词的过滤
在服务器中存储敏感词库,并设置敏感词过滤模块,将服务器接收到的文本内容进行敏感词过滤,并将执行完敏感词过滤后的文本内容发送至客户端。
-
优势:
在于可实时增加敏感词,当出现突发事件后,不需要停服就可实现动态添加新的敏感词。 劣势:由服务器执行敏感词过滤会导致增加大量额外计算消耗,影响服务器性能。有的特殊的输入可能会导致执行某些检测规则时间过长造成服务器进程卡顿。
三、函数计算可以提供的解决方案
将敏感词检测的模块放在函数计算实现,至于是由客户端和服务端发起函数调用看具体需求,在本示例中,我们把发起的敏感词检测过程放在客户端发起,如下图所示:
优势:不会增加服务器的计算消耗,同时只需要更新下函数,就可以达到实时更新敏感词目的。
具体步骤
-
函数计算作为 API 网关后端服务, 具体的教程可以参考官方教程和函数计算获取临时token
-
函数计算实现敏感词检测的功能,本文主要讲解这个过程, 以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,即使出现大量的文字交流,也能快速及时处理,很火的视频直播再也不怕海量弹幕了。同时,进一步扩展,针对网络游戏中出现的语音信息的翻译成文字,文字敏感性检测都可以通过函数计算来实现。
精彩活动
新年萌礼!
内含阿里云吉祥物小ET!
-END-
云栖社区
ID:yunqiinsight
云计算丨互联网架构丨大数据丨机器学习丨运维