C++中的Aho Corasick自动机实现

aca的Python项目详细描述


Python
BR/>由Timo PeMangson @ FundRe射束(HTTPS://FundBeaMe])BR/> BR/>此包是AHO Cracask自动机的C++实现,用Python包括,具有以下特点:
BR/> *字典匹配线性o(n)复杂度
*有效字符串->;字符串字典
*序列化
*在最大化匹配标记数的同时消除重叠的功能


有关详细信息,请参阅下面的示例。



aho–corasick算法是alfred v.aho和margaret j.corasick发明的一种字符串搜索算法。
它是一种字典匹配算法,用于在输入文本中定位有限字符串集("字典")的元素。
它匹配所有字符串同时。
算法的复杂度在字符串长度加上搜索文本的长度加上输出匹配项的数量上是线性的。
请注意,由于找到了所有匹配项,如果每个子字符串都匹配,则可能存在二次匹配数(例如dictionary=a,aa,aaa,aaaa,输入字符串是aaaa)。该算法构造了一个有限状态机,它类似于trie,在不同的内部节点之间有额外的链接。
这些额外的内部链接允许在失败的字符串匹配之间快速转换(例如,在trie中搜索不包含cat但包含cart的cat,因此将在以ca为前缀的节点处失败),失败到共享一个公共前缀的trie的其他分支(例如,在前一种情况下,属性的分支可能是最好的横向转换。
这允许自动机在字符串匹配之间进行转换,而无需回溯。

当预先知道字符串字典(例如计算机病毒数据库)时,自动机的构造可以离线执行一次,编译后的自动机存储起来供以后使用。
在这种情况下,它的运行时间是输入长度加上匹配条目数的线性关系。

有关详细信息,请参阅https://en.wikipedia.org/wiki/aho%e2%80%93corasick_算法。

工作。


自动售货机的单词
止痛药=['扑热息痛','布洛芬','盐酸']
自动售货机。添加所有(止痛药)

匹配文本上的字典
文本='扑热息痛和盐酸是一种缓解疼痛和发烧的药物。扑热息痛比布洛芬在自动匹配中的效率低。获取匹配(文本):
print(match.start,match.end,match.elems)

```

输出:

`````
0 11对乙酰氨基酚
16 28氢氯化物
74 85对乙酰氨基酚
109 118布洛芬
````

automaton
automaton=automaton()


]
自动机。添加所有(名称)

确保文本标记化
text='Tom Anderson Jr和Yuri Artyukhin在我的项目中工作'.split()

for match in automaton.get_matches(text):
print(match.start,match.end,match.elems,match.label)
```

"artyukhin"]developer
```

请注意,字典中同时包含tom anderson和tom anderson jr.
默认情况下,匹配器会删除重叠的匹配项,但此功能可以禁用。


``python
print('all matches')
['tom'、'anderson'、'jr']designer
46['yuri'、'artyukhin']developer
`````

有一些特定于实现的约束:
*键只能是字符串或字符串列表
*值必须是非空字符串(长度大于0)
*删除键不会释放内存,为此,您需要重新生成自动机
*items()将始终生成字符串列表

`` python
='形容词'
map['acid']='名词'
map['acid']='形容词'


打印(map['invalid key'])
```

output:

``````
`````
```keyerror:'invalid key'
````

--

``python
'默认值')
```

输出:
````
`````

--

``python
nb!特定于实现的特殊情况:空字符串表示"缺少"值,所以你不能使用这些
map['special']='
print(map['special']]
````




`````
``````





`````` python
``你可以删除
delmap['electrify']

;试图删除一个不存在的项会引发一个键错误
``````````````




>删除映射["无效键"]
```

输出:
`````
keyerror:"无效键"
`````

--

```python
nb!特定于实现的特殊情况:空字符串表示"缺少"值,因此,您不能使用这些
map['special']=''
print(map['special'])
```````

output:

```````
````keyrerror:'special'
``````
--

``python
由于实现的特殊性,这将始终产生字符串列表。
print('items:')
for key,value in map.items():
print('{}:{}'。format(key,value))
````


output:
````
items:
['a','c','i','d']:noun
['a','c','i','d','i,'c']:形容词
['e','l','e','g','a','n','t']:形容词
``````

--

```python
```您也可以重复前缀
print('prefixes:')
作为前缀,值在map.prefixes():
print('{}:{}'。格式(前缀,
`` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `‘a’‘c’‘c’‘i’‘d’‘d’‘d’‘d’‘d’‘d’’:名词
` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `]:
['e'、'l'、'e']:
['e'、'l'、'e'、'c']:
['e'、'l',‘E’‘E’‘C’‘C’‘T’‘T’‘T’‘T’‘T’’‘T’‘R’’:
‘E’‘L’‘E’‘L’‘E’‘E’‘L’‘E’‘E’‘L’‘E’‘C’‘T’‘L’‘I’‘C’‘E’‘L’‘I’‘I’‘I’‘F’‘Y’’:
‘E’‘L’‘E’‘L’‘E’‘L’‘L’‘E’‘L’‘L’‘E’‘E’‘L’‘E’‘E’‘C’‘T’‘T’‘T’‘L’‘L’‘L’‘E’‘E’‘L’‘E’‘E’‘E’","n"]:
["e","l","e","g","a","n","t"]:形容词
['s']:
['s','p']:
['s'、'p'、'e']:
['s'、'p'、'e'、'c'、'c']:
['s'、'p'、'e'、'c'、'i'、'a']:
['s'、'p'、'e'、'c'、'i'、'a','l']:
````

``python


磁盘
automaton.save_to_file('myautomaton.bin')



print(automaton3["德国"])
print(automaton3["德国"])
````


>输出:


```` ` `
塔林
柏林
` ` ` ` ` `
` ` ` ` ` ` `
pip install wheel
pip install cytthon
pip install aca
` ` `
` ` ` ` ` `




开发

对于写入/测试周期,使用按照以下命令在项目文件夹中生成代码。
```
python setup.py build廑ext--inplace
````

python setup.py build
python setup.py sdist bdist廑wheel upload
```

```"aca.h"头中的"aca-debug``宏"并重新编译以查看更多调试输出。


欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中通过给定最大汉明距离(不匹配数)获得所有字符串组合的算法   java广播接收器每次都被调用   java如何从ECPublicKey中找到匹配的曲线名称   java中的循环函数和接收字节   java抢占式调度会导致饥饿吗?   如何在JavaGUI中创建重力?   java检测Mac中的可移动驱动器   java多执行器服务。execute()调用。线程池。冗余   java为什么我的RxJava Observable不发出或完成,除非它是阻塞的?   java图像面板不会立即显示在JFrame中   java为什么zuul网关应用程序花了这么长时间才优雅地关闭   将Google地图添加到Flatter时未找到java API键   java读取嵌套的yaml值而不传入根对象   JavaAndroid使用广播接收器发送值   java ORA02289:序列不存在Spring boot   java JPanel没有使用BorderLayout显示在JFrame中   java Hibernate。cfg。没有配置xml   JavaSpring:检查异常的自动回滚