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()
运行结果:
我最喜欢吃的水果有:苹果、梨和香蕉 --->命中的关键词有: 梨 香蕉 苹果
我也喜欢吃香蕉,但是我不喜欢吃梨 --->命中的关键词有: 梨 香蕉