Beispiel #1
0
def decode(model, opts, test_batcher, i2c, i2p):
    """
    Decode the input
    """

    logging.basicConfig(filename=opts.log, level=logging.INFO)

    if opts.use_cuda:
        #print "Find GPU enable, using GPU to compute..."
        model.cuda()
        torch.cuda.manual_seed(opts.seed)
    # else:
    #     print "Find GPU unable, using CPU to compute..."

    result_file = opts.result_file
    result_writer = codecs.open(result_file, 'w', 'utf-8')

    t = trange(opts.data_size, desc='DECODE')
    for iter in t:
        input, target, pos, target_length, input_length = test_batcher.next()
        input_tensor = Variable(torch.LongTensor(input))
        target_tensor = Variable(torch.LongTensor(target))
        pos_tensor = Variable(torch.LongTensor(pos))
        if opts.use_cuda:
            input_tensor = input_tensor.cuda()
            target_tensor = target_tensor.cuda()
            pos_tensor = pos_tensor.cuda()

        encoder_state, encoder_output, pos_feature, _ = model.encode_once(
            input_tensor, pos_tensor)
        start_decode = Variable(torch.LongTensor([2])).cuda().unsqueeze(1)

        beam = Beam(model, opts.beam_size, opts.max_target_len, encoder_state,
                    encoder_output, pos_feature, start_decode, input)
        hyper = beam.run()

        raw_input = ""
        result = ""
        raw_pos = ""
        for word in hyper.word_list:
            result += i2c[word]
        for word in input[0]:
            raw_input += i2c[word]
        for word in pos[0]:
            if word == 0:
                break
            raw_pos += i2p[word] + ";"
        raw_pos = raw_pos[:-1]
        result_writer.write(raw_input + '\t' + result + '\t' + raw_pos + '\n')

    result_writer.close()
    os.system(('../evaluation/evalm.py --gold %s --guess %s --task 1') %
              (opts.test, opts.result_file))
    log_result('temp.txt', opts)