Python——利用AC自动机进行关键词提取
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自动机进行关键词提取相关推荐
- [Python]利用jieba.analyse进行 关键词 提取
1.简单应用 代码如下: 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @File : jieba.analyse.py 4 # @Aut ...
- python 英文关键词提取_python 利用jieba.analyse进行 关键词提取
1.简单应用 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : jieba.analyse.py # @Author: 赵路仓 ...
- 利用jieba.analyse进行 关键词 提取
利用jieba.analyse进行 关键词 提取 import jieba.analysetext='2020年5月11日至17日,全市共接报电信诈骗警情80宗.' Key=jieba.analyse ...
- python实现AC自动机
ac自动机可以看成带指针的字典树,每个节点的指针指向了当前节点的最大后缀的位置.在建立字典树后,可以层次遍历字典树来构建fail指针,根节点的直接孩子(第一层节点)的fail指针肯定是指向根节点的,之 ...
- python 英文文本中的关键词提取
python 英文关键词提取详细教程: https://opensourcelibs.com/lib/pytextrank # To install from PyPi: 慢就加镜像 -i pytho ...
- python初学者笔记——百度搜索关键词提取问题解决
声明:本文为作者原创,转载请标明出处,欢迎大家共同学习讨论.文章中有其他文章的链接,如有侵权,请及时联系我,进行处理. 引用的文章: 爬虫行动被限制,改换ip只是其中一个办法 python爬虫设置请求 ...
- python 复现AC自动机
转载地址:https://www.cnblogs.com/nullzx/news/2017/09/09/7497991.html 详情请参考转载地址,代码如下: package string_alg; ...
- 利用Ansj进行新闻关键词提取
之前已经提到过使用FudanNLP进行新闻关键词提取,无奈组长不满意于是换成了ictclas,在我的ubuntu13.04上面ictclas跑得很好,可惜到别人的机器上就报错,没办法,只好再一次换工具 ...
- java 文本分析 关键词提取,利用ANSJ进行文本关键词提取
以前已经提到过使用FudanNLP进行新闻关键词提取,无奈组长不满意因而换成了ictclas,在个人ubuntu13.04上面ictclas跑得很好,惋惜到别人的机器上就报错,没办法,只好再一次换工具 ...
最新文章
- Hadoop源代码分析(包mapreduce.lib.input)
- Vue_双向绑定解析以及指令介绍
- java可以多重继承吗_Java中的多重继承与组合vs继承
- [引]生成加密和解密的密钥
- 云服务器装哪些版本的系统好,云服务器按装什么系统好
- 火爆的大数据被什么拖了后腿
- 第二章 Jsp基本语法
- Redis安装可视化管理软件
- MySQL gtid purge_MySQL中set gtid_purged的行为变更及对备份恢复的影响
- 彻底删除aws亚马逊服务器使之不再计费
- Error response from daemon: conflict: unable to delete acdcfe83bcc5 (must be forced) - image is bein
- Jdt-compiler是什么?有什么作用
- F检验为什么要求各比较组的方差齐…
- 【图像分割】基于形态学重建和过滤改进FCM算法(FRFCM)实现图像分割matlab代码
- 【STM32 HAL】用旋钮电位器进行PID调参
- 蓝桥杯 算法训练 Tennis Rackets (50%通过)
- Ubuntu 20.04 LTS 关闭 Swap 分区
- 软件逆向工程学习(一)
- 编译原理(十八)——运行时存储空间管理
- 用C语言50行代码绘制一朵玫瑰花