跳转到主要内容

计算确定性无环有限状态自动机(DAFSA)的库

项目描述

DAFSA是一个用于计算确定性无环有限状态自动机(也称为“有向无环词图”,或DAWG)的库。DAFSA是从字典树派生出来的数据结构,它允许以有向无环图的形式表示一系列序列(通常是字符字符串或n元组),其中有一个源顶点(所有序列的起始符号)和至少一个汇边(final符号,每个由一个或多个序列指向)。在当前实现中,每个节点的属性表示它是否可以用作汇点。

DAFSA和字典树的主要区别在于后者消除了后缀和中缀冗余,例如图1(来自链接的维基百科文章)中存储字符串集合"tap""taps""top""tops"的例子。尽管DAFSA不能用于存储精确的频率信息,因为可能有多条路径到达相同的终端节点,但它们仍然允许估计采样频率;由于是无环的,它们还可以拒绝任何不在训练集中的序列。模糊扩展将允许估计未观察序列的采样概率。

Trie vs. 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上找到。

展示

  • 基本示例

First example

第一个示例

  • 输出可以是文本、GML、DOT,或者通过dot和第三方软件转换为PNG、PDF、ASCII艺术和Unicode艺术

DNA example

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 │ ────────────────────────────────────────┘
    └────┘      └───┘      └───┘
  • 带有或不带单一路径连接

Phoneme example

音素示例

Reduced Phoneme example

简化的音素示例

更改日志

版本 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文件中找到。

作者和引用

该库由Tiago Tresoldi开发(tresoldi@shh.mpg.de)。

作者已获得欧盟“地平线2020”研究与创新计划(项目协议号:ERC Grant #715618计算机辅助语言比较)下欧洲研究委员会(ERC)的资助。

如果您使用 dafsa,请按以下方式引用:

tresoldi, Tiago (2020). DAFSA,一个计算确定型无环有限状态自动机的库。版本1.0。耶拿。可在以下网址获取:https://github.com/tresoldi/dafsa

在BibTeX中

@misc{Tresoldi2020dafsa,
  author = {Tresoldi, Tiago},
  title = {DAFSA, a a library for computing Deterministic Acyclic Finite State Automata. Version 1.0.},
  howpublished = {\url{https://github.com/tresoldi/dafsa}},
  address = {Jena},
  year = {2020},
}

项目详情


下载文件

下载适用于您平台文件的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

dafsa-1.0.tar.gz (24.8 kB 查看哈希值)

上传时间

构建分发

dafsa-1.0-py3-none-any.whl (19.9 kB 查看哈希值)

上传时间 Python 3

支持者: