Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。
要学会AC自动机,我们必须知道什么是Trie,也就是字典树。Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。
# -*- encoding=utf-8 -*-
"""
AC自动机算法:该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。多模匹配算法,完美契合我的任务(多标签匹配问题)简单地讲,AC自动机就是字典树+kmp算法+失配指针
"""
import pickle
from sklearn.externals import joblib #模型导出
import time
time1=time.time()
import pandas as pd
class node(object):
def __init__(self):
self.next = {} #相当于指针,指向树节点的下一层节点
self.fail = None #失配指针,这个是AC自动机的关键
self.isWord = False #标记,用来判断是否是一个标签的结尾
self.word = "" #用来储存标签
class ac_automation(object):
def __init__(self):
self.root = node()
def addword(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)
p = self.root
currentposition += 1
return result
if __name__ == '__main__':
ah = ac_automation()
word=pd.read_csv('C:\\Users\\xiaohu\\Desktop\\文本挖掘\\赛事主题内容标签\\excel\\ftc.txt',sep='\t')
keyword=set(word['关键词'])
for each in keyword:
ah.addword(each)
# 保存模型
# sklearn中提供了高效的模型持久化模块joblib,将模型保存至硬盘。
#joblib.dump(ah, 'C:\\Users\\xiaohu\\Desktop\\文本挖掘\\赛事主题内容标签\\excel\\AC_model.pkl',compress=3)# 模型导出
# ah = joblib.load('C:\\Users\\xiaohu\\Desktop\\文本挖掘\\赛事主题内容标签\\excel\\AC_model.pkl') # 模型导入
lable=set(ah.search(u'昨天熬夜看皇马,主播超激情, 氛围太好了, 激情到想给主播点外卖送啤酒,期待更激情的世界杯!'))
print(lable)
time2 = time.time()
print('总共耗时:' + str(time2 - time1) + 's')
效果:
E:\laidefa\python.exe "E:/Program Files/pycharmproject/香蕉球用户话题/AC自动机.py"
{'世界杯', '皇马'}
总共耗时:0.5483744144439697s
Process finished with exit code 0