计算确定性无环有限状态自动机(DAFSA)的库
项目描述
DAFSA是一个用于计算确定性无环有限状态自动机(也称为“有向无环词图”,或DAWG)的库。DAFSA是从字典树派生出来的数据结构,它允许以有向无环图的形式表示一系列序列(通常是字符字符串或n元组),其中有一个源顶点(所有序列的起始符号)和至少一个汇边(final符号,每个由一个或多个序列指向)。在当前实现中,每个节点的属性表示它是否可以用作汇点。
DAFSA和字典树的主要区别在于后者消除了后缀和中缀冗余,例如图1(来自链接的维基百科文章)中存储字符串集合"tap"、"taps"、"top"和"tops"的例子。尽管DAFSA不能用于存储精确的频率信息,因为可能有多条路径到达相同的终端节点,但它们仍然允许估计采样频率;由于是无环的,它们还可以拒绝任何不在训练集中的序列。模糊扩展将允许估计未观察序列的采样概率。
字典树 vs. DAFSA
该数据结构是有限状态识别器的一种特殊情况,它作为确定性有限状态自动机,因为它只识别构建在之上的所有和仅有的序列。在计算机科学中经常使用,用于在无需常用压缩技术(如字典或熵类型)的情况下高效地存储序列集合,或者在没有概率数据结构(如布隆过滤器)的情况下,该库生成的自动机旨在进行语言探索,并通过携带每个图边的权重信息来近似随机观察的概率,从而扩展了已发布的模型。
安装和使用
该库可以使用pip作为任何标准Python库进行安装,并如下所示进行使用
在任何标准Python环境中,可以使用以下命令安装dafsa
$ pip install dafsa
还有一个conda包,可以通过以下命令(从tresoldi频道)进行安装
$ conda install -c tresoldi dafsa
有关如何使用库的详细说明,请参阅官方文档。对于大多数目的,只需将序列列表传递给DAFSA对象即可
>>> from dafsa import DAFSA
>>> print(DAFSA(["dib", "tip", "tips", "top"]))
DAFSA with 8 nodes and 9 edges (4 inserted sequences)
+-- #0: 0(#1/4:<d>/1|#4/4:<t>/3) [('t', 4), ('d', 1)]
+-- #1: n(#2/1:<i>/1) [('i', 2)]
+-- #2: n(#3/1:<b>/1) [('b', 3)]
+-- #3: F() []
+-- #4: n(#5/3:<i>/2|#8/3:<o>/1) [('i', 5), ('o', 8)]
+-- #5: n(#6/2:<p>/2) [('p', 6)]
+-- #6: F(#3/2:<s>/1) [('s', 3)]
+-- #8: n(#3/1:<p>/1) [('p', 3)]
完整的文档可在ReadTheDocs.io上找到。
展示
基本示例
第一个示例
输出可以是文本、GML、DOT,或者通过dot和第三方软件转换为PNG、PDF、ASCII艺术和Unicode艺术
DNA示例
G A +---------------------+ +----------+ | v | v #====# C +---+ G +---+ C +---+ G +---+ A +---+ T +---+ A #===# +-- H 0 H ---> | 5 | ---> | 6 | ---> | 7 | ---> | 8 | ---> | 9 | ---> | 3 | ---> H 4 H | #====# +---+ +---+ +---+ +---+ +---+ +---+ #===# | | A ^ | G +-----------+ | | v | | +----+ G +---+ A +---+ T | +-> | 20 | ---> | 1 | ---> | 2 | ----------------------------------------+ +----+ +---+ +---+
G A ┌─────────────────────┐ ┌──────────┐ │ ▼ │ ▼ ╔════╗ C ┌───┐ G ┌───┐ C ┌───┐ G ┌───┐ A ┌───┐ T ┌───┐ A ╔═══╗ ┌── ║ 0 ║ ───▶ │ 5 │ ───▶ │ 6 │ ───▶ │ 7 │ ───▶ │ 8 │ ───▶ │ 9 │ ───▶ │ 3 │ ───▶ ║ 4 ║ │ ╚════╝ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ ╚═══╝ │ │ A ▲ │ G └───────────┐ │ │ ▼ │ │ ┌────┐ G ┌───┐ A ┌───┐ T │ └─▶ │ 20 │ ───▶ │ 1 │ ───▶ │ 2 │ ────────────────────────────────────────┘ └────┘ └───┘ └───┘
带有或不带单一路径连接
音素示例
简化的音素示例
更改日志
版本 0.6
根据JOSS审查改进了文档
修复了在最小化时没有考虑节点终结性的错误
版本 0.5.1
在提交前进行了一些小的更改(包括标记版发布)
版本 0.5
在DAFSANode的__eq__()方法和DAFSA的_minimize()方法中进行了改进,特别是在速度方面。现在在测试机器上计算包含/usr/share/dict/words内容的DAFSA(99,171个序列)现在可以在8分钟内完成。
在额外目录中添加了Daciuk包中的代码,并附有许可证说明
版本 0.4
现有代码的完整文档
添加了GML、PDF和SVG导出
允许从命令行访问所有选项
版本 0.3
允许在单一路径中连接转换
允许将DAFSA导出为networkx图
初步文档可在ReadTheDocs上找到
版本 0.2.1
添加了对分段数据的支持
版本 0.2
添加了对带权边和节点的支持
添加了DOT导出和Graphviz生成
改进了最小化方法,如果需要可以跳过(结果为标准trie)
在资源中添加了示例,也用作测试数据
版本 0.1
第一个公开版本。
路线图
1.0之后
初步生成匹配DAFSA内容的极小正则表达式
考虑添加对空转换的支持(或依赖于用户对齐这些转换)
对更友好的Graphviz输出选项(如颜色、宽度等)进行工作
社区指南
虽然作者可以直接联系以获得支持,但建议第三方使用GitHub标准功能,如问题和拉取请求,以做出贡献、报告问题或寻求支持。
贡献指南,包括行为准则,可在CONTRIBUTING.md文件中找到。
项目详情
下载文件
下载适用于您平台文件的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。