-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlevenshtein.py
More file actions
61 lines (54 loc) · 1.78 KB
/
Copy pathlevenshtein.py
File metadata and controls
61 lines (54 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from collections import defaultdict
from pprint import pprint
from automata.fa.dfa import *
from automata.fa.nfa import *
from util import *
from trie import *
def corpus2dfa(corpus_path):
"""
Args:
corpus_path:
Return:
"""
words = read_dict(corpus_path)
trie = Trie(words)
return trie.to_DFA()
def construct_levenshten_nfa(word, k):
"""
Args:
word:
k : max edit distance
Return:
"""
n = len(word)
m = dict() # {(n_char, n_err): state_name}
for nc in range(n + 1):
for ne in range(k + 1):
m[(nc, ne)] = str((nc, ne))
transitions = defaultdict(lambda: defaultdict(lambda: set()))
for i in range(n + 1):
for e in range(k + 1):
curr = m[(i, e)]
right = m[(i + 1, e)] if (i < n) else None
if right:
transitions[curr][word[i]].add(right) # correct char: right arrow
if e >= k: continue
# non-top states
up = m[(i , e + 1)]
if right:
top_right = m[(i + 1, e + 1)]
transitions[curr][""].add(top_right) # deletions - epsilon: diagonal arrow
for ch in ALPHABETS:
# insertions: upward arrow + subsitutions: diagonal arrow
transitions[curr][ch].add(up)
if (top_right):
transitions[curr][ch].add(top_right)
nfa = NFA(states = set(m.values()),\
transitions = transitions,\
initial_state = m[(0, 0)],\
final_states = {m[(n, j)] for j in range(k + 1)},\
input_symbols = set(ALPHABETS))
return nfa
def construct_levenshten(word, k):
nfa = construct_levenshten_nfa(word, k)
return DFA.from_nfa(nfa)