探秘高效字符串搜索:Alfred-Margaret
2024-05-31 00:46:14作者:魏献源Searcher
Alfred-Margaret是一个由Haskell语言实现的快速Aho-Corasick字符串搜索算法库,它在Channable项目中广泛应用于各种字符串处理操作。该库巧妙地利用了text包的内部UTF-16表示,以提高效率。想知道更多关于Aho-Corasick算法以及这个库的优化秘诀吗?可以查看这篇详细的公告博客文章。
性能优势
在真实数据集上的运行时间比较显示,Alfred-Margaret在与Java和Rust实现的性能较量中表现出色,甚至优于内存复制的速度基准(见下图):

想要了解更多关于这个基准测试的详细信息,包括数据集、测试设置和解读提示,可以查看博客文章。
LLVM优化提示
如果你使用的是LLVM而非GHC后端,请确保对比不同版本。在GHC 8.10.7上,使用LLVM 9相对于LLVM 12可能会显著改善基准测试时长。具体可参考这个问题。
使用示例
简单来说,Alfred-Margaret让你能轻松检查一个字符串是否包含任何指定的子串:
import qualified Data.Text.AhoCorasick.Automaton as Aho
import qualified Data.Text.AhoCorasick.Searcher as Searcher
searcher = Searcher.build Aho.CaseSensitive ["tshirt", "shirts", "shorts"]
-- 查找"short tshirts"中的匹配项
Searcher.containsAny searcher "short tshirts" -- > True
-- 查找"long shirt"中的匹配项
Searcher.containsAny searcher "long shirt" -- > False
-- 不区分大小写的查找
searcher' = Searcher.build Aho.IgnoreCase ["tshirt", "shirts", "shorts"]
Searcher.containsAny searcher' "Short TSHIRTS" -- > True
此外,你还可以进行多子串的顺序替换:
import Data.Text.AhoCorasick.Automaton (CaseSensitivity (..))
import qualified Data.Text.AhoCorasick.Replacer as Replacer
replacer = Replacer.build CaseSensitive [("tshirt", "banana"), ("shirt", "pear")]
-- 替换所有"tshirts for sale"中的"tshirt"和"shirts"
Replacer.run replacer "tshirts for sale" -- > "bananas for sale"
-- 同时替换多个子串
Replacer.run replacer "tshirts and shirts for sale"
-- > "bananas and pears for sale"
-- 处理重叠匹配情况
Replacer.run replacer "sweatshirts and shirtshirts"
-- > "sweabananas and shirbananas"
Replacer.run replacer "sweatshirts and shirttshirts"
-- > "sweabananas and pearbananas"
甚至,你可以获取所有可能重叠的匹配项:
import qualified Data.Text.AhoCorasick.Automaton as Aho
pairNeedleWithSelf text = (Aho.unpackUtf16 text, text)
automaton = Aho.build $ fmap pairNeedleWithSelf ["tshirt", "shirts", "shorts"]
allMatches = Aho.runText [] (\matches match -> Aho.Step (match : matches))
-- 获取"short tshirts"的所有匹配项
allMatches automaton "short tshirts"
> [ Match {matchPos = CodeUnitIndex 13, matchValue = "shirts"}
> , Match {matchPos = CodeUnitIndex 12, matchValue = "tshirt"}
> ]
-- 找到"sweatshirts and shirtshirts"的所有匹配项
allMatches automaton "sweatshirts and shirtshirts"
> [ Match {matchPos = CodeUnitIndex 27, matchValue = "shirts"}
> , Match {matchPos = CodeUnitIndex 26, matchValue = "tshirt"}
> , Match {matchPos = CodeUnitIndex 22, matchValue = "shirts"}
> , Match {matchPos = CodeUnitIndex 11, matchValue = "shirts"}
> , Match {matchPos = CodeUnitIndex 10, matchValue = "tshirt"}}
> ]
许可证
Alfred-Margaret遵循3-clause BSD许可证。
结语
无论是用于日志分析、文本挖掘还是搜索引擎,Alfred-Margaret都是一款强大的工具,它能帮助你在大量字符串数据中快速定位并替换目标子串。凭借其出色性能和易用性,这款库绝对值得你尝试。立即加入Haskell的Aho-Corasick世界,让您的字符串处理任务变得更快更高效!
登录后查看全文
热门项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0210
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0133
GLM-5.2智谱开源 GLM-5.2,这是针对长文本任务的最新旗舰模型。相较于前代产品 GLM-5.1,它在长文本任务处理能力上实现了显著飞跃,并且首次在稳定的 100 万 token 上下文中提供这一能力。Jinja00
JoyAI-EchoJoyAI-Echo,这是一个独立的、仅用于推理的版本,旨在实现分钟级多镜头音视频生成。它采用了经过蒸馏的DMD生成器、配对的跨模态记忆以及故事级别的一致性。其性能的核心在于,一个跨模态视听记忆库能够在长达五分钟的视频中保持角色外观和语音音色的一致性。同时,一个训练后处理流程将基于记忆的强化学习与分布匹配蒸馏相结合,实现了7.5倍的速度提升,显著增强了视觉质量和对齐效果。00
wgai开箱即用的JAVAAI在线训练识别平台&OCR平台AI合集包含旦不仅限于(车牌识别、安全帽识别、抽烟识别、常用类物识别等) 图片和视频识别,可自主训练任意场景融合了AI图像识别opencv、yolo、ocr、esayAI内核识别;AI智能客服、AI语言模型、 无任何第三方API接口可定制化自主离线化部署并自主化行业化使用避免占用内存、GPU消耗训练与识别分开使用;Java06
tiny-universe《大模型白盒子构建指南》:一个全手搓的Tiny-UniverseJupyter Notebook03
热门内容推荐
最新内容推荐
项目优选
收起
deepin linux kernel
C
32
16
暂无描述
Dockerfile
772
5.07 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
870
2 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
468
461
Ascend Extension for PyTorch
Python
749
938
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
695
1.38 K
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.09 K
1.14 K
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.03 K
271
昇腾LLM分布式训练框架
Python
182
226
CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。
Python
1.03 K
641