• 数据结构与算法_字符串匹配_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
  • 相关阅读:
    service
    Specify the input method type
    添加机型
    高数公式
    MacOS 常用终端命令大全
    Linux-常用命令大全
    Mac系统下利用ADB命令使用
    iOS工程师学习Android开发----AndroidStudio环境准备
    封装socket 到vue2.x 使用
    记录一次因为OutOfMemoryError而发现的Excel文件导入慢的优化思路
  • 原文地址:https://www.cnblogs.com/ytwang/p/14106352.html
Copyright © 2020-2023  润新知