1、相关介绍
python ahocorasick介绍
ahocorasick模块介绍
ahocorasick是个python模块,Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多。
由两种数据结构实现:trie和Aho-Corasick自动机,简称AC自动机 。
多模式匹配:
多模式匹配就是有多个模式串P1,P2,P3…,Pm,求出所有这些模式串在连续文本T1…n中的所有可能出现的位置。
例如:求出模式集合{“nihao”,“hao”,“hs”,“hsr”}在给定文本"sdmfhsgnshejfgnihaofhsrnihao"中所有可能出现的位置。
算法原理:
从root节点开始,每次根据读入的字符沿着自动机向下移动。
当读入的字符,在分支中不存在时,递归走失败路径。如果走失败路径走到了root节点,则跳过该字符,处理下一个字符。
因为AC自动机是沿着输入文本的最长后缀移动的,所以在读取完所有输入文本后,最后递归走失败路径,直到到达根节点,这样可以检测出所有的模式。
Trie是一个字符串索引的词典,检索相关项时时间和字符串长度成正比。
AC自动机能够在一次运行中找到给定集合所有字符串。
AC自动机其实就是在Trie树上实现KMP,可以完成多模式串的匹配。
具体请参考原文链接:https://blog.csdn.net/u010569893/article/details/97136696
2、相关库安装
conda install pyahocorasick
报错:PackagesNotFound
继续输入
anaconda search -t conda pyahocorasick
执行
conda install -c https://conda.anaconda.org/conda-forge pyahocorasick
最后输入y,就安装完成了
然后在程序中执行:
import ahocorasick
即可正常使用
3、实例展示
import ahocorasick,re
class AC_tree(object):
"""
## AC自动机提取关键词
"""
def __init__(self):
pass
def build_actree(self,words):
"""
AC-TREE
"""
actree = ahocorasick.Automaton()
for index, word in enumerate(words):
actree.add_word(word, (index, word))
actree.make_automaton()
return actree
def build_actree_file(self,path):
with open(path, 'r', encoding='utf-8') as f:
data = f.readlines()
new_data = [every.strip() for every in data]
actree = self.build_actree(new_data)
return actree
def search_entity(self,text,entity_tree):
entity_list = []
for i in entity_tree.iter(text):
entity = i[1][1]
entity_list.append(entity)
return entity_list
def main(self,**kwargs):
self.ac_equipment = self.build_actree_file(kwargs['path'])
entity_list=self.search_entity(kwargs['content'],self.ac_equipment)
return list(set(entity_list))
@staticmethod
def cut_chinese_sent(para):
"""
Cut the Chinese sentences more precisely
"""
para = re.sub(r'\r\n', r'', para)
para = re.sub(r'([。!?\?])([^”’])', r'\1\n\2', para)
para = re.sub(r'(\.{6})([^”’])', r'\1\n\2', para)
para = re.sub(r'(\…{2})([^”’])', r'\1\n\2', para)
para = re.sub(r'([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para)
para = para.rstrip()
return [sent.strip() for sent in para.split("\n") if sent and len(sent.strip()) > 0]
if __name__=='__main__':
content = "警方在现场查获30多把刀具和一把手枪,其中包括长50公分的大砍刀。伊拉克西部发生汽车炸弹袭击致3人死亡。" \
"\新华社巴格达10月13日电(记者白平)伊拉克一名地方官员13日说,伊拉克西部安巴尔省当天发生一起汽车炸弹袭击事件,造成包括一名军官在内的3名伊拉克军人死亡。" \
"安巴尔省鲁特巴镇镇长伊马德·杜莱米对新华社记者说,一支伊拉克军队的巡逻队当天下午在鲁特巴镇东部发现一辆被遗弃在路边的汽车,车内有一具遗体。" \
"当巡逻队准备对车内的遗体进行检查时,汽车发生爆炸,造成包括一名军官在内的3名军人死亡。杜莱米表示,这起汽车炸弹袭击可能是极端组织“伊斯兰国”武装分子所为,伊拉克军队已展开行动,捉拿袭击凶手。" \
"2017年12月,伊拉克宣布取得打击极端组织“伊斯兰国”的历史性胜利,但目前伊境内仍有一些极端分子残余,伺机发动袭击。"
for i in AC_tree().cut_chinese_sent(content):
kwagrsStr={'content':i,'path':'../dict/equipment.txt'}
search_entity=AC_tree().main(** eval("dict({})".format(kwagrsStr)))
print(search_entity)
结果如下: