改进的脏话审查方案

导言

我经常光顾cnbeta,那里的评论很精辟,有时我也会忍不住评上两句,但近来突然发现发布评论都必须经过审核才会显示了,这让我感到非常扫兴。由此我又想起了此前我曾讨论过的“非法内容核查方法”,我想这种人机结合的审核方式应该会比较适合现在的cnbeta吧。

而现在我已经对此方案有了更深、更好的思路了,想在此分享出来,和大家探讨一下,我将在此逐步解析整个审查的流程:

准备工作

要审查脏话,首先需要创建对应的审查规则,每条规则需要提供以下基本信息:

1.         表达式:用于审查内容是否匹配的正则表达式。使用正则的原因在于其灵活性,常规的纯文本检索虽然快,但遇到干扰符等情况时束手无策,而正则就可以轻松解决,例如表达式“[煞傻妈狗屎贱骚瘙搔臊][\s\S]{0,4}?[逼笔比BB鼻X]”可以匹配多种组合的脏话,并可兼容至多4个干扰字符。

2.         首字符列表:用于遍历文章内容时提取疑似首字符使用。对于表达式“[煞傻妈狗屎贱骚瘙搔臊][\s\S]{0,4}?[逼笔比BB鼻X]”来说,它的首字符列表中应包含“煞傻妈狗屎贱骚瘙搔臊”。

3.         尾字符列表:用于遍历文章内容时提取疑似尾字符使用。对于表达式“[煞傻妈狗屎贱骚瘙搔臊][\s\S]{0,4}?[逼笔比BB鼻X]”来说,它的尾字符列表中应包含“逼笔比BB鼻X”。

4.         分值:即匹配成功后,为该文章增加的危险度分值。

5.         最大长度:就是脏话内容可能出现的最大字数。对于表达式“[煞傻妈狗屎贱骚瘙搔臊][\s\S]{0,4}?[逼笔比BB鼻X]”来说,它的最大长度应当是6。

6.         精确长度:就是当脏话内容完全无干扰符的情况下的实际字数。此属性可以用于计算匹配内容的精准程度,比如还是用上面那个表达式“[煞傻妈狗屎贱骚瘙搔臊][\s\S]{0,4}?[逼笔比BB鼻X]”的例子,如果遇到语段“她的妈妈总是逼我们尽快完婚”也会匹配成功,但匹配到的内容长度会是5,与精确长度2进行比对的话,就可以得知此匹配项有可能属于误判;而且我们还可以让程序依据精确程度为文章打分,比如此规则原始分值为10分,但只有40%的精确度,那么在加分时可以只加4分,这样得出的危险度分值将更具参考性。

尽管主要目的是为了检验脏话,但此机制也完全适用于检验文章内的广告、色情、血腥、政治、宗教等内容,甚至还可能用来给内容做积极方面的评分,比如用以审阅学生作文,对特定修辞手法予以加分。

初始化

在审查之前,需要事先载入先前创建的规则,并加以分类,以更方便及加速检索。

分类的方法是建立一个Dictionary<规则>>类型的对象称为规则字典,将规则可能触发的首尾字符组合作为规则字典的键值,保存规则到对应的字典内的List中,这样可以极大地提高检索时获取规则的速度。

比如规则的首尾字符分别为“王”和“蛋”,那么就将此规则存入规则字典[“王蛋”]内的List中去,如果此规则存在多种首尾字符组合,那么就保存多个副本到各种首尾组合的规则字典键值中。

在分类的同时,还应该采集并创建以下数据,并保存备用:

1.         全局最大长度:即所有规则中,最大长度属性的最大值。此属性将用在检索时进行预判断,以减少不必要的遍历次数,提高效率。

2.         全局首字符列表:即所有规则中出现的首字符总列表。此属性用于检索文章全文时使用。

3.         全局尾字符列表:即所有规则中出现的尾字符总列表。此属性用于检索文章全文时使用。

遍历内容全文

遍历内容的每一个字符,依据全局首字符列表和全局尾字符列表找出可能是非法内容首字符或尾字符的字符,将该字符及其位置存入相应列表中,我们在这里将捕获到的列表称为疑似首字符列表及疑似尾字符列表。

这里我建议在捕获到尾字符时倒序插入到疑似尾字符列表中,这样在遍历匹配时可以优先匹配字符较多的内容,比如“傻”和“傻瓜”都符合脏话规则的情况下,优先匹配“傻瓜”。

分析并处理捕获内容

接着遍历疑似首字符列表,从疑似尾字符列表中找出可能与之搭配的尾字符(根据当前首字符索引位置及规则的全局最大长度进行预筛检:尾字符索引位置>=首字符索引位置&&尾字符索引位置<=首字符索引位置+全局最大长度)。

再将当前的首尾字符组合成字符串,当作键值,向规则字典查询键值内可能匹配的规则(根据当前首尾字符索引位置进行预筛检:规则最大长度>=尾字符索引位置-首字符索引位置+1)。

从原文中截取首字符索引位置到尾字符索引位置之间的片段,用当前规则进行检验,如匹配成功则依据匹配的精确度增加相应比例的分值(算法就是使用规则的精确长度除以实际捕获到的文本内容长度,再乘以规则的分值),然后开始检验跨过当前尾字符索引位置之后的下一个首字符。

除了输出累计评分外,还可以在审核时生成最高评分、平均精确度、危险内容覆盖比例等信息,供人工审核时参考。

总结

依照上述步骤,即完成了整个机审过程,然后就可以根据评分结果来决定如何处理文章了。整个过程的简略的流程示意图如下:

这个经过改进的方案兼顾了性能与灵活性:只进行一次全文扫描;使用正则表达式进行语段匹配。预计稍加优化,并加入缓存机制的话,常规文章的审核耗时不会超过半秒。

存在并期待改进的缺点:由于采用了首尾字符匹配形式触发正则验证,正则中的断言似乎就无用武之地了,这使得正则发挥的功能有所缩减,鱼与熊掌真不可兼得吗?

最后,再重申一下我对人机协作审核机制的处理建议:

不要尝试将危险文字自动替换后直接发布,省去人工审核,那样只会招致无限的道魔战。

无危险的内容应直接发布;

有一定危险的内容也会发布,但在发布的同时会在后台提请管理员进行人工审查;

高危险度的内容延迟发布并通知管理员。

我的想法就说到这里了,欢迎大家回复交流。

声明:此方案参考并借鉴了Sumtec的字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之理论如此一文中的部分算法思路,在此深表感谢。

下载本文的PDF版本:http://uushare.com/user/icesee/file/1387050

时间: 2024-10-29 04:23:44

改进的脏话审查方案的相关文章

艾伟:改进的脏话审查方案

导言 我经常光顾cnbeta,那里的评论很精辟,有时我也会忍不住评上两句,但近来突然发现发布评论都必须经过审核才会显示了,这让我感到非常扫兴.由此我又想起了此前我曾讨论过的"非法内容核查方法",我想这种人机结合的审核方式应该会比较适合现在的cnbeta吧. 而现在我已经对此方案有了更深.更好的思路了,想在此分享出来,和大家探讨一下,我将在此逐步解析整个审查的流程: 准备工作 要审查脏话,首先需要创建对应的审查规则,每条规则需要提供以下基本信息: 1.         表达式:用于审查内

一种MySQL主从同步加速方案-改进

上一篇提出了一种改进主从延迟的方案.虽然能够实现主从无延迟同步,但在维护上比较复杂,还存在网络消耗问题,这里是一个改进的版本. 一.之前方案简述及问题分析 方案如图.其中用多个MySQL充当transfer的角色.每个transfer负责同步master的一部分表.在我的试验中有8个transfer,也就是有8个MySQL实例. 问题: 1.维护复杂.在从库及其上需要增加8个实例,增加维护成本,而且不利于加表操作. 2.增加网络开销.虽然在transfer的IO线程作了过滤,减少每个transf

如何防止应用程序泄密?

黑客或攻击者总能找到一些可以利用的媒介或要素.例如,员工越来越多地在工作场合使用移动设备,各种应用商店提供了五花八门的移动应用.由于这些应用的源头不一,质量参差不齐,所以普通用户很难判断哪些是最新的,更难以判断其是否有恶意目的.黑客深谙此道,因而可以设计一些看似善意的功能强大的应用,其中却可能包含病毒.木马或损害设备和公司网络的其它恶意软件,员工不知不觉成为"引狼入室"的罪魁祸首. 但这些专门设计的应用程序并非是将企业置于风险中的唯一罪犯.还有许多可能泄密的应用程序,在用户自认为安全地

如何防止应用程序泄密?

黑客或攻击者总能找到一些可以利用的媒介或要素.例如,员工越来越多地在工作场合使用移动设备,各种应用商店提供了五花八门的移动应用.由于这些应用的源头不一,质量参差不齐,所以普通用户很难判断哪些是最新的,更难以判断其是否有恶意目的.黑客深谙此道,因而可以设计一些看似善意的功能强大的应用,其中却可能包含病毒.木马或损害设备和公司网络的其它恶意软件,员工不知不觉成为"引狼入室"的罪魁祸首. 但这些专门设计的应用程序并非是将企业置于风险中的唯一罪犯.还有许多可能泄密的应用程序,在用户自认为安全地

在ASP与ASP.NET之间共享对话状态(2)

asp.net ASP实现 原来的ASP对话只能将对话数据保存在内存中.为了将对话数据保存到SQL Server,需要写一个自定义的Visual Basic 6.0 COM对象代替现在的对话对象来管理对话状态.该COM对象在每个Web请求开始时被初始化,并从SQL Server重新载入对话数据.ASP脚本完成时,该对象将终止并把对话状态将返回到SQL Server.Visual Basic 6 COM Session对象的主要目的是提供对微软Internet信息服务器(IIS)内部对象的访问.V

在ASP与ASP.NET之间共享对话状态

asp.net [前言:]ASP.NET是微软提供的最新的开发基于Web的应用程序的技术.它提供了大量的比传统ASP脚本技术的好处,包括: 1)通过把UI表现层(presentation)与商业逻辑(business logic)分开建立了更好的开发结构: 2)使用完全编译的代码代替了传统ASP的代码翻译: 3)它编译特性与每个支持的方法协同,这意味着使用ASP.NET的站点比使用传统的ASP站点的性能更高. 尽管把存在的ASP应用程序转换到ASP.NET有很多潜在的好处,也有些ASP应用程序任

求职大数据处理面试问题汇总

1. 给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G.所以不可能将其完全加载到内存中处理.考虑采取分而治之的方法. s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中.这样每个小文件的大约为300M. s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为 ).这样处理后,所有可

table合并单元格colspan和rowspan

起因 解决方案 colspan rowspan colspan rowspan 综合实例 起因     最近要实现一个成绩分析的功能,最终是要呈现到Word中的,一开始想到的使用报表显示,但是得有单独的数据库表来存储这些数据,如果说项目是刚开始做的话,倒也好说,不过现在项目已经进入了后期,在新建数据库表就有点不现实了,因此就jsp界面手画table了.但是在画table的过程中遇到一个问题,有些单元格是合并的,那么怎么来合并单元格呢? 解决方案 colspan & rowspan     col

大数据的处理

1. 给定a.b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a.b文件共同的url?  方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G.所以不可能将其完全加载到内存中处理.考虑采取分而治之的方法.  s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中.这样每个小文件的大约为300M.  s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为 ).这样处理后,