为什么会用AC自动机? 如果你想知道一篇文章有没有你要过滤的敏感词,怎么办? 不可能用正则一个个的匹配吧?  敏感词超过300个之后,用Trie来构建模式树 (字典树)的速度优势相当的明显… …

Hello Boys , 文章的原文转自 http://xiaorui.cc   http://xiaorui.cc/?p=1649


特别说下,trie图也是一种DFA,可以由trie树为基础构造出来,对于插入的每个模式串,其插入过程中使用的最后一个节点都作为DFA的一个终止节点。

如果要求一个母串包含哪些模式串,以用母串作为DFA的输入,在DFA 上行走,走到终止节点,就意味着匹配了相应的模式串。

ps: AC自动机是Trie的一种实现,也就是说AC自动机是构造Trie图的DFA的一种方法。还有别的构造DFA的方法… 

不扯淡了,我们后端都是python写的,python的ahocorasick模块跟我们的业务不太匹配,问题是这样的 !    如果你的服务是用来做敏感词匹配,也就是说所有文章里面只要含有一个关键词,那就说明匹配了。  但是我们的业务是文章中的所有能匹配到的关键词都一一的抽取出来。   我想有些朋友可能还不太明白,那么我举个例子, 如果我的关键词里面有宝马和马,那么用python的ahocorasick库只会得到宝马,而不会得到马。  问题是处在马这个字节是在宝马的链条里面的。  如何避开这个问题,我们也懒得自己重写了,已经有人给出了解决的模块。  已经测试完成,并上线使用了。 

安装简单,直接pip install esmre

再来一个完整的例子.  后续有时间我会把ac自动机的服务集成到rpc服务里面,然后用docker打包。


测了几天,性能还是可以的,500KB的文章,6000多个关键词,消耗的时间在0.002左右,相比ahocorasick一点都不差的。  观察了下,esmre是没有发现内存异常泄露等问题。

暂无相关产品

    公告

    我的另一个博客,偏向 运维方面的 ~ ops.xiaorui.cc

    有事可以发邮件,rfyiamcool@163.com

    我个人的github地址是, github.com/rfyiamcool

    我给pypi提交过的项目,[话说曾经被删过一些]   pypi地址



    最近访客

      标签

      随机文章
      • 使用iptables管理docker容器...
        使用iptables管理doc...
        0
      • 关于数据写入的etcd http api...
        关于数据写入的etcd htt...
        1
      • docker中使用logrotate对l...
        docker中使用logrot...
        0
      • Flask使用token来防御csrf跨...
        Flask使用token来防御...
        2
      • 使用python PIL库实现复杂的图片...
        使用python PIL库实现...
        1
      • nginx tcp实现hbase thr...
        nginx tcp实现hbas...
        2
      • 实时监控之ajax动态填充highcha...
        实时监控之ajax动态填充hi...
        0
      • 通过运维工具ansible api来做平...
        通过运维工具ansible a...
        0
      文章存档
      Copyright © 2013. 峰云就她了,专注与运维自动化平台.
      Logo

      权威|前沿|技术|干货|国内首个API全生命周期开发者社区

      更多推荐