| 49 | |
| 50 | |
| 51 | class Instance(object): |
| 52 | def __init__(self, tokenizer, sentence_pack, args): |
| 53 | self.id = sentence_pack['id'] |
| 54 | self.sentence = sentence_pack['sentence'] |
| 55 | self.tokens = self.sentence.strip().split() |
| 56 | self.sen_length = len(self.tokens) |
| 57 | self.token_range = [] |
| 58 | self.bert_tokens = tokenizer.encode(self.sentence) |
| 59 | self.length = len(self.bert_tokens) |
| 60 | self.bert_tokens_padding = torch.zeros(args.max_sequence_len).long() |
| 61 | self.aspect_tags = torch.zeros(args.max_sequence_len).long() |
| 62 | self.opinion_tags = torch.zeros(args.max_sequence_len).long() |
| 63 | self.tags = torch.zeros(args.max_sequence_len, args.max_sequence_len).long() |
| 64 | self.mask = torch.zeros(args.max_sequence_len) |
| 65 | |
| 66 | for i in range(self.length): |
| 67 | self.bert_tokens_padding[i] = self.bert_tokens[i] |
| 68 | self.mask[:self.length] = 1 |
| 69 | |
| 70 | token_start = 1 |
| 71 | for i, w, in enumerate(self.tokens): |
| 72 | token_end = token_start + len(tokenizer.encode(w, add_special_tokens=False)) |
| 73 | self.token_range.append([token_start, token_end-1]) |
| 74 | token_start = token_end |
| 75 | assert self.length == self.token_range[-1][-1]+2 |
| 76 | |
| 77 | self.aspect_tags[self.length:] = -1 |
| 78 | self.aspect_tags[0] = -1 |
| 79 | self.aspect_tags[self.length-1] = -1 |
| 80 | |
| 81 | self.opinion_tags[self.length:] = -1 |
| 82 | self.opinion_tags[0] = -1 |
| 83 | self.opinion_tags[self.length - 1] = -1 |
| 84 | |
| 85 | self.tags[:, :] = -1 |
| 86 | for i in range(1, self.length-1): |
| 87 | for j in range(i, self.length-1): |
| 88 | self.tags[i][j] = 0 |
| 89 | |
| 90 | for triple in sentence_pack['triples']: |
| 91 | aspect = triple['target_tags'] |
| 92 | opinion = triple['opinion_tags'] |
| 93 | aspect_span = get_spans(aspect) |
| 94 | opinion_span = get_spans(opinion) |
| 95 | |
| 96 | '''set tag for aspect''' |
| 97 | for l, r in aspect_span: |
| 98 | start = self.token_range[l][0] |
| 99 | end = self.token_range[r][1] |
| 100 | for i in range(start, end+1): |
| 101 | for j in range(i, end+1): |
| 102 | self.tags[i][j] = 1 |
| 103 | for i in range(l, r+1): |
| 104 | set_tag = 1 if i == l else 2 |
| 105 | al, ar = self.token_range[i] |
| 106 | self.aspect_tags[al] = set_tag |
| 107 | self.aspect_tags[al+1:ar+1] = -1 |
| 108 | '''mask positions of sub words''' |
no outgoing calls
no test coverage detected