36|AC自动机:如何用多模式串匹配实现敏感词过滤功能?

36|AC自动机:如何用多模式串匹配实现敏感词过滤功能?
很多支持用户发表文本内容的网站,比如BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的 一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢? 实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户 输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如 果有,就用“***”把它替代掉。 我们前面讲过好几种字符串匹配算法了,它们都可以处理这个问题。但是,对于访问量巨大的网站 来说,比如淘宝,用户每天的评论数有几亿、甚至几十亿。这时候,我们对敏感词过滤系统的性能 要求就要很高。毕竟,我们也不想,用户输入内容之后,要等几秒才能发送出去吧?我们也不想, 为了这个功能耗费过多的机器吧?那如何才能实现一个高性能的敏感词过滤系统呢?这就要用到今 天的多模式串匹配算法。
基于单模式串和Trie树实现的敏感词过滤

假设我们沿Trie树走到p节点,也就是下图中的紫色节点,那p的失败指针就是从root走到紫色节点 形成的字符串abc,跟所有模式串前缀匹配的最⻓可匹配后缀子串,就是箭头指的bc模式串。 这里的最⻓可匹配后缀子串,我稍微解释一下。字符串abc的后缀子串有两个bc,c,我们拿它们与 其他模式串匹配,如果某个后缀子串可以匹配某个模式串的前缀,那我们就把这个后缀子串叫作 可匹配后缀子串

image.png

课后思考
到此为止,字符串匹配算法我们全都讲完了,你能试着分析总结一下,各个字符串匹配算法的特点和比较适合的应用场景吗?

一、单模式串匹配:

  1. BF: 简单场景,主串和模式串都不太长, O(m*n)
  2. RK:字符集范围不要太大且模式串不要太长, 否则hash值可能冲突,O(n)
  3. naive-BM:模式串最好不要太长(因为预处理较重),比如IDE编辑器里的查找场景; 预处理O(m*m), 匹配O(n), 实现较复杂,需要较多额外空间.
  4. KMP:适合所有场景,整体实现起来也比BM简单,O(n+m),仅需一个next数组的O(m)额外空间;但统计意义下似乎BM更快,原因不明.
  5. 另外查资料的时候还看到一种比BM/KMP更快,且实现+理解起来都更容易的的Sunday算法,有兴趣的可以看这里:http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/sundayen.htmhttps://www.jianshu.com/p/2e6eb7386cd3

二、多模式串匹配:

  1. naive-Trie: 适合多模式串公共前缀较多的匹配(O(n*k)) 或者 根据公共前缀进行查找(O(k))的场景,比如搜索框的自动补全提示.
  2. AC自动机: 适合大量文本中多模式串的精确匹配查找, 可以到O(n).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值