Python——利用AC自动机进行关键词提取

目标:在之前写的文章【Python实现多模匹配——AC自动机】基础上,安装gcc(C编译器),再装ahocorasick ,并完成从文本中提取关键词的任务。

PS:由于原理之前已经介绍,本文只介绍安装过程,以及如何应用。还想看原理的朋友,请戳【模式匹配】Aho-Corasick自动机与Aho-Corasick自动机浅析。

1、安装ahocorasick(python3)

终端输入:

conda install pyahocorasick
anaconda search -t conda pyahocorasick
conda install -c https://conda.anaconda.org/conda-forge pyahocorasick

最后输入y,就安装完成了。参考博客:python中安装ahocorasick库(原博客已打不开)。

2、Python例子(参考,并优化ahocorasick 的使用中出现的问题和简单使用)

import ahocorasick
import timeclass AhocorasickNer:def __init__(self, user_dict_path):self.user_dict_path = user_dict_pathself.actree = ahocorasick.Automaton()def add_keywords(self):flag = 0with open(self.user_dict_path, "r", encoding="utf-8") as file:for line in file:word, flag = line.strip(), flag + 1self.actree.add_word(word, (flag, word))self.actree.make_automaton()def get_ner_results(self, sentence):ner_results = []# i的形式为(index1,(index2,word))# index1: 提取后的结果在sentence中的末尾索引# index2: 提取后的结果在self.actree中的索引for i in self.actree.iter(sentence):ner_results.append((i[1], i[0] + 1 - len(i[1][1]), i[0] + 1))return ner_resultsif __name__ == "__main__":ahocorasick_ner = AhocorasickNer(user_dict_path="../../funNLP/organization_dict.txt")ahocorasick_ner.add_keywords()while True:sentence = input("\nINPUT : ")ss = time.time()res = ahocorasick_ner.get_ner_results(sentence)print("TIME  : {0}ms!". format(round(1000*(time.time() - ss), 3)))print("OUTPUT:{0}".format(res))

输出:

说明:

1、代码中的文件【funNLP/organization_dict.txt】来自于:funNLP-公司名字词库,注册就能快速下载(比github快N倍);

2、文件中的词典属于百万级别,从文本中提取关键词的耗时在0.05ms左右(个人笔记本)。

补充:纯Python版本的AC自动机,代码如下(待更新):

#!/usr/bin/env python
# -*- coding:utf-8 -*-"""
@Author   :geekzw
@Contact  :1223242863@qq.com
@File     :AC_ner.py
@Time     :2020/3/5 12:56 AM
@Software :Pycharm
@Copyright (c) 2020,All Rights Reserved.
"""import timeclass node(object):def __init__(self):self.next = {}       # 相当于指针,指向树节点的下一层节点self.fail = None     # 失配指针,这个是AC自动机的关键self.isWord = False  # 标记,用来判断是否是一个标签的结尾self.word = ""       # 用来储存标签class ac_automation(object):def __init__(self, user_dict_path):self.root = node()self.user_dict_path = user_dict_pathdef add(self, word):temp_root = self.rootfor char in word:if char not in temp_root.next:temp_root.next[char] = node()temp_root = temp_root.next[char]temp_root.isWord = Truetemp_root.word = word# 添加文件中的关键词def add_keyword(self):with open(self.user_dict_path, "r", encoding="utf-8") as file:for line in file:self.add(line.strip())def make_fail(self):temp_que = []temp_que.append(self.root)while len(temp_que) != 0:temp = temp_que.pop(0)p = Nonefor key,value in temp.next.item():if temp == self.root:temp.next[key].fail = self.rootelse:p = temp.failwhile p is not None:if key in p.next:temp.next[key].fail = p.failbreakp = p.failif p is None:temp.next[key].fail = self.roottemp_que.append(temp.next[key])def search(self, content):p = self.rootresult = set()index = 0while index < len(content) - 1:currentposition = indexwhile currentposition < len(content):word = content[currentposition]while word in p.next == False and p != self.root:p = p.failif word in p.next:p = p.next[word]else:p = self.rootif p.isWord:end_index = currentposition + 1result.add((p.word, end_index - len(p.word), end_index))breakcurrentposition += 1p = self.rootindex += 1return resultif __name__ == "__main__":ac = ac_automation(user_dict_path="../../funNLP/organization_dict.txt")ac.add_keyword()  # 添加关键词到AC自动机while True:query = input("\nINPUT: ")ss = time.time()res = ac.search(query)print("TIME:  {0} ms!".format(round(1000 * (time.time() - ss), 3)))print("OUTPUT:", res)

输出:

说明:对比发现,自己改写的纯Python版本,存在优化空间,降低耗时成本!

参考文献

1、字符串多模式匹配:AC算法的Java实现与原理介绍

2、Aho-Corasick的Github代码

3、敏感词检测算法小结

4、AC自动机-知乎

5、基于 AC 自动机和贝叶斯方法的垃圾内容识别

6、AC自动机的加速版-Github

7、利用AC自动机进行关键字的提取和过滤(Java,美团代码)

8、AC算法在美团上单系统的应用

最后分享一个IntelliJ IDEA的激活码:IntelliJ IDEA 2019.3激活破解教程(亲测有效,可激活至 2089 年,持续更新~),感谢原博主。

Python——利用AC自动机进行关键词提取相关推荐

  1. [Python]利用jieba.analyse进行 关键词 提取

    1.简单应用 代码如下: 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @File : jieba.analyse.py 4 # @Aut ...

  2. python 英文关键词提取_python 利用jieba.analyse进行 关键词提取

    1.简单应用 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : jieba.analyse.py # @Author: 赵路仓 ...

  3. 利用jieba.analyse进行 关键词 提取

    利用jieba.analyse进行 关键词 提取 import jieba.analysetext='2020年5月11日至17日,全市共接报电信诈骗警情80宗.' Key=jieba.analyse ...

  4. python实现AC自动机

    ac自动机可以看成带指针的字典树,每个节点的指针指向了当前节点的最大后缀的位置.在建立字典树后,可以层次遍历字典树来构建fail指针,根节点的直接孩子(第一层节点)的fail指针肯定是指向根节点的,之 ...

  5. python 英文文本中的关键词提取

    python 英文关键词提取详细教程: https://opensourcelibs.com/lib/pytextrank # To install from PyPi: 慢就加镜像 -i pytho ...

  6. python初学者笔记——百度搜索关键词提取问题解决

    声明:本文为作者原创,转载请标明出处,欢迎大家共同学习讨论.文章中有其他文章的链接,如有侵权,请及时联系我,进行处理. 引用的文章: 爬虫行动被限制,改换ip只是其中一个办法 python爬虫设置请求 ...

  7. python 复现AC自动机

    转载地址:https://www.cnblogs.com/nullzx/news/2017/09/09/7497991.html 详情请参考转载地址,代码如下: package string_alg; ...

  8. 利用Ansj进行新闻关键词提取

    之前已经提到过使用FudanNLP进行新闻关键词提取,无奈组长不满意于是换成了ictclas,在我的ubuntu13.04上面ictclas跑得很好,可惜到别人的机器上就报错,没办法,只好再一次换工具 ...

  9. java 文本分析 关键词提取,利用ANSJ进行文本关键词提取

    以前已经提到过使用FudanNLP进行新闻关键词提取,无奈组长不满意因而换成了ictclas,在个人ubuntu13.04上面ictclas跑得很好,惋惜到别人的机器上就报错,没办法,只好再一次换工具 ...

最新文章

  1. Hadoop源代码分析(包mapreduce.lib.input)
  2. Vue_双向绑定解析以及指令介绍
  3. java可以多重继承吗_Java中的多重继承与组合vs继承
  4. [引]生成加密和解密的密钥
  5. 云服务器装哪些版本的系统好,云服务器按装什么系统好
  6. 火爆的大数据被什么拖了后腿
  7. 第二章 Jsp基本语法
  8. Redis安装可视化管理软件
  9. MySQL gtid purge_MySQL中set gtid_purged的行为变更及对备份恢复的影响
  10. 彻底删除aws亚马逊服务器使之不再计费
  11. Error response from daemon: conflict: unable to delete acdcfe83bcc5 (must be forced) - image is bein
  12. Jdt-compiler是什么?有什么作用
  13. F检验为什么要求各比较组的方差齐…
  14. 【图像分割】基于形态学重建和过滤改进FCM算法(FRFCM)实现图像分割matlab代码
  15. 【STM32 HAL】用旋钮电位器进行PID调参
  16. 蓝桥杯 算法训练 Tennis Rackets (50%通过)
  17. Ubuntu 20.04 LTS 关闭 Swap 分区
  18. 软件逆向工程学习(一)
  19. 编译原理(十八)——运行时存储空间管理
  20. 用C语言50行代码绘制一朵玫瑰花

热门文章

  1. 射频识别技术漫谈(6-10)
  2. 十:以理论结合实践方式梳理前端 React 框架 ———集成框架
  3. 布隆过滤器 Guava布隆过滤器的使用
  4. 奈飞财报不及预期,盘后重挫7%
  5. 飞讯管理员端的后端数据表格展现
  6. matlab列向量创建,matlab创建列向量
  7. 03-视频字幕悬停效果
  8. 弱网下的极限实时视频通信
  9. 深度评测小米笔记本 Pro 14/15 增强版 2021款 怎么样
  10. TP5+微信小程序通过无限分类实现分类功能