AC自动机作为天朝发扬光大的算法,常用于非法字符、恶意文本匹配,比如把字符串中的“小学生”变成“***”之类,或是识别是不是违规的帖子之类的。AC自动机是基于前缀树做的飞速匹配字符的算法。

代码参考:https://zhuanlan.zhihu.com/p/39955829

修改后的代码如下:

class TrieNode(object):def __init__(self, value):self.value = valueself.next = dict()self.fail = Noneself.emit = Noneclass AhoCorasic(object):def __init__(self, attention_list: list = []):self.root = TrieNode('root')if attention_list:self.set_attention_list(attention_list)def set_attention_list(self, words: list):assert isinstance(words, list) and wordsroot = self.rootfor word in words:node = rootfor c in word:if c not in node.next:node.next[c] = TrieNode(c)node = node.next[c]if not node.emit:node.emit = {word}else:node.emit.add(word)queue = []  # 构造fail指针queue.insert(0, (root, None))while len(queue) > 0:node_parent = queue.pop()curr, parent = node_parent[0], node_parent[1]for sub in curr.next.values():queue.insert(0, (sub, curr))if parent is None:continueelif parent is root:curr.fail = rootelse:fail = parent.failwhile fail and curr.value not in fail.next:fail = fail.failif fail:curr.fail = fail.next[curr.value]else:curr.fail = rootreturn rootdef search(self, search_str: str):seq_list = []node = self.rootfor i, search_char in enumerate(search_str):matched = Truewhile search_char not in node.next:if not node.fail:matched = Falsenode = self.root  # 如果 next与 fail都查询失败,重头开始breaknode = node.failif not matched:continuenode = node.next[search_char]  # 不断向下查询if node.emit:  # 找到结束字符for _ in node.emit:from_index = i + 1 - len(_)match_info = (from_index, _)seq_list.append(match_info)node = self.rootreturn seq_listif __name__ == '__main__':aho = AhoCorasic(['foo', 'obar'])aho.set_attention_list(['man']) # 这里可以动态添加需要匹配的子字符串print(aho.search('barfootheofobarman'))

AC自动机(python)相关推荐

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

    Toggle navigation Home saltstack ansible zabbix docker python Golang web开发 运维开发 运维 文艺 python使用esmre代 ...

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

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

  3. python实现AC自动机

    ac自动机可以看成带指针的字典树,每个节点的指针指向了当前节点的最大后缀的位置.在建立字典树后,可以层次遍历字典树来构建fail指针,根节点的直接孩子(第一层节点)的fail指针肯定是指向根节点的,之 ...

  4. Python——利用AC自动机进行关键词提取

    Python--利用AC自动机进行关键词提取 目标:在之前写的文章[Python实现多模匹配--AC自动机]基础上,安装gcc(C编译器),再装ahocorasick ,并完成从文本中提取关键词的任务 ...

  5. python 复现AC自动机

    转载地址:https://www.cnblogs.com/nullzx/news/2017/09/09/7497991.html 详情请参考转载地址,代码如下: package string_alg; ...

  6. KMP算法、AC自动机算法的原理介绍以及Python实现

    KMP算法 要弄懂AC自动机算法,首先弄清楚KMP算法. 这篇文章讲的很好: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E ...

  7. 字符串匹配算法(AC自动机 Aho-Corasick)

    文章目录 1. 多模式串匹配 2. 经典多模式串匹配--AC自动机 2.1 AC自动机构建 2.2 在AC自动机上匹配主串 2.3 复杂度分析 3. python包 1. 多模式串匹配 前面学的BF. ...

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

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

  9. 字符串算法 | AC自动机算法

    1.简介 一种多模式串匹配算法, 可以快速从主串中同时找出所有包含的所有模式串. 对比KMP是单模式匹配, 虽然可以使用单模式串匹配算法逐个进行查找模式串, 但是实际场景中,若模式串的数量可能很大,并 ...

最新文章

  1. Python __call__详解
  2. windows常用命令有哪些(整理)
  3. 需要单机还是集群部署_5000W如何玩转Filecoin市场 部署最符合企业的集群模式
  4. Java Review - Queue和Stack 源码解读
  5. docker 删除tag为none的docker镜像
  6. codeforces C. Bits(数学题+或运算)
  7. 十进制转换为16进制
  8. MySql大数据量恢复
  9. Oracle数据库中dual是什么东西啊?
  10. [Bzoj1597][Usaco2008 Mar]土地购买(斜率优化)
  11. java的架构有哪些,java架构有哪些?
  12. 极客学院小程序视频教程
  13. win10怎么在开机时自动连接拨号上网
  14. All clients has disconnected from. You can graceful shutdown now., dubbo version: , current host
  15. 快速搭建接口自动化平台
  16. python prettytable输出对齐_漂亮的输出-----prettytable和colorama的使用
  17. 文献调研——存算一体的一些基础知识
  18. 直播平台搭建iOS 版本打包上架
  19. 短视频引流怎么做?如何利用短视频引流?短视频引流技巧
  20. pyhon入门turtle库画音符

热门文章

  1. c++ 排列组合_省考行测数量关系的老大难,排列组合的基本类型题及秒杀技巧...
  2. 201计算机基础知识,201年计算机应用基础备考练习题及答案
  3. java 在主方法中定义两个变量 调用方法进行加10_计算机考试二级考试Java模拟试题附答案...
  4. Spring Cloud Netflix Zuul 1.0 简化说明
  5. [tools]python的mkdocs模块分分钟将md搞成一个网站
  6. powershell 停止正在运行的用户应用
  7. 精益 React 学习指南 (Lean React)- 4.1 react 代码规范
  8. 阮一峰:炫耀从来不是我的动机,好奇才是
  9. 《写给大家看的设计书》封面评选结果揭晓
  10. 客运售票员_汽车客运站售票员售票操作规范