Example #1
0
    def Candidate(self, target, top=3, threshold=2):
        candidate_list = []  #node string edit_dis

        recoder_list = []
        recoder_list.append([self.m_root, self.m_root.m_key])

        while True:
            if len(recoder_list) == 0:
                break

            [cur_node, str] = recoder_list.pop()

            cut_off_distance_list = []  #distance, string
            for child in cur_node.m_child:
                str_temp = str + child.m_key
                cut_off_distance = Distance.CutOffDistance(
                    target, str_temp, threshold)
                if cut_off_distance <= threshold:
                    cut_off_distance_list.append([cut_off_distance, str_temp])
                    recoder_list.append([child, str_temp])

                if child.m_end_flag:
                    edit_distance = Distance.EditDistance(target, str_temp)
                    candidate_list.append([child, str_temp, edit_distance])

        #sort
        candidate_list.sort(key=lambda d: d[2])

        for candidate in candidate_list:
            if candidate[2] > threshold:
                candidate_list.remove(candidate)

        rtn_len = 0
        if len(candidate_list) > top:
            rtn_len = top
        else:
            rtn_len = len(candidate_list)

        rtn_list = []
        for idx in range(0, rtn_len):
            if candidate_list[idx][2] < threshold:
                #print(candidate_list[idx])
                rtn_list.append(
                    [candidate_list[idx][1], candidate_list[idx][2]])

        return rtn_list