python ahocorasick介绍

python ahocorasick介绍

ahocorasick模块介绍

ahocorasick是个python模块,Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多。

由两种数据结构实现:trie和Aho-Corasick自动机,简称AC自动机 。

多模式匹配:

多模式匹配就是有多个模式串P1,P2,P3…,Pm,求出所有这些模式串在连续文本T1…n中的所有可能出现的位置。

例如:求出模式集合{“nihao”,“hao”,“hs”,“hsr”}在给定文本"sdmfhsgnshejfgnihaofhsrnihao"中所有可能出现的位置

算法原理:

从root节点开始,每次根据读入的字符沿着自动机向下移动。

当读入的字符,在分支中不存在时,递归走失败路径。如果走失败路径走到了root节点,则跳过该字符,处理下一个字符。

因为AC自动机是沿着输入文本的最长后缀移动的,所以在读取完所有输入文本后,最后递归走失败路径,直到到达根节点,这样可以检测出所有的模式。

Trie是一个字符串索引的词典,检索相关项时时间和字符串长度成正比

AC自动机能够在一次运行中找到给定集合所有字符串。

AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配。

示例:

#coding:utf-8
import ahocorasick

def make_AC(AC, word_set):
    for word in word_set:
        AC.add_word(word,word)
    return AC

def test_ahocorasick():
    '''
    ahocosick:自动机的意思
    可实现自动批量匹配字符串的作用,即可一次返回该条字符串中命中的所有关键词
    '''
    key_list = ["苹果", "香蕉", "梨", "橙子", "柚子", "火龙果", "柿子", "猕猴挑"]
    AC_KEY = ahocorasick.Automaton()
    AC_KEY = make_AC(AC_KEY, set(key_list))
    AC_KEY.make_automaton()
    test_str_list = ["我最喜欢吃的水果有:苹果、梨和香蕉", "我也喜欢吃香蕉,但是我不喜欢吃梨"]
    for content in test_str_list:
        name_list = set()
        for item in AC_KEY.iter(content):#将AC_KEY中的每一项与content内容作对比,若匹配则返回
            name_list.add(item[1])
        name_list = list(name_list)
        if len(name_list) > 0:
            print content, "--->命中的关键词有:", "\t".join(name_list)
if __name__ == "__main__":
    test_ahocorasick()

运行结果:

我最喜欢吃的水果有:苹果、梨和香蕉 --->命中的关键词有: 梨	香蕉	苹果
我也喜欢吃香蕉,但是我不喜欢吃梨 --->命中的关键词有: 梨	香蕉

你可能感兴趣的:(python基础)