|
5 | 5 |
|
6 | 6 |
|
7 | 7 | class BeamSearch(object): |
8 | | - def __init__(self, model, beam_size, max_target_len, id2vocab, bos_idx, args): |
| 8 | + def __init__(self, model, beam_size, max_target_len, id2vocab, bos_idx, unk_idx, args): |
9 | 9 | self.model = model |
10 | 10 | self.beam_size = beam_size |
11 | 11 | self.id2vocab = id2vocab |
| 12 | + self.vocab_size = len(self.id2vocab) |
12 | 13 | self.max_target_len = max_target_len |
13 | 14 | self.bos_idx = bos_idx |
| 15 | + self.unk_idx = unk_idx |
14 | 16 | self.target_hidden_size = args.target_hidden_size |
15 | 17 |
|
16 | 18 | def beam_search(self, src_dict, delimiter=None): |
@@ -41,6 +43,9 @@ def beam_search(self, src_dict, delimiter=None): |
41 | 43 | prev_hidden_state=hidden_state) |
42 | 44 | decoder_prob, encoder_output_dict, decoder_state, hidden_state = model_output |
43 | 45 | prev_best_probs, prev_best_index = torch.topk(decoder_prob, self.beam_size, 1) |
| 46 | + # map oov token to unk |
| 47 | + oov_token_mask = prev_best_index >= self.vocab_size |
| 48 | + prev_best_index.masked_fill_(oov_token_mask, self.unk_idx) |
44 | 49 | # B*b x TH |
45 | 50 | prev_decoder_state = decoder_state.unsqueeze(1).repeat(1, self.beam_size, 1) |
46 | 51 | prev_decoder_state = prev_decoder_state.view(beam_batch_size, -1) |
@@ -88,6 +93,9 @@ def beam_search(self, src_dict, delimiter=None): |
88 | 93 | prev_best_index = top_token_index % decoder_prob.size(1) |
89 | 94 | prev_hidden_state[0] = prev_hidden_state[0].index_select(1, state_select_idx) |
90 | 95 | prev_hidden_state[1] = prev_hidden_state[1].index_select(1, state_select_idx) |
| 96 | + # map oov token to unk |
| 97 | + oov_token_mask = prev_best_index >= self.vocab_size |
| 98 | + prev_best_index.masked_fill_(oov_token_mask, self.unk_idx) |
91 | 99 |
|
92 | 100 | result_sequences = result_sequences.view(batch_size * self.beam_size, -1) |
93 | 101 | result_sequences = result_sequences.index_select(0, state_select_idx) |
|
0 commit comments