#!/usr/bin/python2.7
#-*-coding=utf-8-*-
class Trie:
"""用来存储关键词和进行多模匹配 """
def __init__(self):
self.nodetype=0
self.child={}
self.fail=None
self.strout=""
self.tag=0
def add(self,word):
""" 添加关键词word, word--unicode码 """
node=self
for w in word:
print w
if w not in node.child:
node.child[w]=Trie()
node=node.child[w]
node.nodetype=1
node.strout=word
self.tag=0
def find(self,word):
""" 在trie树中搜索关键词, word---unicode码"""
node=self
for w in word:
if w not in node.child:
return False
node=node.child[w]
if node.nodetype==1:
return True
else:
return False
def getfail(self):
"""计算每个节点的失败跳转节点"""
if self.tag:
return
que=[]
self.fail=self
que.append(self)
while len(que):
par=que[0]
del que[0]
for w,ch in par.child.items():
while par.fail is not self and (w not in par.fail.child):
par=par.fail
if par.fail is self and ((w not in self.child) or self.child[w] is ch):
ch.fail=self
else:
ch.fail=par.fail.child[w]
que.append(ch)
self.tag=1
def parse(self,lang):
""" 对lang进行多模匹配,返回‘(匹配位置,keyword)’的列表,lang---unicode码"""
if self.tag==0:
self.getfail()
result=[]
node=self
i=0
n=len(lang)
while i<n:
if lang[i] in node.child:
node=node.child[lang[i]]
if node.nodetype==1:
result.append((i-len(node.strout)+1,node.strout))
i+=1
else:
if node is self:
i+=1
else:
node=node.fail
return result
基于trie树的AC多模匹配算法
原文作者:Trie树
原文地址: https://blog.csdn.net/shaolianbo/article/details/8557226
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/shaolianbo/article/details/8557226
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。