Ejemplo n.º 1
0
    def _build_data(self, root_dir, processed_dir):
        self.data = {}
        data_loader = ActPolicyDataloader(
            dataset_dataloader=MultiWOZDataloader())
        for part in ['train', 'val', 'test']:
            self.data[part] = []
            raw_data = data_loader.load_data(data_key=part,
                                             role='system')[part]

            for belief_state, context_dialog_act, terminal, dialog_act in \
                zip(raw_data['belief_state'], raw_data['context_dialog_act'], raw_data['terminal'], raw_data['dialog_act']):
                state = default_state()
                state['belief_state'] = belief_state
                state['user_action'] = context_dialog_act[-1]
                state['system_action'] = context_dialog_act[-2] if len(
                    context_dialog_act) > 1 else {}
                state['terminal'] = terminal
                action = dialog_act
                self.data[part].append([
                    self.vector.state_vectorize(state),
                    self.vector.action_vectorize(action)
                ])

        os.makedirs(processed_dir)
        for part in ['train', 'val', 'test']:
            with open(os.path.join(processed_dir, '{}.pkl'.format(part)),
                      'wb') as f:
                pickle.dump(self.data[part], f)
Ejemplo n.º 2
0
def fake_state():
    user_action = {
        'Hotel-Request': [['Name', '?']],
        'Train-Inform': [['Day', 'don\'t care']]
    }
    from tatk.util.multiwoz.state import default_state
    init_belief_state = default_state()['belief_state']
    kb_results = [None, None]
    kb_results[0] = {
        'name': 'xxx_train',
        'day': 'tuesday',
        'dest': 'cam',
        'phone': '123-3333',
        'area': 'south'
    }
    kb_results[1] = {
        'name': 'xxx_train',
        'day': 'tuesday',
        'dest': 'cam',
        'phone': '123-3333',
        'area': 'north'
    }
    state = {
        'user_action': user_action,
        'belief_state': init_belief_state,
        'kb_results_dict': kb_results,
        'hotel-request': [['phone']]
    }
    '''
    state = {'user_action': dict(),
             'belief_state: dict(),
             'kb_results_dict': kb_results
    }
    '''
    return state
Ejemplo n.º 3
0
def main():
    s = default_state()
    s['history'] = [['null', 'I want a korean restaurant in the centre.']]
    s['belief_state']['attraction']['semi']['area'] = 'centre'
    s['belief_state']['restaurant']['semi']['area'] = 'centre'
    s['belief_state']['restaurant']['semi']['food'] = 'korean'
    testPolicy = MDRGWordPolicy()
    print(testPolicy.predict(s))
Ejemplo n.º 4
0
def main():
    s = default_state()
    s['history'] = [['null', 'I want a chinese restaurant']]
    # s['belief_state']['attraction']['semi']['area'] = 'centre'
    s['belief_state']['restaurant']['semi']['area'] = 'south'
    s['belief_state']['restaurant']['semi']['food'] = 'mexican'
    testPolicy = MDRGWordPolicy()
    print(s)
    print(testPolicy.predict(s))
Ejemplo n.º 5
0
 def __init__(self):
     DST.__init__(self)
     self.state = default_state()
     path = os.path.dirname(
         os.path.dirname(
             os.path.dirname(
                 os.path.dirname(os.path.dirname(
                     os.path.abspath(__file__))))))
     path = os.path.join(path, 'data/multiwoz/value_dict.json')
     self.value_dict = json.load(open(path))
Ejemplo n.º 6
0
    def __init__(self, num=1):
        parser = argparse.ArgumentParser(description='S2S')
        parser.add_argument('--no_cuda', type=util.str2bool, nargs='?', const=True, default=True,
                            help='enables CUDA training')
        parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)')

        parser.add_argument('--no_models', type=int, default=20, help='how many models to evaluate')
        parser.add_argument('--original', type=str, default='model/model/', help='Original path.')

        parser.add_argument('--dropout', type=float, default=0.0)
        parser.add_argument('--use_emb', type=str, default='False')

        parser.add_argument('--beam_width', type=int, default=10, help='Beam width used in beamsearch')
        parser.add_argument('--write_n_best', type=util.str2bool, nargs='?', const=True, default=False,
                            help='Write n-best list (n=beam_width)')

        parser.add_argument('--model_path', type=str, default='model/model/translate.ckpt',
                            help='Path to a specific model checkpoint.')
        parser.add_argument('--model_dir', type=str, default='data/multi-woz/model/model/')
        parser.add_argument('--model_name', type=str, default='translate.ckpt')

        parser.add_argument('--valid_output', type=str, default='model/data/val_dials/',
                            help='Validation Decoding output dir path')
        parser.add_argument('--decode_output', type=str, default='model/data/test_dials/',
                            help='Decoding output dir path')


        args = parser.parse_args([])

        args.cuda = not args.no_cuda and torch.cuda.is_available()

        torch.manual_seed(args.seed)

        self.device = torch.device("cuda" if args.cuda else "cpu")
        with open(os.path.join(os.path.dirname(__file__), args.model_path + '.config'), 'r') as f:
            add_args = json.load(f)
            # print(add_args)
            for k, v in add_args.items():
                setattr(args, k, v)
            # print(args)
            args.mode = 'test'
            args.load_param = True
            args.dropout = 0.0
            assert args.dropout == 0.0

        # Start going through models
        args.original = args.model_path
        args.model_path = args.original
        self.model = loadModel(num, args)
        self.dial = {"cur": {"log": []}}
        self.prev_state = default_state()
        self.prev_active_domain = None
Ejemplo n.º 7
0
    def __init__(self, ontology_vectors, ontology, slots, data_dir):
        Tracker.__init__(self)
        # data profile
        self.data_dir = data_dir
        self.validation_url = os.path.join(self.data_dir, 'data/validate.json')
        self.word_vectors_url = os.path.join(
            self.data_dir, 'word-vectors/paragram_300_sl999.txt')
        self.training_url = os.path.join(self.data_dir, 'data/train.json')
        self.ontology_url = os.path.join(self.data_dir, 'data/ontology.json')
        self.testing_url = os.path.join(self.data_dir, 'data/test.json')
        self.model_url = os.path.join(self.data_dir, 'models/model-1')
        self.graph_url = os.path.join(self.data_dir, 'graphs/graph-1')
        self.results_url = os.path.join(self.data_dir, 'results/log-1.txt')
        self.kb_url = os.path.join(self.data_dir, 'data/')  # not used
        self.train_model_url = os.path.join(self.data_dir,
                                            'train_models/model-1')
        self.train_graph_url = os.path.join(self.data_dir,
                                            'train_graph/graph-1')

        self.model_variables = model_definition(ontology_vectors,
                                                len(ontology),
                                                slots,
                                                num_hidden=None,
                                                bidir=True,
                                                net_type=None,
                                                test=True,
                                                dev='cpu')
        self.state = default_state()
        _config = tf.ConfigProto()
        _config.gpu_options.allow_growth = True
        _config.allow_soft_placement = True
        self.sess = tf.Session(config=_config)
        self.param_restored = False
        self.det_dic = {}
        for domain, dic in REF_USR_DA.items():
            for key, value in dic.items():
                assert '-' not in key
                self.det_dic[key.lower()] = key + '-' + domain
                self.det_dic[value.lower()] = key + '-' + domain

        def parent_dir(path, time=1):
            for _ in range(time):
                path = os.path.dirname(path)
            return path

        root_dir = parent_dir(os.path.abspath(__file__), 4)
        self.value_dict = json.load(
            open(os.path.join(root_dir, 'data/multiwoz/value_dict.json')))
Ejemplo n.º 8
0
    def generate_dict(self):
        """
        init the dict for mapping state/action into vector
        """
        self.act2vec = dict((a, i) for i, a in enumerate(self.da_voc))
        self.vec2act = dict((v, k) for k, v in self.act2vec.items())
        self.da_dim = len(self.da_voc)
        self.opp2vec = dict((a, i) for i, a in enumerate(self.da_voc_opp))
        self.da_opp_dim = len(self.da_voc_opp)

        self.belief_state_dim = 0
        for domain in self.belief_domains:
            for slot, value in default_state()['belief_state'][domain.lower()]['semi'].items():
                self.belief_state_dim += 1

        self.state_dim = self.da_opp_dim + self.da_dim + self.belief_state_dim + \
                         len(self.db_domains) + 6 * len(self.db_domains) + 1
Ejemplo n.º 9
0
    def _build_data(self, root_dir, processed_dir):
        self.data = {}
        for part in ['train', 'val', 'test']:
            self.data[part] = []
            raw_data = ActPolicyDataloader(data_key=part, role='sys')

            for turn in raw_data:
                state = default_state()
                state['user_action'] = turn['context_dialog_act'][-1]
                state['system_action'] = turn['context_dialog_act'][-2]
                state['terminal'] = turn['terminal']
                action = turn['dialog_act']
                self.data[part].append([
                    self.vector.state_vectorize(state),
                    self.vector.action_vectorize(action)
                ])

        os.makedirs(processed_dir)
        for part in ['train', 'val', 'test']:
            with open(os.path.join(processed_dir, '{}.pkl'.format(part)),
                      'wb') as f:
                pickle.dump(self.data[part], f)
Ejemplo n.º 10
0
    def setup_class(cls):
        # domain_slots will be used for checking request_state
        cls.domain_slots = {}
        for key, value in REF_SYS_DA.items():
            new_key = key.lower()
            new_value = set(value.values())
            cls.domain_slots[new_key] = new_value

        cls.default_belief_state = default_state()['belief_state']

        cls.usr_acts = [
            {
                "Hotel-Inform": [["Area", "east"], ["Stars", "4"]]
            },
            {
                "Hotel-Inform": [["Parking", "yes"], ["Internet", "yes"]]
            },
            {},
            {
                "Hotel-Inform": [["Day", "friday"]],
                "Hotel-Request": [["Ref", "?"]]
            },
            {
                "Train-Inform": [["Dest", "bishops stortford"],
                                 ["Day", "friday"], ["Depart", "cambridge"]]
            },
            {
                "Train-Inform": [["Arrive", "19:45"]]
            },
            {
                "Train-Request": [["Leave", "?"], ["Time", "?"],
                                  ["Ticket", "?"]]
            },
            {
                "Hotel-Inform": [["Stay", "4"], ["Day", "monday"],
                                 ["People", "3"]]
            },
        ]
Ejemplo n.º 11
0
    def _build_data(self, root_dir, processed_dir):
        raw_data = {}
        for part in ['train', 'val', 'test']:
            archive = zipfile.ZipFile(
                os.path.join(root_dir,
                             'data/multiwoz/{}.json.zip'.format(part)), 'r')
            with archive.open('{}.json'.format(part), 'r') as f:
                raw_data[part] = json.load(f)

        self.data = {}
        for part in ['train', 'val', 'test']:
            self.data[part] = []

            for key in raw_data[part]:
                sess = raw_data[part][key]['log']
                state = default_state()
                action = {}
                for i, turn in enumerate(sess):
                    if i % 2 == 0:
                        state['user_action'] = turn['dialog_act']
                        if i + 2 == len(sess):
                            state['terminal'] = True
                    else:
                        state['belief_state'] = turn['metadata']
                        action = turn['dialog_act']
                        self.data[part].append([
                            self.vector.state_vectorize(state),
                            self.vector.action_vectorize(action)
                        ])
                        state['system_action'] = turn['dialog_act']

        os.makedirs(processed_dir)
        for part in ['train', 'val', 'test']:
            with open(os.path.join(processed_dir, '{}.pkl'.format(part)),
                      'wb') as f:
                pickle.dump(self.data[part], f)
Ejemplo n.º 12
0
    def update(self, user_act=None):
        """Update the dialog state."""
        if type(user_act) is not str:
            raise Exception(
                'Expected user_act to be <class \'str\'> type, but get {}.'.
                format(type(user_act)))
        prev_state = self.state
        if not os.path.exists(os.path.join(self.data_dir, "results")):
            os.makedirs(os.path.join(self.data_dir, "results"))

        global train_batch_size

        model_variables = self.model_variables
        (user, sys_res, no_turns, user_uttr_len, sys_uttr_len, labels,
         domain_labels, domain_accuracy, slot_accuracy, value_accuracy,
         value_f1, train_step, keep_prob, predictions, true_predictions,
         [y, _]) = model_variables

        # generate fake dialogue based on history (this os to reuse the original MDBT code)
        # actual_history = prev_state['history']  # [[sys, user], [sys, user], ...]
        actual_history = copy.deepcopy(
            prev_state['history'])  # [[sys, user], [sys, user], ...]
        actual_history = [['null']]
        actual_history[-1].append(user_act)
        actual_history = self.normalize_history(actual_history)
        if len(actual_history) == 0:
            actual_history = [[
                '', user_act if len(user_act) > 0 else 'fake user act'
            ]]
        fake_dialogue = {}
        turn_no = 0
        for _sys, _user in actual_history:
            turn = {}
            turn['system'] = _sys
            fake_user = {}
            fake_user['text'] = _user
            fake_user['belief_state'] = default_state()['belief_state']
            turn['user'] = fake_user
            key = str(turn_no)
            fake_dialogue[key] = turn
            turn_no += 1
        context, actual_context = process_history([fake_dialogue],
                                                  self.word_vectors,
                                                  self.ontology)
        batch_user, batch_sys, batch_labels, batch_domain_labels, batch_user_uttr_len, batch_sys_uttr_len, \
                batch_no_turns = generate_batch(context, 0, 1, len(self.ontology))  # old feature

        # run model
        [pred, y_pred] = self.sess.run(
            [predictions, y],
            feed_dict={
                user: batch_user,
                sys_res: batch_sys,
                labels: batch_labels,
                domain_labels: batch_domain_labels,
                user_uttr_len: batch_user_uttr_len,
                sys_uttr_len: batch_sys_uttr_len,
                no_turns: batch_no_turns,
                keep_prob: 1.0
            })

        # convert to str output
        dialgs, _, _ = track_dialogue(actual_context, self.ontology, pred,
                                      y_pred)
        assert len(dialgs) >= 1
        last_turn = dialgs[0][-1]
        predictions = last_turn['prediction']
        new_belief_state = copy.deepcopy(prev_state['belief_state'])

        # updaet belief state
        for item in predictions:
            item = item.lower()
            domain, slot, value = item.strip().split('-')
            value = value[::-1].split(':', 1)[1][::-1]
            if slot == 'price range':
                slot = 'pricerange'
            if slot not in ['name', 'book']:
                if domain not in new_belief_state:
                    raise Exception(
                        'Error: domain <{}> not in belief state'.format(
                            domain))
                slot = REF_SYS_DA[domain.capitalize()].get(slot, slot)
                assert 'semi' in new_belief_state[domain]
                assert 'book' in new_belief_state[domain]
                if 'book' in slot:
                    assert slot.startswith('book ')
                    slot = slot.strip().split()[1]
                domain_dic = new_belief_state[domain]
                if slot in domain_dic['semi']:
                    new_belief_state[domain]['semi'][slot] = normalize_value(
                        self.value_dict, domain, slot, value)
                elif slot in domain_dic['book']:
                    new_belief_state[domain]['book'][slot] = value
                elif slot.lower() in domain_dic['book']:
                    new_belief_state[domain]['book'][slot.lower()] = value
                else:
                    with open('mdbt_unknown_slot.log', 'a+') as f:
                        f.write(
                            'unknown slot name <{}> with value <{}> of domain <{}>\nitem: {}\n\n'
                            .format(slot, value, domain, item))
        new_request_state = copy.deepcopy(prev_state['request_state'])
        # update request_state
        user_request_slot = self.detect_requestable_slots(user_act)
        for domain in user_request_slot:
            for key in user_request_slot[domain]:
                if domain not in new_request_state:
                    new_request_state[domain] = {}
                if key not in new_request_state[domain]:
                    new_request_state[domain][key] = user_request_slot[domain][
                        key]
        # update state
        new_state = copy.deepcopy(dict(prev_state))
        new_state['belief_state'] = new_belief_state
        new_state['request_state'] = new_request_state
        self.state = new_state
        return self.state
Ejemplo n.º 13
0
 def init_session(self):
     self.state = default_state()
     if not self.param_restored:
         self.restore()
Ejemplo n.º 14
0
 def init_session(self):
     """Initialize ``self.state`` with a default state, which ``tatk.util.multiwoz.state.default_state`` returns."""
     self.state = default_state()