当前位置: 首页 > news >正文

[Python3] 多模式字符串搜索 `Aho-Corasick`

ahocorasick.Automaton 是 Python 中 pyahocorasick 库提供的一个类,用于实现 Aho-Corasick 自动机。Aho-Corasick 算法是一种用于精确或近似多模式字符串搜索的高效算法。

通过 pip install pyahocorasick 安装 pyahocorasick 库。
并且,该模块是用 C 编写的,安装时需要有 C 编译器来编译本机 Cpython 扩展。

使用 ahocorasick.Automaton 类的一般步骤如下:

  1. 导入 ahocorasick 库:import ahocorasick

  2. 创建 Automaton 对象:a = ahocorasick.Automaton()

  3. (可选)将字符串键及其关联值添加到自动机,可作为 trie 树使用。例如:

    for idx, key in enumerate('heherhersshe'.split()):a.add_word(key, (idx, key))
    
  4. 调用 make_automaton() 方法完成并创建 Aho-Corasick 自动机:a.make_automaton()

创建好自动机后,可以使用以下主要方法进行搜索操作:

  • iter(string, (start, (end))):使用提供的输入字符串执行 Aho-Corasick 搜索过程。它返回一个迭代器,为在字符串中找到的键返回元组 (end_index, value),其中 end_index 是匹配结束的索引位置,value 是与匹配的键相关联的值。

  • iter_long(string, (start, (end))):返回一个搜索最长、非重叠匹配的迭代器(automaton_search_iter_long 类的对象)。

以下是一个使用 ahocorasick.Automaton 进行多模式字符串搜索的示例代码:

import ahocorasick as aha = ah.automaton()with open('userdict.txt', 'r', encoding='utf-8') as f2:  # 加载文件keywords = (a.strip() for a in f2.readlines())  # 加载关键词# 利用 add_word 方法将关键词加入自动机!for x in range(len(keywords)):a.add_word(keywords[x], (x, keywords[x]))  # 第二个参数为自定义的返回值# 创建 aho-corasick 自动机
a.make_automaton()with open('jianjie.txt', 'r', encoding='utf-8') as f:  # 打开要检索文档jianjie = f.read()  # 读取正文(如果太多,可以分断加载,分段检索)# 开始查找,该方法匹配最长的字符串
for item in a.iter_long(jianjie):print(item)
print('-' * 20)# 开始查找,该方法匹配所有字符串
for item in a.iter(jianjie):print(item)

在上述示例中,首先创建了一个自动机对象 a,然后从文件中读取关键词,并使用 add_word 方法将关键词添加到自动机中。接着调用 make_automaton 方法创建 Aho-Corasick 自动机。最后,通过打开另一个文件读取要搜索的正文,并使用 iter_longiter 方法进行匹配查找,并打印出匹配的结果。

Aho-Corasick 自动机的优点包括能够在一次运行中找到给定集合所有字符串,适用于多模式字符串匹配的场景,例如网络内容过滤、版权检测、病毒扫描等,在自然语言处理中查找特定词汇或模式,以及生物信息学中在 DNA 或蛋白质序列分析中寻找特定的序列模式等方面都有应用。

http://www.lryc.cn/news/406097.html

相关文章:

  • 4 Types of Kaggle Competitions
  • 【STM32】stm32中GPIO_ReadInputDataBit()是什么意思
  • Study--Oracle-07-ASM相关参数(三)
  • 【STM32嵌入式系统设计与开发拓展】——12_Timer(定时器中断实验)
  • iPhone 17系列取消17 Plus版本?新一代苹果手机迎来新变革
  • Bootstrap实现dialog上一步下一步多个弹窗交互
  • iOS实际开发中使用数据驱动页面布局
  • 后端开发刷题 | 笔试
  • ROS2入门到精通—— 2-8 ROS2实战:机器人安全通过狭窄区域的方案
  • STM32自己从零开始实操10:PCB全过程
  • 折线图时间统计
  • Prompt工程:与AI聊天机器人更好地交流
  • BGP之选路MED
  • KunDB4.0:安全能力与Oracle兼容性提升,支持跨系统多租户部署
  • JVM的 6 种垃圾回收算法
  • 【SOC 芯片设计 DFT 学习专栏 -- DFT OCC 与 ATPG的介绍】
  • 自动驾驶-机器人-slam-定位面经和面试知识系列03之C++STL面试题(01)
  • 红狮金业解读:分析高价位黄金的后续投资吸引力
  • LDR6020双盲插便携显示器应用
  • 【HashMap源码学习】
  • Git关联本地仓库和远程仓库
  • 【Django】在vscode中新建Django应用并新增路由
  • DT浏览器首页征集收录海内外网址
  • 便携解码耳放
  • 响应式编程框架Reactor之 Flux 和 Mono 的介绍和区别
  • 2.3 openCv 对矩阵执行掩码操作
  • 贪心算法(三) ---cmp_to_key, 力扣452,力扣179
  • 学生信息管理系统详细设计文档
  • leetcode10 -- 正则表达式匹配
  • Binius-based zkVM:为Polygon AggLayer开发、FPGA加速的zkVM