快速、不重叠的同时多关键字搜索

NoAho的Python项目详细描述


非重叠aho corasick trie

功能:
-"short"和"long"(最长匹配键)搜索,在某些文本中对所有非重叠关键字匹配进行一次性和迭代。
-在python 2中同时使用unicode和str,在python 3中使用unicode。注意:
因为所有的东西都是简单的ucs4/utf-32代码点,所以所有
子字符串和输入unicode都必须规范化,即任何单独的修改
标记都必须折叠到每个代码点中。请参阅:
http://stackoverflow.com/questions/16467479/normalizeng unicode
,或者,理论上,您可以将文本中预期看到的所有形式的
关键字放入树中。
-允许您将任意python对象负载与每个
关键字关联起来,并支持dict operations len()、[]和"in",用于
关键字(尽管没有del或遍历)。
-按需执行
trie的"编译"(生成aho-corasick故障链接),即可以自由地混合添加关键字和搜索
文本,但大多数情况下,它只是减轻了你对编译的担忧。
-可以商业化使用,它是在最低限度的麻省理工学院许可证下使用的(如果你需要不同的许可证,请问我,我的意思是使用它)。

anti-features:
-将找不到重叠的关键字(例如给定的关键字"abc"和"cdef",将在"abcdef"中找不到"cdef"。任何完整的aho-corasick实现都会给你们带来
。"acora"包是用于此用途的替代包。(noaho
可以相对容易地修改为一个普通的aho-corasick,但它并不是我个人所需要的。)
-缺少重叠,find[all]\u short有点没用。
-缺少密钥迭代和从映射(dict)协议中删除。
-内存泄漏未经测试(在valgrind什么也没有找到,但是它没有扩展性。
-no/testcase/for unicode in python 2(但是进行了手动测试)
unicode字符表示为ucs4,并且每个字符都有自己的哈希表,
因此它的内存相对较重(参见下面的"减少内存使用的方法"。
-需要一个C++编译器(C++ 98的支持就够了)。



要构建和安装,请使用
pip install noaho

python 2
python2 setup.py install(或…构建并将.so复制到所需位置)
pip install

python 3
python3 setup.py install(或…构建.so并将其复制到所需位置)



api:
from noaho import noaho
trie=noaho()
"text"适用于python 2中的str和unicode,或python 3中的unicode(所有内容)
trie.add(key-text,可选负载)
(key-start,key-end,key-value)=trie.find_short(文本搜索)
(key_start,key_end,key_value)=trie.find_long(文本搜索)
(key_start,key_end,key_value)=trie.findall_short(文本搜索)
(key_start,key_end,key_value)=trie.findall_long(text_to_search)
keyword=text_to_search[key_start:key_end]
trie['keyword]=key_value
key_value=trie.find_long(text_to_search)
assert len(trie)
trie中的assert keyword

示例:
>>a=noaho()
>;>>a.add('ms windows')
>;>>a.add('ms windows 2000',"这是规范的")
>;>a.add('windows',none)
>;>a.add('windows 2000')
>;>a['apple']=none
>;>文本="Windows 2000 MS Windows 2000 Windows"
>;>k in a.findall_short(文本):
…打印文本[k[0]:k[1]

windows
ms windows
windows
gt>k in a.findall_long(文本):
…打印文本[k[0]:k[1]

Windows 2000
MS Windows 2000
Windows


映射(字典)方法:
trie=noaho()。
trie['apple']=apple_handling_函数
trie['orange']=orange()
trie.add('banana')有效载荷将为none
trie['pear']将给出键错误
assert isinstance(trie['orange'],orange)
assert'banana in trie
len(trie)
no del;
#没有键上的迭代

"find[all]\u short"表单的名称与它们的名称一样长且笨拙,
如果实现了重叠匹配,则可以让普通的"find[all]"保持自由。




有:python[3]test noaho.py)


未测试:有效负载处理是否完成,即没有内存泄漏。但应该正确。
BR/> BR/>再生Python包装器:
需要一个C++编译器(C++ 98是好的)和Cython。
BR/>你不需要重建Cython包装器(生成的NOAHO.CPP),但是如果
你想对模块本身做修改,有一个脚本:
BR/>测试所有配置。sh

,这将在对配置进行细微调整的情况下,重建并测试python 2和3。它要求您在顶部目录中有一个cython tarball。
请注意,用于安装cython的python应该与用于进行重新生成的python相同,因为重新生成设置包括一个模块
cython.distutils,在安装过程中,< > > >">"从Python中生成Python包装器(请小心)以区别于它的数组(使用哈希表),这是原始的C++代码,这意味着您必须适应一个巨大的
分支因子,因此哈希表(一个完整的数组将不存在
问题)。攻击内存大小的方法可能是,强制非常保守的哈希表增长,或者,一旦trie完成(例如在"compile"中)
遍历树并用正确大小的数组替换哈希表-
如果足够小,线性扫描/二进制搜索应该足够快,减少记忆。如果你愿意在这一点上进行线性扫描,也可以切换到
utf-8,这样可以节省相当多的内存。我认为,Danny Yoo的原始代码刚开始是数组,需要时会扩展到哈希表。

确定你是否会依赖它的代码。python
3在内部使用unicode,无论如何都会进行大量转换。我对Unicode的知识不太信任,无法尝试在存储更少位的情况下玩游戏。


边界,这要感谢python的unicode字符类。
(不过,这一秒有点粗糙,您可以手动完成。)

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

推荐PyPI第三方库


热门话题
未绘制java OpenGL顶点   swing无法在Java框架中设置文本   java使用xmemcached客户端访问AWS ElastiCache   java将元素添加到默认arraylist   java从给定位置向后逐个字符地读取文件   java将为此处显示的代码创建多少个对象?   Java异步返回CompletableFuture   java在滚动视图中显示图像   我想为用Netbeans开发的Java项目创建安装程序,并使用Mysql Xampp   java是否可以将COUNT与不同的JPA投影一起使用?   java如何定制javafx。场景图表NumberAxis用于更改20个主要记号的硬编码上限   javajavax。xml。ws。WebServiceException:无法访问WSDL   Jboss中的java多线程   java类不是抽象类,并且不重写抽象方法actionPerformed(ActionEvent)   基于java Spring安全令牌的身份验证   java如何在Spring MVC的自定义验证器中从属性文件中读取参数值   使用OpenCV和java在Android中点击获取图像维度?   java无法解析为变量解析。通用域名格式