toolgood

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

       2月底,我辞了公司工作,开始为自己奋斗,立志在敏感词过滤方面走出一条路来。原以为凭借ToolGood.Words开源项目所领悟的算法及多年优化经验,我可以在3个月内快速完成,然而我用了6个月,在6个月内,我换了三套核心算法,每次重写都让人心身疲惫,甚至有点自我怀疑,一个人单干真得太难了。

 

       敏感词过滤是一项非常复杂项目,而很多人却不这么认为。在去年我组建了一个【敏感信息过滤研究会】Q群,Q群不热闹,干贷却不少。以下为我总结出来几个现象:

  一, 很多程序员认为开源免费的就是好的,就是一套可用的完整的技术,github上的星星就是最好的验证。盲目的使用ToolGood.Words项目,使用过一段时间就发现问题了,就来问我“生日”怎么是敏感词,我帮他检测了一下,告诉他这敏感词列表内有”日”字,要排除误测需要使用NLP来过滤。

  二,很多程序员认为宁可错杀,也不可放过一个,只要检测到第一个就判断有敏感词。真的心很大,不怕用户流失而扣奖金嘛。

  三,对企业来说数据保密很重要。我碰过一个程序员设置敏感词时,使用base64字符串,检测的文本也是base64字符串,一测试就出问题了,跟我说ToolGood.Word内存占用大,而且检测不准。原因很简单,转base64字符串,如【准】就转成【5YeG】,【1准】就转成【MeWHhg==】这个例子就很容易说明,内存大是字符变长,检测不准是转base64字符串后内容变得不一样了。

    技术小白可能不知道,文本转base64字符串是依据6位bit来转化的,而一个byte有8位bit,Base64编码是每3个原始字符编码成4个字符,当原始字符串长度不能被3整除,使用0来补充原始字符串。如【准】就转成【5YeG】,【1准】就转成【MeWHhg==】,

  四,对于网上敏感词过滤的吐槽,吐槽原因主要是“不准“,”太严了“。 大厂也是吐槽对象。因为大厂的产品定位是严,否则会出现封站问题,名声越大负面消息传得越快。

  五、有不少网友跟我反馈,ToolGood.Words开源项目内的敏感词列表还是比较不错的,第一次听时,我比较诧异,那个敏感词列表是我随手找的,内有大量误判的敏感词。后来我明白了,小平台对敏感词过滤要求很低,目标客户目标范围都比较小,基本不会有涉政内容,能过滤95%的违规内容就可以了,也因为是目标范围小,一些误判的敏感词也涉及不到,而且大部分都有用户举报功能,最后,如百度这些搜索引擎也不会特意去显示违规内容。

  六,很多敏感词过滤企业开始往AI方面发展,原因很简单,领导认为使用DFA技术过滤信息是很low的,无法在客户面前吹牛。往AI方面发展有多少坑,下面我会讲一下。

 

AI的路有多难走?

       往AI方向发展是趋势,但绕不开性能问题,乘法、除法太耗运算资源了。所以企业都会选择DFA算法+AI算法。

       AI算法的一个基础概念是词向量,词向量的维数少的可以取20,多的可以取500,汉字的组词实在太多了,很难全部训练完成,很多公司为了偷懒为了快速完成项目,都将单个汉字设为词向量,也就埋下了一个bug。

       在某平台测试,会发现【买犊卖刀】是辱骂词,建议屏蔽。【买犊卖刀】原义:卖剑买牛。原指放下武器,从事耕种。后比喻改业务农或坏人改恶从善。为什么出现这种情况?原因很简单,训练词库内有大量含【卖】的脏词、以及大量含【犊】的脏字,两个合在一起就出问题了。

       AI算法的局限主要来源训练数据样本不均衡,但这个问题是解决不了的,因为我们有口头、书面语,高频词、低频词,而且时代变迁,很多词的意思都带了上不同意思,如“公主”、“小姐”。

 

 

每个公司的敏感词过滤定位不一样,决策也不一样。

       敏感词过滤公司,以空间换时间,内存使用量达100多G,16K文本检测速度达到毫秒级。

  新闻平台对涉政文章是允许的,而小平台基本是不允许的。

  医疗平台对含器官、病症文章是允许的,而小平台基本是不允许的。

  游戏论坛对装备交流涉及武器、刀具是允许的,而小平台是不允许的。

  大平台对外部链接普遍保持开放态度,而小平台是不允许的。

  大平台对引流至公众号平台也是默许的,而小平台是不允许的。

 

我对产品的定位是性能要高、内存使用量要小、单文件部署。性能要高、内存使用量要小,让我改了三次核心源码。内存从将class转成struct,将检测每一个int,string等有效范围,尝试bool代替int类型、int类型代替string类型;性能从一个个算法、一个个if、一个个循环中扣出来,一次次修改代码、生成应用、生成数据、测试准确性、测试性能、驳回修改,漫长又枯燥。。。

 

现在已完成了目标,加载数据后内存使用量在100M以下,检测速度小文本(6-10字)每秒25W条,大文本(18W字)每秒5条,实际环境下,cpu、内存卡和网络传输都会影响性能。

 

  内存少了,敏感词却没少,是因为算法优秀。

  可以下文字去我的平台(toolgood.com)测试。拼接后的脏词有26303904组(约2630W)。

    c|C|⒞|c|ⓒ|C|C|ℂ|Ⓒ|с|С|𝐜|𝑐|𝚌|𝒸|𝒄|𝓬|𝕔|𝖼|𝗰|𝘤|𝙘|𝐂|𝐶|𝙲|𝒞|𝑪|𝓒|𝖢|𝗖|𝘊|𝘾|©

    a|A|⒜|ā|á|ǎ|à|a|ⓐ|A|A|Ⓐ|а|А|𝐚|𝑎|𝚊|𝒶|𝒂|𝓪|𝕒|𝖺|𝗮|𝘢|𝙖|𝐀|𝐴|𝙰|𝒜|𝑨|𝓐|𝔸|𝖠|𝗔|𝘈|𝘼|Α|α

    o|O|⒪|ō|ó|ǒ|ò|o|ⓞ|O|O|Ⓞ|о|О|𝐨|𝑜|𝚘|𝒐|𝓸|𝕠|𝗈|𝗼|𝘰|𝙤|𝐎|𝑂|𝙾|𝒪|𝑶|𝓞|𝕆|𝖮|𝗢|𝘖|𝙊|Ο|ο|σ

    㚷|伱|你|倪|呢|妮|妳|尼|您|拟|昵|汝|沵|泥|祢|迩|铌|鉨|your|you|亻尓|女尓|ni

    㐷|吗|嘛|妈|娘|嫲|嬷|杩|溤|犘|犸|玛|痲|码|祃|蔴|蚂|马|骂|鰢|鷌|麻|嚒|ma

  注:坚线为分隔符。

 

后记:

       我准备开写两个系列文章,《dotnet单文件部署》和《敏感词过滤简史》。全是实用干货哦。

  敏感词会随时间增多,这是一个不争的事实,社会上的一些极端分子总是喜欢造一些词羞辱别人。当然部分敏感词也会随时间消失。

       敏感词过滤项目是一件助人的项目,净化网络,消除负面气息,避免人被请去喝茶。

预告:下一篇文章《普通公司敏感词审核度制》

posted on 2021-08-31 08:50  ToolGood  阅读(5644)  评论(4编辑  收藏  举报