python使用esmre代替ahocorasick实现ac自动机[多模匹配]
python使用esmre代替ahocorasick實現ac自動機[多模匹配]
6-13 python rfyiamcool 368 viewspython使用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" |
相關的文章
- 上一篇
- 下一篇
別倒貼,要不整死你
原文地址: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
- 文藝
- 未分類
- 運維
- 運維基礎
- 運維開發
總結
以上是生活随笔為你收集整理的python使用esmre代替ahocorasick实现ac自动机[多模匹配]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rob hess 关于sift的说明
- 下一篇: ROC曲线 1