python使用esmre代替ahocorasick实现ac自动机[多模匹配]

为什么会用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. 峰云就她了,专注与运维自动化平台.
      • 0
        点赞
      • 1
        收藏
        觉得还不错? 一键收藏
      • 0
        评论

      “相关推荐”对你有帮助么?

      • 非常没帮助
      • 没帮助
      • 一般
      • 有帮助
      • 非常有帮助
      提交
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值