def close(self):
        '''
        Returns:
            (dict): Return a dict which contains

            * **bleu**: bleu value.
            * **bleu hashvalue**: hash value for bleu metric, same hash value stands
              for same evaluation settings.
        '''
        result = super().close()
        if (not self.hyps) or (not self.refs):
            raise RuntimeError("The metric has not been forwarded data correctly.")

        self.hyps = _replace_unk(self.hyps, self.dataloader.unk_id)

        for i in range(1, 5):
            try:
                weights = [1 / i] * i + [0] * (4 - i)
                result.update({"bleu-%d" % i: corpus_bleu(self.refs, self.hyps, weights,
                                                          smoothing_function=SmoothingFunction().method3)})

            except ZeroDivisionError as _:
                if not self.ignore_smoothing_error:
                    raise ZeroDivisionError("Bleu smoothing divided by zero. This is a known bug of corpus_bleu, \
                    usually caused when there is only one sample and the sample length is 1.")
                result.update({"bleu-%d" % i: 0, "bleu hashvalue": self._hashvalue()})

        return result

        Returns:
            (dict): Return a dict which contains

            * **bleu**: bleu value.
            * **bleu hashvalue**: hash value for bleu metric, same hash value stands
              for same evaluation settings.
        
benchmark/seq2seq/myCoTK/metric/bleu.py