1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
+
+
+
-
-
-
-
|
#!python3
import os
import traceback
import pkgutil
import re
from itertools import chain
#import logging
#logging.basicConfig(filename="suggestions.log", level=logging.DEBUG)
from . import str_transform as st
from . import char_player as cp
from .echo import echo
def show (nDeep, sText):
print(nDeep * " " + sText)
class IBDAWG:
"""INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH"""
def __init__ (self, sDicName):
self.by = pkgutil.get_data(__package__, "_dictionaries/" + sDicName)
if not self.by:
|
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
|
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
|
-
+
-
+
+
|
# we add what we removed
return list(map(lambda sSug: sPfx + sSug + sSfx, aSugg))
return aSugg
def _suggest (self, sRemain, nMaxDel=0, nMaxHardRepl=0, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False):
"returns a set of suggestions"
# recursive function
#show(nDeep, sNewWord + ":" + sRemain)
#logging.info((nDeep * " ") + sNewWord + ":" + sRemain)
aSugg = set()
if not sRemain:
if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
#show(nDeep, "___" + sNewWord + "___")
#logging.info((nDeep * " ") + "__" + sNewWord + "__")
aSugg.add(sNewWord)
for sTail in self._getTails(iAddr):
#logging.info((nDeep * " ") + "__" + sNewWord+sTail + "__")
aSugg.add(sNewWord+sTail)
return aSugg
cCurrent = sRemain[0:1]
for cChar, jAddr in self._getSimilarArcs(cCurrent, iAddr):
aSugg.update(self._suggest(sRemain[1:], nMaxDel, nMaxHardRepl, nDeep+1, jAddr, sNewWord+cChar))
if not bAvoidLoop: # avoid infinite loop
if cCurrent == sRemain[1:2]:
|