【问题标题】:Levenshtein AutomataLevenshtein Automata
【发布时间】:2014-06-25 14:42:32
【问题描述】:

我实现了一个 levenshtein trie 来查找与给定单词相似的单词。 我的目标是找到一种快速的方法来纠正拼写。

但是我发现有一种更快的方法可以做到这一点:

Levenshtein Automata

我只是有一个问题......我不明白写的是什么 here。 有人可以解释一下我的想法和基本功能吗 levenshtein 自动机用简单的话?

【问题讨论】:

    标签: levenshtein-distance finite-automata


    【解决方案1】:

    谁能用简单的话解释一下 levenshtein 自动机的想法和基本功能?

    确定性有限自动机 (DFA) 是

    1. 一个字母表(一组可能的输入字符)
    2. 一组状态(只是没有特殊属性的抽象对象)
    3. 一个转换函数(给定任何状态和一个输入字符,它会返回一个唯一的状态)
    4. 杰出的开始状态
    5. 一组接受状态。

    您可以像论文中的那样将 DFA 绘制为图表。按照惯例,圆形节点是状态。每个标记有一个字符的有向边是过渡。接受状态被标记为双线圆圈。起始状态有一个向内指向的箭头,其尾部没有任何内容。

    当且仅当您可以将标记从起始状态沿着连接标签等于 W 的转换移动到接受状态时,DFA 才接受单词 W。也就是说,如果 T 是转移函数,并且 W = "cat",那么 T(T(T(Start, 'c'), 'a'), 't') 必须是接受状态。转换函数中的循环允许 DFA 接受任意长度的字符串,即使 DFA 是有限的。

    在软件中,DFA 是一个简单的循环和一个实现转换函数的表 T(state, char)。

    current_state = START
    while not end-of-input
      c = get character from input
      current_state = T(current_state, c)
    end
    if current_state is an accepting state return ACCEPT, else REJECT
    

    The Wikipedia page on DFAs还不错。

    DFA 具有很好的特性。接受/拒绝长度为 N 的输入需要 O(N) 时间(只要转换函数在恒定时间内运行)。每个 DFA 都有一个唯一的最小版本(在所有接受同一组词的人中)和一个找到该最小 DFA 的有效算法。很容易比较 DFA 在 DFA 大小上的时间线性相等性。

    A Levenshtein Automaton L(W, d) for word W and Levenshtein distance d 只是一个 DFA,它接受 所有 与 W 之间的 Levenshtein 距离最多为 d 的单词。也就是说,自动机接受 W再加上一堆其他的 W 词,在通常意义上的 Levenshtein 距离中,“错误”不超过 d。

    这篇论文的贡献是一种用于计算 Levenshtein DFA 的快速算法,然后是一种更高级的算法,它可以在不显式计算 DFA 的情况下完成同样的事情。

    【讨论】:

      【解决方案2】:

      Gene's 对 Levenshtein Automata 提供了精彩的高级描述!

      话虽如此,如果您正在寻找一些代码来加深理解,您可能会发现 Java LevenshteinAutomaton 库很有用。它实现了您偶然发现的论文中描述的两种算法(以及其他算法),并且结构良好,易于遵循,并且得到了广泛的评论。它也由您真正维护:)。

      【讨论】:

        猜你喜欢
        • 2011-08-27
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        • 2021-06-21
        • 2011-04-27
        相关资源
        最近更新 更多