test_tokenization_openai.py 4.9 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# coding=utf-8
# Copyright 2018 The Google AI Language Team Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Aymeric Augustin's avatar
Aymeric Augustin committed
15

16

Aymeric Augustin's avatar
Aymeric Augustin committed
17
import json
18
import os
19
import unittest
20

21
from transformers import OpenAIGPTTokenizer, OpenAIGPTTokenizerFast
Sylvain Gugger's avatar
Sylvain Gugger committed
22
from transformers.models.openai.tokenization_openai import VOCAB_FILES_NAMES
23
from transformers.testing_utils import require_ftfy, require_spacy, require_tokenizers
24

25
from ..test_tokenization_common import TokenizerTesterMixin
26

27

28
@require_tokenizers
29
class OpenAIGPTTokenizationTest(TokenizerTesterMixin, unittest.TestCase):
30
    """Tests OpenAIGPTTokenizer that uses BERT BasicTokenizer."""
31

32
    tokenizer_class = OpenAIGPTTokenizer
33
34
    rust_tokenizer_class = OpenAIGPTTokenizerFast
    test_rust_tokenizer = True
35
    test_seq2seq = False
36
37

    def setUp(self):
Julien Chaumond's avatar
Julien Chaumond committed
38
        super().setUp()
39
40

        # Adapted from Sennrich et al. 2015 and https://github.com/rsennrich/subword-nmt
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        vocab = [
            "l",
            "o",
            "w",
            "e",
            "r",
            "s",
            "t",
            "i",
            "d",
            "n",
            "w</w>",
            "r</w>",
            "t</w>",
            "lo",
            "low",
            "er</w>",
            "low</w>",
            "lowest</w>",
            "newer</w>",
            "wider</w>",
            "<unk>",
        ]
64
65
        vocab_tokens = dict(zip(vocab, range(len(vocab))))
        merges = ["#version: 0.2", "l o", "lo w", "e r</w>", ""]
66

67
68
        self.vocab_file = os.path.join(self.tmpdirname, VOCAB_FILES_NAMES["vocab_file"])
        self.merges_file = os.path.join(self.tmpdirname, VOCAB_FILES_NAMES["merges_file"])
69
70
71
72
        with open(self.vocab_file, "w") as fp:
            fp.write(json.dumps(vocab_tokens))
        with open(self.merges_file, "w") as fp:
            fp.write("\n".join(merges))
73

74
    def get_input_output_texts(self, tokenizer):
75
        return "lower newer", "lower newer"
76

77
78
79
80
81
82
83
    def test_full_tokenizer(self):
        tokenizer = OpenAIGPTTokenizer(self.vocab_file, self.merges_file)

        text = "lower"
        bpe_tokens = ["low", "er</w>"]
        tokens = tokenizer.tokenize(text)
        self.assertListEqual(tokens, bpe_tokens)
84

85
86
        input_tokens = tokens + ["<unk>"]
        input_bpe_tokens = [14, 15, 20]
87
        self.assertListEqual(tokenizer.convert_tokens_to_ids(input_tokens), input_bpe_tokens)
88
89
90

    def test_padding(self, max_length=15):
        for tokenizer, pretrained_name, kwargs in self.tokenizers_list:
91
            with self.subTest(f"{tokenizer.__class__.__name__} ({pretrained_name})"):
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                tokenizer_r = self.rust_tokenizer_class.from_pretrained(pretrained_name, **kwargs)

                # Simple input
                s = "This is a simple input"
                s2 = ["This is a simple input 1", "This is a simple input 2"]
                p = ("This is a simple input", "This is a pair")
                p2 = [
                    ("This is a simple input 1", "This is a simple input 2"),
                    ("This is a simple pair 1", "This is a simple pair 2"),
                ]

                # Simple input tests
                self.assertRaises(ValueError, tokenizer_r.encode, s, max_length=max_length, padding="max_length")

                # Simple input
                self.assertRaises(ValueError, tokenizer_r.encode_plus, s, max_length=max_length, padding="max_length")

                # Simple input
                self.assertRaises(
                    ValueError,
                    tokenizer_r.batch_encode_plus,
                    s2,
                    max_length=max_length,
                    padding="max_length",
                )

                # Pair input
                self.assertRaises(ValueError, tokenizer_r.encode, p, max_length=max_length, padding="max_length")

                # Pair input
                self.assertRaises(ValueError, tokenizer_r.encode_plus, p, max_length=max_length, padding="max_length")

                # Pair input
                self.assertRaises(
                    ValueError,
                    tokenizer_r.batch_encode_plus,
                    p2,
                    max_length=max_length,
                    padding="max_length",
                )
132
133
134
135

    # tokenizer has no padding token
    def test_padding_different_model_input_name(self):
        pass
136
137
138
139
140
141
142
143
144


@require_ftfy
@require_spacy
@require_tokenizers
class OpenAIGPTTokenizationTestWithSpacy(OpenAIGPTTokenizationTest):
    """Tests OpenAIGPTTokenizer that uses SpaCy and ftfy."""

    pass