def infer_features(self, x, y):
        self.func_filter_dict = {}
        self.reg_exp = []
        reg_exp ='ct{}pt{}'
        self.reg_exp.append(lambda x_j, cur_tag, prev_tag, i,reg_exp=reg_exp: reg_exp.format(cur_tag,prev_tag))
        for y1 in self.unique_y:
            for y2 in self.unique_y:
                new_func = lambda words,curr_tag,prev_tag,i,y1=y1,y2=y2 : features.bigram_tag_label(words, curr_tag, prev_tag, i, tag=y1,tag2=y2)
                self.func_list.append(new_func)
                self.func_filter_dict[reg_exp.format(y1,y2)] = len(self.func_list) - 1

        for ind in range(-1,2):
            reg_exp = 'ct{}w{}i{}'
            self.reg_exp.append(lambda x_j, cur_tag, prev_tag, i,reg_exp=reg_exp,ind=ind: reg_exp.format(cur_tag,x_j[i-ind].lower(),ind))
            for y1 in self.unique_y:
                for x1 in self.unique_x:
                    new_func = lambda words,curr_tag,prev_tag,i,y1=y1,x1=x1,ind=ind : features.atomic_tag_label(words, curr_tag, prev_tag, i-ind, tag=y1,word=x1)
                    self.func_list.append(new_func)
                    self.func_filter_dict[reg_exp.format(y1,x1,ind)] = len(self.func_list) - 1

        for slength in range(3,5):
            reg_exp = 'ct{}s{}l{}'
            self.reg_exp.append(lambda x_j, cur_tag, prev_tag, i,l=slength,reg_exp=reg_exp: reg_exp.format(cur_tag,x_j[i][-l:].lower(),l))
            for y1 in self.unique_y:
                for x1 in self.unique_x:
                    s = x1[-slength:]
                    new_func = lambda words,curr_tag,prev_tag,i,suff_length=slength,suffix=s,tag=y1 : features.suffix(words, curr_tag, prev_tag, i, suff_length=suff_length,suffix=suffix,tag=y1)
                    self.func_list.append(new_func)
                    self.func_filter_dict[reg_exp.format(y1,s,slength)] = len(self.func_list) - 1
 def infer_features(self, x, y):
     self.feat_labels = []
     for x_j in self.unique_x:
         for y_j in self.unique_y:
             new_func = lambda words,curr_tag,prev_tag,i,y_j=y_j,x_j=x_j : features.atomic_tag_label(words, curr_tag, prev_tag, i, tag=y_j, word=x_j)
             self.func_list.append(new_func)
             self.feat_labels.append((x_j,y_j))
     #self.func_list = self.func_list[:20]
     #self.feat_labels = self.feat_labels[:20]
     for y1 in self.unique_y:
         for y2 in self.unique_y:
             new_func = lambda words,curr_tag,prev_tag,i,y1=y1,y2=y2 : features.bigram_tag_label(words, curr_tag, prev_tag, i, tag=y1,tag2=y2)
             self.func_list.append(new_func)
             self.feat_labels.append((y1,y2))
     #self.func_list = self.func_list[-20:]
     #self.feat_labels = self.feat_labels[-20:]
     self.func_list = self.func_list[-200:-195]
     self.feat_labels = self.feat_labels[-200:-195]
    def infer_features(self, x, y):
        self.func_filter_dict = {}
        self.reg_exp = []
        reg_exp = "ct{}pt{}"
        self.reg_exp.append(lambda x_j, cur_tag, prev_tag, i, reg_exp=reg_exp: reg_exp.format(cur_tag, prev_tag))
        for y1 in self.unique_y:
            for y2 in self.unique_y:
                new_func = lambda words, curr_tag, prev_tag, i, y1=y1, y2=y2: features.bigram_tag_label(
                    words, curr_tag, prev_tag, i, tag=y1, tag2=y2
                )
                self.func_list.append(new_func)
                self.func_filter_dict[reg_exp.format(y1, y2)] = len(self.func_list) - 1

        for ind in range(-1, 2):
            reg_exp = "ct{}w{}i{}"
            self.reg_exp.append(
                lambda x_j, cur_tag, prev_tag, i, reg_exp=reg_exp, ind=ind: reg_exp.format(
                    cur_tag, x_j[i - ind].lower(), ind
                )
            )
            for y1 in self.unique_y:
                for x1 in self.unique_x:
                    new_func = lambda words, curr_tag, prev_tag, i, y1=y1, x1=x1, ind=ind: features.atomic_tag_label(
                        words, curr_tag, prev_tag, i - ind, tag=y1, word=x1
                    )
                    self.func_list.append(new_func)
                    self.func_filter_dict[reg_exp.format(y1, x1, ind)] = len(self.func_list) - 1

        for slength in range(3, 5):
            reg_exp = "ct{}s{}l{}"
            self.reg_exp.append(
                lambda x_j, cur_tag, prev_tag, i, l=slength, reg_exp=reg_exp: reg_exp.format(
                    cur_tag, x_j[i][-l:].lower(), l
                )
            )
            for y1 in self.unique_y:
                for x1 in self.unique_x:
                    s = x1[-slength:]
                    new_func = lambda words, curr_tag, prev_tag, i, suff_length=slength, suffix=s, tag=y1: features.suffix(
                        words, curr_tag, prev_tag, i, suff_length=suff_length, suffix=suffix, tag=y1
                    )
                    self.func_list.append(new_func)
                    self.func_filter_dict[reg_exp.format(y1, s, slength)] = len(self.func_list) - 1