Toggle navigation

  • Home
  • saltstack
  • ansible
  • zabbix
  • docker
  • python
  • Golang
  • web开发
  • 运维开发
  • 运维
  • 文艺

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

6-13 python rfyiamcool 368 views

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

6-13 368 views

为什么会用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

Python
import esm index = esm.Index() index.enter("宝马") index.enter("马") index.enter("奔驰") index.enter("保时捷") index.fix() index.query("哎呀,今天在楼下看到了宝马,我老家倒是有养马的,以前的邻居有个奔驰,不对是保时捷,大爷的,都是马")
1
2
3
4
5
6
7
8
9
10

import esm
index = esm.Index()
index.enter("宝马")
index.enter("马")
index.enter("奔驰")
index.enter("保时捷")
index.fix()
index.query("哎呀,今天在楼下看到了宝马,我老家倒是有养马的,以前的邻居有个奔驰,不对是保时捷,大爷的,都是马")

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

Python
#coding:utf-8 import esm index = esm.Index() with open('keyword.config','r') as f:for i in f.readlines():index.enter(i.strip())index.fix()str = """ head&shoulders海飞丝Hershey‘s Loreal欧莱雅LUX2 力士 L’OREALMagic2 美即 MysteryCity 谜城 NO.1BABY2 RESIN SANXIAO SHISEIDO FINE TOILETRY2 SKII美之匙 Tao yu tang2 淘雨堂 whoo倍加洁 卡尔林奈 娇韻诗 德国帮宝适 Perfect puff2 See Young2 落健 高夫 """ data = index.query(str) print data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

#coding:utf-8
import esm
index = esm.Index()
with open('keyword.config','r') as f:
    for i in f.readlines():
        index.enter(i.strip())
    index.fix()
str = """
head&shoulders海飞丝Hershey‘s
Loreal欧莱雅LUX2
力士
L’OREALMagic2
美即
MysteryCity
谜城
NO.1BABY2
RESIN
SANXIAO
SHISEIDO FINE TOILETRY2
SKII美之匙
Tao yu tang2
淘雨堂
whoo倍加洁
卡尔林奈
娇韻诗
德国帮宝适
Perfect puff2
See Young2
落健
高夫
"""
data = index.query(str)
print data

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

Python
[2015-06-12 23:34:01,043] INFO extractor "Get keywords takes 0.0003 seconds" [2015-06-12 23:34:01,069] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:01,178] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:02,372] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:02,386] INFO extractor "Get keywords takes 0.0012 seconds" [2015-06-12 23:34:02,631] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:03,656] INFO extractor "Get keywords takes 0.0021 seconds" [2015-06-12 23:34:03,744] INFO extractor "Get keywords takes 0.0001 seconds" [2015-06-12 23:34:03,785] INFO extractor "Get keywords takes 0.0001 seconds" [2015-06-12 23:34:03,910] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:04,031] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:05,004] INFO extractor "Get keywords takes 0.0035 seconds" [2015-06-12 23:34:05,579] INFO extractor "Get keywords takes 0.0055 seconds" [2015-06-12 23:34:05,602] INFO extractor "Get keywords takes 0.0005 seconds" [2015-06-12 23:34:05,662] INFO extractor "Get keywords takes 0.0010 seconds" [2015-06-12 23:34:06,125] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:06,299] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:06,404] INFO extractor "Get keywords takes 0.0003 seconds" [2015-06-12 23:34:07,396] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:07,595] INFO extractor "Get keywords takes 0.0004 seconds" [2015-06-12 23:34:08,725] INFO extractor "Get keywords takes 0.0015 seconds" [2015-06-12 23:34:09,504] INFO extractor "Get keywords takes 0.0004 seconds" [2015-06-12 23:34:09,515] INFO extractor "Get keywords takes 0.0005 seconds" [2015-06-12 23:34:10,650] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:11,206] INFO extractor "Get keywords takes 0.0003 seconds" [2015-06-12 23:34:12,298] INFO extractor "Get keywords takes 0.0002 seconds" [2015-06-12 23:34:12,319] INFO extractor "Get keywords takes 0.0001 seconds" [2015-06-12 23:34:13,547] INFO extractor "Get keywords takes 0.0006 seconds" [2015-06-12 23:34:13,853] INFO extractor "Get keywords takes 0.0005 seconds"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

[2015-06-12 23:34:01,043] INFO extractor "Get keywords takes 0.0003 seconds"
[2015-06-12 23:34:01,069] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:01,178] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:02,372] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:02,386] INFO extractor "Get keywords takes 0.0012 seconds"
[2015-06-12 23:34:02,631] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:03,656] INFO extractor "Get keywords takes 0.0021 seconds"
[2015-06-12 23:34:03,744] INFO extractor "Get keywords takes 0.0001 seconds"
[2015-06-12 23:34:03,785] INFO extractor "Get keywords takes 0.0001 seconds"
[2015-06-12 23:34:03,910] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:04,031] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:05,004] INFO extractor "Get keywords takes 0.0035 seconds"
[2015-06-12 23:34:05,579] INFO extractor "Get keywords takes 0.0055 seconds"
[2015-06-12 23:34:05,602] INFO extractor "Get keywords takes 0.0005 seconds"
[2015-06-12 23:34:05,662] INFO extractor "Get keywords takes 0.0010 seconds"
[2015-06-12 23:34:06,125] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:06,299] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:06,404] INFO extractor "Get keywords takes 0.0003 seconds"
[2015-06-12 23:34:07,396] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:07,595] INFO extractor "Get keywords takes 0.0004 seconds"
[2015-06-12 23:34:08,725] INFO extractor "Get keywords takes 0.0015 seconds"
[2015-06-12 23:34:09,504] INFO extractor "Get keywords takes 0.0004 seconds"
[2015-06-12 23:34:09,515] INFO extractor "Get keywords takes 0.0005 seconds"
[2015-06-12 23:34:10,650] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:11,206] INFO extractor "Get keywords takes 0.0003 seconds"
[2015-06-12 23:34:12,298] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:12,319] INFO extractor "Get keywords takes 0.0001 seconds"
[2015-06-12 23:34:13,547] INFO extractor "Get keywords takes 0.0006 seconds"
[2015-06-12 23:34:13,853] INFO extractor "Get keywords takes 0.0005 seconds"

相关的文章

  • python下的ahocorasick实现快速的关键字匹配
  • 分享python实现的lfu缓存模块-pylfu
  • 浅谈twisted应用中异步回调的方式及线程的应用
  • python调用zookeeper管理thrift集群可用性队列
  • 利用google authenticator构建平台的otp动态口令
  • 解决hbase跑mapreduce时遇到内存及超时问题
  • 线上测试docker在cpu密集运算的场景下性能的表现
  • python实现最少使用算法lru包括dict和list队列
  • nginx1.9新模块ngx_stream_core_module实现stream tcp负载均衡
  • 针对redis的HyperLogLog做基数统计性能测试
  • 用gevent开发非阻塞的etcd python客户端模块
  • 聊聊python的轻量级orm peewee及对比SQLAlchemy
  • 上一篇
  • 下一篇

别倒贴,要不整死你

原文地址:http://xiaorui.cc/2015/06/13/python%e4%bd%bf%e7%94%a8esmre%e4%bb%a3%e6%9b%bfahocorasick%e5%ae%9e%e7%8e%b0ac%e8%87%aa%e5%8a%a8%e6%9c%ba%e5%a4%9a%e6%a8%a1%e5%8c%b9%e9%85%8d/

转载时必须以链接形式注明原始出处及本声明。

您可能也喜欢:
暂无相关产品

公告

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

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

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

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



最近访客

标签

ansibleansible apidjango tornadodockerdocker apielasticsearchelketcdgeventgolanggunicornhappybaseInfluxdbInfluxDB 性能kibanakibana4logstashpythonpython celerypython dockerpython elasticsearchpython etcdpython geventpython gunicornpython happybasepython hbasepython influxdbpython mongodbpython multiprocessingpython redispython rqpython socketpython threadpoolpython thriftpython zabbixpython 任务队列python 校验数据python 缓存redisredis clustersaltstacksaltstack apizabbixzabbix二次开发zabbix开发
最热文章
  • 大数据公司招聘高级python程序员10
  • 使用python实现高性能代理服务器 [tornado proxy]9
  • TB级mysql数据之xtrabackup压缩备份迁移方案9
  • 对于nginx线程池thread pool提高性能的疑惑6
  • 高薪招聘Devops web 运维开发工程师6
  • python版shadowsocks流量及用户管理开发5
  • docker无法用exec进入容器的问题[cannot allocate4
  • 使用python的mysqldb做like模糊查询时遇到的问题4
  • 大数据公司招聘高级python程序员10
  • 使用python实现高性能代理服务器 [tornado 9
  • TB级mysql数据之xtrabackup压缩备份迁移方9
  • 对于nginx线程池thread pool提高性能的疑惑6
  • 高薪招聘Devops web 运维开发工程师6
  • python版shadowsocks流量及用户管理开发5
  • docker无法用exec进入容器的问题[cannot al4
  • 使用python的mysqldb做like模糊查询时遇到4
  • 大数据公司招聘高级python程序员10
  • 使用python实现高性能代理服务器 [tornado proxy]9
  • TB级mysql数据之xtrabackup压缩备份迁移方案9
  • 对于nginx线程池thread pool提高性能的疑惑6
  • 高薪招聘Devops web 运维开发工程师6
  • python版shadowsocks流量及用户管理开发5
  • docker无法用exec进入容器的问题[cannot allocate memory]4
  • 使用python的mysqldb做like模糊查询时遇到的问题4
最新评论
  • 支持 难得的好文
  • 哥,请教下 俺配置的elk环境 kiba...
  • 还行吧
  • 没看明白
  • 要求高呀
  • 屌大. 我搜索点资料又到你这里了 . 喝...
  • 支持 难得的好文
  • 哥,请教下 俺配置的elk环境...
  • 还行吧
  • 没看明白
  • 要求高呀
  • 屌大. 我搜索点资料又到你这里...
随机文章
  • 使用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

  • 分类目录
  • 热门标签
  • ansible
  • backbone
  • DB
  • docker
  • easyui
  • git
  • Golang
  • mongodb
  • postgresql
  • python
  • saltstack
  • tornado
  • web
  • zabbix
  • 文艺
  • 未分类
  • 运维
  • 运维基础
  • 运维开发
ansibleansible apidjango tornadodockerdocker apielasticsearchelketcdgeventgolanggolang httpgolang nosqlgolang 并发grafanagunicornhappybaseInfluxdbInfluxdb grafanaInfluxDB 性能kibanakibana4logstashpythonpython celerypython dockerpython elasticsearchpython etcdpython geventpython gunicornpython happybasepython hbasepython influxdbpython mongodbpython multiprocessingpython redispython rqpython socketpython threadpoolpython thriftpython zabbixpython 任务队列python 校验数据python 缓存redisredis clustersaltstacksaltstack apizabbixzabbix二次开发zabbix开发

文章存档

Copyright © 2013. 峰云就她了,专注与运维自动化平台.

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

  1. 浅谈Aho-Corasick automaton(AC自动机)

    Aho-Corasick automaton是什么? 要学会AC自动机,我们必须知道什么是Trie,也就是字典树.Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统 ...

  2. hdu 2222 Keywords Search AC自动机——多串匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...

  3. Python实现多模匹配——AC自动机

    Python实现多模匹配--AC自动机 目标:学习AC自动机,多模匹配. 要求:尽可能用纯Python实现,提升代码的扩展性. 一.什么是AC自动机? AC自动机,Aho-Corasick autom ...

  4. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  5. ac自动机 匹配最长前缀_AC自动机算法

    AC自动机简介: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包 ...

  6. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  7. AC自动机:多模式串匹配实现敏感词过滤

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 敏感词过滤场景 在很多支持用户发表内容的网站,都有敏感词过滤替换的功能.例如将一些淫秽.反动内容过滤 ...

  8. 学习笔记:AC自动机

    话说AC自动机有什么用......我想要自动AC机 AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配 ...

  9. 算法讲解:ac自动机及简单衍生

    AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段 ...

最新文章

  1. Web开发常见的软件架构
  2. R语言将dataframe长表转化为宽表实战:使用reshape函数、使用tidyr包的spread函数、使用data.table
  3. 编程之美2.17 数组循环移位
  4. 四阶龙格库塔法的基本思想_SIR模型计算基本再生数R0
  5. 二进制除法\模2除法
  6. 使用Exceptionless记录日志
  7. mfc让图片与按钮一起_MFC 基础知识:对话框背景添加图片和按钮Button添加图片...
  8. adhoc包无法安装_iOS 5.1.1 设备不能安装AdHoc问题版本号
  9. Element-UI-的登录页面_密码框---Element-UI工作笔记004
  10. 计算机上机计划,计算机上机实验内容及实验报告总结计划要求-20210711144121.doc-原创力文档...
  11. 已经安装mysql xampp_windows 7 本机已安装mysql5的情况上 安装XAMPP
  12. require(): open_basedir restriction in effect. 解决方法
  13. 【车间调度】基于matlab差分进化算法求解作业车间调度问题【含Matlab源码 1743期】
  14. centos7.2下搭建postfix++dovecot+courier-authlib+extmail邮件收发系统
  15. 垃圾邮件过滤python_手把手教你用Python 和 Scikit-learn 实现垃圾邮件过滤
  16. DSPF28335学习笔记之(1)CMD文件说明
  17. LeetCode——Maxium Depth of Binary Tree
  18. 张家界航空工业职业学院计算机,张家界航空工业职业技术学院2021年招生代码...
  19. 计算机辅助教学应用于哪些方面,计算机辅助教学在英语教学中的运用
  20. 知乎页面的html代码,Web前端

热门文章

  1. logrotate机制和原理
  2. linux进程--自旋锁和互斥锁的区别(十五)
  3. DPDK 中断机制(二十六)
  4. HTTPS 的工作原理
  5. #pragma pack
  6. Binder 驱动详解(下)
  7. Exchange Server 2016管理系列课件33.通讯组仲裁
  8. 【规范】前端编码规范——jquery 规范
  9. Kafka Log Compaction 解析
  10. APP上线后,去除Log打印的问题