deeppavlov/models/spelling_correction/levenshtein/levenshtein_searcher.py
def _trie_search(self, word, d, transducer=None,
                     allow_spaces=True, return_cost=True):
        """
        Находит все слова в префиксном боре, расстояние до которых
        в соответствии с заданным преобразователем не превышает d
        """
        if transducer is None:
            # разобраться с пробелами
            transducer = self.transducer.inverse()
        allow_spaces &= self.allow_spaces
        trie = self.dictionary
        #  инициализация переменных
        used_agenda_keys = set()
        agenda = SortedListWithKey(key=(lambda x:x[1]))
        h = self.h_func(word, trie.root)
        # agenda[self.agenda_key("", 0, trie.root)] = (0.0, 0.0, h)
        key, value = ("", 0, trie.root), (0.0, 0.0, h)
        agenda.add((key, value))
        answer = dict()
        k = 0
        # очередь с приоритетом с промежуточными результатами
        while len(agenda) > 0:
            key, value = agenda.pop(0)
            if key in used_agenda_keys:
                continue
            used_agenda_keys.add(key)
            low, pos, index = key
            cost, g, h = value
            # g --- текущая стоимость, h --- нижняя оценка будущей стоимости
            # cost = g + h --- нижняя оценка суммарной стоимости
            k += 1
            max_upperside_length = min(len(word) - pos, transducer.max_up_length)
            for upperside_length in range(max_upperside_length + 1):
                new_pos = pos + upperside_length
                curr_up = word[pos: new_pos]
                if curr_up not in transducer.operation_costs:
                    continue
                for curr_low, curr_cost in transducer.operation_costs[curr_up].items():
                    new_g = g + curr_cost
                    if new_g > d:  #если g > d, то h можно не вычислять
                        continue
                    if curr_low == " ":
                        if allow_spaces and trie.is_final(index):
                            new_index = trie.root
                        else:
                            new_index = Trie.NO_NODE
                    else:
                        new_index = trie.descend(index, curr_low)
                    if new_index is Trie.NO_NODE:
                        continue
                    new_low = low + curr_low
                    new_h = self.h_func(word[new_pos: ], new_index)
                    new_cost = new_g + new_h
                    if new_cost > d:
                        continue
                    new_key = (new_low, new_pos, new_index)
                    new_value = (new_cost, new_g, new_h)
                    if new_pos == len(word) and trie.is_final(new_index):
                        old_g = answer.get(new_low, None)
                        if old_g is None or new_g < old_g:
                            answer[new_low] = new_g
                    agenda.add((new_key, new_value))
        answer = sorted(answer.items(), key=(lambda x: x[1]))
        if return_cost:
            return answer
        else:
            return [elem[0] for elem in answer]
def _trie_search(self, word, d, transducer=None,
                     allow_spaces=True, return_cost=True):
        """
        Находит все слова в префиксном боре, расстояние до которых
        в соответствии с заданным преобразователем не превышает d
        """
        if transducer is None:
            # разобраться с пробелами
            transducer = self.transducer.inverse()
        allow_spaces &= self.allow_spaces
        trie = self.dictionary
        #  инициализация переменных
        used_agenda_keys = set()
        agenda = SortedListWithKey(key=(lambda x:x[1]))
        h = self.h_func(word, trie.root)
        # agenda[self.agenda_key("", 0, trie.root)] = (0.0, 0.0, h)
        key, value = ("", 0, trie.root), (0.0, 0.0, h)
        agenda.add((key, value))
        answer = dict()
        k = 0
        # очередь с приоритетом с промежуточными результатами
        while len(agenda) > 0:
            key, value = agenda.pop(0)
            if key in used_agenda_keys:
                continue
            used_agenda_keys.add(key)
            low, pos, index = key
            cost, g, h = value
            # g --- текущая стоимость, h --- нижняя оценка будущей стоимости
            # cost = g + h --- нижняя оценка суммарной стоимости
            k += 1
            max_upperside_length = min(len(word) - pos, transducer.max_up_length)
            for upperside_length in range(max_upperside_length + 1):
                new_pos = pos + upperside_length
                curr_up = word[pos: new_pos]
                if curr_up not in transducer.operation_costs:
                    continue
                for curr_low, curr_cost in transducer.operation_costs[curr_up].items():
                    new_g = g + curr_cost
                    if new_g > d:  #если g > d, то h можно не вычислять
                        continue
                    if curr_low == " ":
                        if allow_spaces and trie.is_final(index):
                            new_index = trie.root
                        else:
                            new_index = Trie.NO_NODE
                    else:
                        new_index = trie.descend(index, curr_low)
                    if new_index is Trie.NO_NODE:
                        continue
                    new_low = low + curr_low
                    new_h = self.h_func(word[new_pos: ], new_index)
                    new_cost = new_g + new_h
                    if new_cost > d:
                        continue
                    new_key = (new_low, new_pos, new_index)
                    new_value = (new_cost, new_g, new_h)
                    if new_pos == len(word) and trie.is_final(new_index):
                        old_g = answer.get(new_low, None)
                        if old_g is None or new_g < old_g:
                            answer[new_low] = new_g
                    agenda.add((new_key, new_value))
        answer = sorted(answer.items(), key=(lambda x: x[1]))
        if return_cost:
            return answer
        else:
            return [elem[0] for elem in answer]
def _trie_search ( self , word , d , transducer = None , allow_spaces = True , return_cost = True ) : if transducer is None : # разобраться с пробелами transducer = self . transducer . inverse ( ) allow_spaces &= self . allow_spaces trie = self . dictionary #  инициализация переменных used_agenda_keys = set ( ) agenda = SortedListWithKey ( key = ( lambda x : x [ 1 ] ) ) h = self . h_func ( word , trie . root ) # agenda[self.agenda_key("", 0, trie.root)] = (0.0, 0.0, h) key , value = ( "" , 0 , trie . root ) , ( 0.0 , 0.0 , h ) agenda . add ( ( key , value ) ) answer = dict ( ) k = 0 # очередь с приоритетом с промежуточными результатами while len ( agenda ) > 0 : key , value = agenda . pop ( 0 ) if key in used_agenda_keys : continue used_agenda_keys . add ( key ) low , pos , index = key cost , g , h = value # g --- текущая стоимость, h --- нижняя оценка будущей стоимости # cost = g + h --- нижняя оценка суммарной стоимости k += 1 max_upperside_length = min ( len ( word ) - pos , transducer . max_up_length ) for upperside_length in range ( max_upperside_length + 1 ) : new_pos = pos + upperside_length curr_up = word [ pos : new_pos ] if curr_up not in transducer . operation_costs : continue for curr_low , curr_cost in transducer . operation_costs [ curr_up ] . items ( ) : new_g = g + curr_cost if new_g > d : #если g > d, то h можно не вычислять continue if curr_low == " " : if allow_spaces and trie . is_final ( index ) : new_index = trie . root else : new_index = Trie . NO_NODE else : new_index = trie . descend ( index , curr_low ) if new_index is Trie . NO_NODE : continue new_low = low + curr_low new_h = self . h_func ( word [ new_pos : ] , new_index ) new_cost = new_g + new_h if new_cost > d : continue new_key = ( new_low , new_pos , new_index ) new_value = ( new_cost , new_g , new_h ) if new_pos == len ( word ) and trie . is_final ( new_index ) : old_g = answer . get ( new_low , None ) if old_g is None or new_g < old_g : answer [ new_low ] = new_g agenda . add ( ( new_key , new_value ) ) answer = sorted ( answer . items ( ) , key = ( lambda x : x [ 1 ] ) ) if return_cost : return answer else : return [ elem [ 0 ] for elem in answer ]
Находит все слова в префиксном боре, расстояние до которых
        в соответствии с заданным преобразователем не превышает d
Находит все слова в префиксном боре расстояние до которых в соответствии с заданным преобразователем не превышает d