字符串匹配算法
多模式匹配,就是同时搜索多个模式串。 是基于单模式串扩展而来的。所以其也有三种匹配模式。
第一:基于前缀搜索模式, 代表有mutilple shift-and 算法和Aho-Corasick 算法,
第二:基于后缀搜索模式, 代表有Commentz-Walter算法, set Horspool 算法和他的改进Wu-Manber算法
第三:基于子串的搜索模式,代表有 MultiBDM,SBDM,SBOM 算法
AC算法思想
Aho-Corasick自动机算法(简称AC自动机)
AC算法中有三个核心函数,分别是:
success; 成功转移到另一个状态(也称goto表或success表)
failure; 不可顺着字符串跳转的话,则跳转到一个特定的节点(也称failure表),从根节点到这个特定的节点的路径恰好是失败前的文本的一部分。
emits; 命中一个模式串(也称output表
实现
Aho CoraSick Algorithm For Efficient String Matching
Java library for efficient string matching against a large set of keywords
<!-- https://mvnrepository.com/artifact/org.ahocorasick/ahocorasick -->
<dependency>
<groupId>org.ahocorasick</groupId>
<artifactId>ahocorasick</artifactId>
<version>0.4.0</version>
</dependency>
源代码:
有两个包
org.ahocorasick.trie 封装了Trie树
org.ahocorasick.interval 封装了一棵线段树
其中
/**
* Provides a fluent interface for constructing Trie instances.
*
* @return The builder used to configure its Trie.
*/
public static TrieBuilder builder() {
return new TrieBuilder();
}
private TrieBuilder() {}
public static class TrieBuilder {
private final TrieConfig trieConfig = new TrieConfig();
private final Trie trie = new Trie(trieConfig);
}
/**
* Configure the Trie based on the builder settings.
*
* @return The configured Trie.
*/
public Trie build() {
this.trie.constructFailureStates();
return this.trie;
}
使用:
构建trie
添加链接
查找
说明:
字典树的构建方法
private static Trie buildTrie(Set<String> stringSet) {
return Trie.builder().addKeywords(stringSet).build();
}
分解:
private synchronized static void initTrie(Set<String> stringSet) {
if(trie == null) {
TrieBuilder tb = Trie.builder();
tb.addKeywords(stringSet);
trie = tb.build();
}
}
应用场景:
1.敏感词过滤
2.语料标注:
利用开源org.ahocorasick.trie将输入的词加入trie树,
从字符串中识别出trie树包含的词函数,读取特定文档,
判断是否有文本行,若有则取出文本行与字典树匹配,匹配成功的词加入tagList中,遍历tagList
参考:
Spark UDF加载外部资源 https://cloud.tencent.com/developer/article/1688828
一种用于hmm的分词训练语料标注方法
敏感词过滤的算法原理之 Aho-Corasick 算法 https://www.cnblogs.com/zyguo/p/4705270.html