AC 자동 동기 python 구현
10217 단어 기계 학습
며칠 간 의 모색 끝 에 나 는 AC 자동 동 기 를 대충 실현 했다.
먼저 AC 자동 동기 가 무엇 인지 소개 합 니 다. Aho - Corasick automation 은 1975 년 에 베 어 실험실 에서 생 겨 난 유명한 다 중 모드 매 칭 알고리즘 입 니 다.다 중 모드 매 칭 알고리즘, 내 작업 (다 중 태그 매 칭 문제) 에 완벽 하 게 부합 합 니 다. 간단하게 말 하면 AC 자동 동 기 는 사전 트 리 + kmp 알고리즘 + 어 울 리 지 않 는 지침 입 니 다.
python 사전 트 리 만 들 기 (실제로는 트 리 만 들 기) python 에 구조 체 가 없 기 때문에 트 리 의 노드 는 하나의 클래스 로 표시 합 니 다.
class node(object):
def __init__(self):
self.next = {} # ,
self.fail = None # , AC
self.isWord = False # ,
self.word = "" #
다음은 AC 자동 동 기 를 정의 하 는 클래스 입 니 다.
class ac_automation(object):
def __init__(self):
self.root = node() #
사전 트 리 만 들 기:
def add(self, word):
temp_root = self.root
for char in word: #
if char not in temp_root.next: # ,
temp_root.next[char] = node()
temp_root = temp_root.next[char] #
temp_root.isWord = True # ,
temp_root.word = word #
fail 포인터 만 들 기:
def make_fail(self):
temp_que = [] # BFS
temp_que.append(self.root)
while len(temp_que) != 0:
temp = temp_que.pop(0)
p = None
for key,value in temp.next.item():
if temp == self.root: # fail
temp.next[key].fail = self.root
else:
p = temp.fail
while p is not None: # fial
if key in p.next: # fail ,
temp.next[key].fail = p.fail
break
p = p.fail
if p is None: # fail ,
temp.next[key].fail = self.root
temp_que.append(temp.next[key])
다 중 모드 일치:
def search(self, content):
p = self.root
result = []
currentposition = 0 #
while currentposition < len(content):
word = content[currentposition]
while word in p.next == False and p != self.root: # ,
p = p.fail
if word in p.next:
p = p.next[word]
else:
p = self.root
if p.isWord: # ,
result.append(p.word)
currentposition += 1
위의 세 가 지 를 결합 하면 AC 자동 동기 의 유형 이다.
class ac_automation(object):
def __init__(self):
self.root = node()
def add(self, word):
temp_root = self.root
for char in word:
if char not in temp_root.next:
temp_root.next[char] = node()
temp_root = temp_root.next[char]
temp_root.isWord = True
temp_root.word = word
def make_fail(self):
temp_que = []
temp_que.append(self.root)
while len(temp_que) != 0:
temp = temp_que.pop(0)
p = None
for key,value in temp.next.item():
if temp == self.root:
temp.next[key].fail = self.root
else:
p = temp.fail
while p is not None:
if key in p.next:
temp.next[key].fail = p.fail
break
p = p.fail
if p is None:
temp.next[key].fail = self.root
temp_que.append(temp.next[key])
def search(self, content):
p = self.root
result = []
currentposition = 0
while currentposition < len(content):
word = content[currentposition]
while word in p.next == False and p != self.root:
p = p.fail
if word in p.next:
p = p.next[word]
else:
p = self.root
if p.isWord:
result.append(p.word)
currentposition += 1
return result
테스트:
ac = ac_automation()
ac.add(' ')
ac.add(' ')
ac.add('666')
ac.add(' ')
ac.search(' , ')
[' ', ' ']
AC 자동 동 기 는 정말 좋 은 물건 입 니 다!
참고:https://github.com/metadata1984/pyAhocorasick
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
형태소 분석은 데스크톱을 구성하는 데 도움이?문자×기계 학습에 흥미를 가져와 개인 범위의 용도를 생각해, 폴더 정리에 사용할 수 있을까 생각해 검토를 시작했습니다. 이번 검토에서는 폴더 구성 & text의 읽기 → mecab × wordcloud를 실시하고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.