【自然语言处理 AC自动机】标签匹配算法

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

猜你喜欢

转载自blog.csdn.net/u013421629/article/details/80930833