数据结构与算法_字符串匹配_Aho-Corasick 算法

字符串匹配算法

多模式匹配,就是同时搜索多个模式串。 是基于单模式串扩展而来的。所以其也有三种匹配模式。
  第一:基于前缀搜索模式,  代表有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
posted @ 2020-12-08 23:38  辰令  阅读(1051)  评论(0)    收藏  举报