



"""simple docstring"""


import unittest

import numpy as np

from transformers.testing_utils import require_torch, require_vision
from transformers.utils import is_torch_available, is_vision_available

from ...test_image_processing_common import ImageProcessingSavingTestMixin


if is_torch_available():
				import torch

if is_vision_available():
				from PIL import Image

				from transformers import CLIPImageProcessor







class    A_    (  unittest.TestCase       ):



						"""simple docstring"""






						def __init__(      self				:Tuple     ,						lowercase_				:Any     ,						lowercase_				:Optional[Any]=7     ,						lowercase_				:List[str]=3     ,						lowercase_				:Dict=18     ,						lowercase_				:Optional[int]=30     ,						lowercase_				:Optional[Any]=4_00     ,						lowercase_				:Any=True     ,						lowercase_				:str=None     ,						lowercase_				:str=True     ,						lowercase_				:Optional[Any]=None     ,						lowercase_				:Union[str, Any]=True     ,						lowercase_				:Union[str, Any]=[0.4814_5466, 0.457_8275, 0.4082_1073]     ,						lowercase_				:List[str]=[0.2686_2954, 0.2613_0258, 0.2757_7711]     ,						lowercase_				:Optional[int]=True     ,						)       ->    Union[str, Any]:
												UpperCAmelCase    =				size if size is not None else {'shortest_edge': 20}
												UpperCAmelCase    =				crop_size if crop_size is not None else {'height': 18, 'width': 18}
												UpperCAmelCase    =				parent
												UpperCAmelCase    =				batch_size
												UpperCAmelCase    =				num_channels
												UpperCAmelCase    =				image_size
												UpperCAmelCase    =				min_resolution
												UpperCAmelCase    =				max_resolution
												UpperCAmelCase    =				do_resize
												UpperCAmelCase    =				size
												UpperCAmelCase    =				do_center_crop
												UpperCAmelCase    =				crop_size
												UpperCAmelCase    =				do_normalize
												UpperCAmelCase    =				image_mean
												UpperCAmelCase    =				image_std
												UpperCAmelCase    =				do_convert_rgb






						def 			UpperCAmelCase__  (      self				:Union[str, Any]      )       ->    Union[str, Any]:
												return {
												    "do_resize": self.do_resize,
												    "size": self.size,
												    "do_center_crop": self.do_center_crop,
												    "crop_size": self.crop_size,
												    "do_normalize": self.do_normalize,
												    "image_mean": self.image_mean,
												    "image_std": self.image_std,
												    "do_convert_rgb": self.do_convert_rgb,
												}






						def 			UpperCAmelCase__  (      self				:Dict     ,						lowercase_				:Optional[Any]=False     ,						lowercase_				:int=False     ,						lowercase_				:List[str]=False      )       ->    List[Any]:
												assert not (numpify and torchify), "You cannot specify both numpy and PyTorch tensors at the same time"

												if equal_resolution:
																		UpperCAmelCase    =				[]
																		for i in range(self.batch_size      ):
																								image_inputs.append(
																								    np.random.randint(
																								        2_55     ,						size=(self.num_channels, self.max_resolution, self.max_resolution)     ,						dtype=np.uinta      )      )
												else:
																		UpperCAmelCase    =				[]
																		for i in range(self.batch_size      ):
																								UpperCAmelCase   ,					UpperCAmelCase    =				np.random.choice(np.arange(self.min_resolution     ,						self.max_resolution      )     ,						2      )
																								image_inputs.append(np.random.randint(2_55     ,						size=(self.num_channels, width, height)     ,						dtype=np.uinta      )      )

												if not numpify and not torchify:
																		# PIL expects the channel dimension as last dimension
																		UpperCAmelCase    =				[Image.fromarray(np.moveaxis(lowercase_     ,						0     ,						-1      )      ) for x in image_inputs]

												if torchify:
																		UpperCAmelCase    =				[torch.from_numpy(lowercase_      ) for x in image_inputs]

												return image_inputs







@require_torch
@require_vision
class    A_    (  SCREAMING_SNAKE_CASE_			,     unittest.TestCase       ):



						"""simple docstring"""
						__UpperCamelCase	       =							CLIPImageProcessor if is_vision_available() else None






						def 			UpperCAmelCase__  (      self				:Union[str, Any]      )       ->    Union[str, Any]:
												UpperCAmelCase    =				CLIPImageProcessingTester(self      )






						@property
						def 			UpperCAmelCase__  (      self				:List[str]      )       ->    str:
												return self.image_processor_tester.prepare_image_processor_dict()






						def 			UpperCAmelCase__  (      self				:List[Any]      )       ->    Union[str, Any]:
												UpperCAmelCase    =				self.image_processing_class(**self.image_processor_dict      )
												self.assertTrue(hasattr(lowercase_     ,						'do_resize'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'size'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'do_center_crop'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'center_crop'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'do_normalize'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'image_mean'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'image_std'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'do_convert_rgb'      )      )






						def 			UpperCAmelCase__  (      self				:str      )       ->    Dict:
												UpperCAmelCase    =				self.image_processing_class.from_dict(self.image_processor_dict      )
												self.assertEqual(image_processor.size     ,						{'shortest_edge': 20}      )
												self.assertEqual(image_processor.crop_size     ,						{'height': 18, 'width': 18}      )

												UpperCAmelCase    =				self.image_processing_class.from_dict(self.image_processor_dict     ,						size=42     ,						crop_size=84      )
												self.assertEqual(image_processor.size     ,						{'shortest_edge': 42}      )
												self.assertEqual(image_processor.crop_size     ,						{'height': 84, 'width': 84}      )






						def 			UpperCAmelCase__  (      self				:Tuple      )       ->    Any:
												pass






						def 			UpperCAmelCase__  (      self				:Union[str, Any]      )       ->    int:
												# Initialize image_processing
												UpperCAmelCase    =				self.image_processing_class(**self.image_processor_dict      )
												# create random PIL images
												UpperCAmelCase    =				self.image_processor_tester.prepare_inputs(equal_resolution=lowercase_      )
												for image in image_inputs:
																		self.assertIsInstance(lowercase_     ,						Image.Image      )

												# Test not batched input
												UpperCAmelCase    =				image_processing(image_inputs[0]     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        1,
												        self.image_processor_tester.num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)

												# Test batched
												UpperCAmelCase    =				image_processing(lowercase_     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        self.image_processor_tester.batch_size,
												        self.image_processor_tester.num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)






						def 			UpperCAmelCase__  (      self				:List[str]      )       ->    Tuple:
												# Initialize image_processing
												UpperCAmelCase    =				self.image_processing_class(**self.image_processor_dict      )
												# create random numpy tensors
												UpperCAmelCase    =				self.image_processor_tester.prepare_inputs(equal_resolution=lowercase_     ,						numpify=lowercase_      )
												for image in image_inputs:
																		self.assertIsInstance(lowercase_     ,						np.ndarray      )

												# Test not batched input
												UpperCAmelCase    =				image_processing(image_inputs[0]     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        1,
												        self.image_processor_tester.num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)

												# Test batched
												UpperCAmelCase    =				image_processing(lowercase_     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        self.image_processor_tester.batch_size,
												        self.image_processor_tester.num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)






						def 			UpperCAmelCase__  (      self				:List[Any]      )       ->    Tuple:
												# Initialize image_processing
												UpperCAmelCase    =				self.image_processing_class(**self.image_processor_dict      )
												# create random PyTorch tensors
												UpperCAmelCase    =				self.image_processor_tester.prepare_inputs(equal_resolution=lowercase_     ,						torchify=lowercase_      )
												for image in image_inputs:
																		self.assertIsInstance(lowercase_     ,						torch.Tensor      )

												# Test not batched input
												UpperCAmelCase    =				image_processing(image_inputs[0]     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        1,
												        self.image_processor_tester.num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)

												# Test batched
												UpperCAmelCase    =				image_processing(lowercase_     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        self.image_processor_tester.batch_size,
												        self.image_processor_tester.num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)







@require_torch
@require_vision
class    A_    (  SCREAMING_SNAKE_CASE_			,     unittest.TestCase       ):



						"""simple docstring"""
						__UpperCamelCase	       =							CLIPImageProcessor if is_vision_available() else None






						def 			UpperCAmelCase__  (      self				:str      )       ->    Tuple:
												UpperCAmelCase    =				CLIPImageProcessingTester(self     ,						num_channels=4      )
												UpperCAmelCase    =				3






						@property
						def 			UpperCAmelCase__  (      self				:Union[str, Any]      )       ->    Optional[int]:
												return self.image_processor_tester.prepare_image_processor_dict()






						def 			UpperCAmelCase__  (      self				:str      )       ->    List[Any]:
												UpperCAmelCase    =				self.image_processing_class(**self.image_processor_dict      )
												self.assertTrue(hasattr(lowercase_     ,						'do_resize'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'size'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'do_center_crop'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'center_crop'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'do_normalize'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'image_mean'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'image_std'      )      )
												self.assertTrue(hasattr(lowercase_     ,						'do_convert_rgb'      )      )






						def 			UpperCAmelCase__  (      self				:Union[str, Any]      )       ->    Dict:
												pass






						def 			UpperCAmelCase__  (      self				:Optional[Any]      )       ->    Union[str, Any]:
												# Initialize image_processing
												UpperCAmelCase    =				self.image_processing_class(**self.image_processor_dict      )
												# create random PIL images
												UpperCAmelCase    =				self.image_processor_tester.prepare_inputs(equal_resolution=lowercase_      )
												for image in image_inputs:
																		self.assertIsInstance(lowercase_     ,						Image.Image      )

												# Test not batched input
												UpperCAmelCase    =				image_processing(image_inputs[0]     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        1,
												        self.expected_encoded_image_num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)

												# Test batched
												UpperCAmelCase    =				image_processing(lowercase_     ,						return_tensors='pt'      ).pixel_values
												self.assertEqual(
												    encoded_images.shape     ,						(
												        self.image_processor_tester.batch_size,
												        self.expected_encoded_image_num_channels,
												        self.image_processor_tester.crop_size['height'],
												        self.image_processor_tester.crop_size['width'],
												    )     ,						)










"""simple docstring"""


import json
import os
import re
import unicodedata
from typing import Optional, Tuple

from ...tokenization_utils import PreTrainedTokenizer, _is_control, _is_punctuation, _is_whitespace
from ...utils import logging


snake_case_         = logging.get_logger(__name__)

snake_case_         = {
    """vocab_file""": """vocab.json""",
    """merges_file""": """merges.txt""",
}

snake_case_         = {
    """vocab_file""": {"""openai-gpt""": """https://huggingface.co/openai-gpt/resolve/main/vocab.json"""},
    """merges_file""": {"""openai-gpt""": """https://huggingface.co/openai-gpt/resolve/main/merges.txt"""},
}

snake_case_         = {
    """openai-gpt""": 512,
}

def 				_lowerCAmelCase   (     lowercase_		):
						UpperCAmelCase    =				text.strip()
						if not text:
												return []
						UpperCAmelCase    =				text.split()
						return tokens







class    A_    (  SCREAMING_SNAKE_CASE_       ):



						"""simple docstring"""






						def __init__(      self				:Dict     ,						lowercase_				:int=True     ,						lowercase_				:Union[str, Any]=None     ,						lowercase_				:List[Any]=True     ,						lowercase_				:List[str]=None     ,						lowercase_				:Optional[int]=True     ,						)       ->    Any:
												if never_split is None:
																		UpperCAmelCase    =				[]
												UpperCAmelCase    =				do_lower_case
												UpperCAmelCase    =				set(lowercase_      )
												UpperCAmelCase    =				tokenize_chinese_chars
												UpperCAmelCase    =				strip_accents
												UpperCAmelCase    =				do_split_on_punc






						def 			UpperCAmelCase__  (      self				:List[str]     ,						lowercase_				:Optional[int]     ,						lowercase_				:int=None      )       ->    List[Any]:
												UpperCAmelCase    =				self.never_split.union(set(lowercase_      )      ) if never_split else self.never_split
												UpperCAmelCase    =				self._clean_text(lowercase_      )

												# This was added on November 1st, 2018 for the multilingual and Chinese
												# models. This is also applied to the English models now, but it doesn't
												# matter since the English models were not trained on any Chinese data
												# and generally don't have any Chinese data in them (there are Chinese
												# characters in the vocabulary because Wikipedia does have some Chinese
												# words in the English Wikipedia.).
												if self.tokenize_chinese_chars:
																		UpperCAmelCase    =				self._tokenize_chinese_chars(lowercase_      )
												# prevents treating the same character with different unicode codepoints as different characters
												UpperCAmelCase    =				unicodedata.normalize('NFC'     ,						lowercase_      )
												UpperCAmelCase    =				whitespace_tokenize(lowercase_      )
												UpperCAmelCase    =				[]
												for token in orig_tokens:
																		if token not in never_split:
																								if self.do_lower_case:
																														UpperCAmelCase    =				token.lower()
																														if self.strip_accents is not False:
																																				UpperCAmelCase    =				self._run_strip_accents(lowercase_      )
																								elif self.strip_accents:
																														UpperCAmelCase    =				self._run_strip_accents(lowercase_      )
																		split_tokens.extend(self._run_split_on_punc(lowercase_     ,						lowercase_      )      )

												UpperCAmelCase    =				whitespace_tokenize(' '.join(lowercase_      )      )
												return output_tokens






						def 			UpperCAmelCase__  (      self				:Tuple     ,						lowercase_				:int      )       ->    Tuple:
												UpperCAmelCase    =				unicodedata.normalize('NFD'     ,						lowercase_      )
												UpperCAmelCase    =				[]
												for char in text:
																		UpperCAmelCase    =				unicodedata.category(lowercase_      )
																		if cat == "Mn":
																								continue
																		output.append(lowercase_      )
												return "".join(lowercase_      )






						def 			UpperCAmelCase__  (      self				:Optional[Any]     ,						lowercase_				:Tuple     ,						lowercase_				:Optional[Any]=None      )       ->    Optional[int]:
												if not self.do_split_on_punc or (never_split is not None and text in never_split):
																		return [text]
												UpperCAmelCase    =				list(lowercase_      )
												UpperCAmelCase    =				0
												UpperCAmelCase    =				True
												UpperCAmelCase    =				[]
												while i < len(lowercase_      ):
																		UpperCAmelCase    =				chars[i]
																		if _is_punctuation(lowercase_      ):
																								output.append([char]      )
																								UpperCAmelCase    =				True
																		else:
																								if start_new_word:
																														output.append([]      )
																								UpperCAmelCase    =				False
																								output[-1].append(lowercase_      )
																		i += 1

												return ["".join(lowercase_      ) for x in output]






						def 			UpperCAmelCase__  (      self				:Optional[int]     ,						lowercase_				:str      )       ->    int:
												UpperCAmelCase    =				[]
												for char in text:
																		UpperCAmelCase    =				ord(lowercase_      )
																		if self._is_chinese_char(lowercase_      ):
																								output.append(' '      )
																								output.append(lowercase_      )
																								output.append(' '      )
																		else:
																								output.append(lowercase_      )
												return "".join(lowercase_      )






						def 			UpperCAmelCase__  (      self				:List[Any]     ,						lowercase_				:int      )       ->    Optional[Any]:
												# This defines a "chinese character" as anything in the CJK Unicode block:
												#   https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block)
												#
												# Note that the CJK Unicode block is NOT all Japanese and Korean characters,
												# despite its name. The modern Korean Hangul alphabet is a different block,
												# as is Japanese Hiragana and Katakana. Those alphabets are used to write
												# space-separated words, so they are not treated specially and handled
												# like the all of the other languages.
												if (
												    (cp >= 0x4E00 and cp <= 0x9FFF)
												    or (cp >= 0x3400 and cp <= 0x4DBF)  #
												    or (cp >= 0x20000 and cp <= 0x2A6DF)  #
												    or (cp >= 0x2A700 and cp <= 0x2B73F)  #
												    or (cp >= 0x2B740 and cp <= 0x2B81F)  #
												    or (cp >= 0x2B820 and cp <= 0x2CEAF)  #
												    or (cp >= 0xF900 and cp <= 0xFAFF)
												    or (cp >= 0x2F800 and cp <= 0x2FA1F)  #
												):  #
																		return True

												return False






						def 			UpperCAmelCase__  (      self				:Optional[Any]     ,						lowercase_				:int      )       ->    List[Any]:
												UpperCAmelCase    =				[]
												for char in text:
																		UpperCAmelCase    =				ord(lowercase_      )
																		if cp == 0 or cp == 0xFFFD or _is_control(lowercase_      ):
																								continue
																		if _is_whitespace(lowercase_      ):
																								output.append(' '      )
																		else:
																								output.append(lowercase_      )
												return "".join(lowercase_      )


def 				_lowerCAmelCase   (     lowercase_		):
						UpperCAmelCase    =				set()
						UpperCAmelCase    =				word[0]
						for char in word[1:]:
												pairs.add((prev_char, char)		)
												UpperCAmelCase    =				char
						return pairs

def 				_lowerCAmelCase   (     lowercase_		):
						UpperCAmelCase    =				text.replace('—'	,			'-'		)
						UpperCAmelCase    =				text.replace('–'	,			'-'		)
						UpperCAmelCase    =				text.replace('―'	,			'-'		)
						UpperCAmelCase    =				text.replace('…'	,			'...'		)
						UpperCAmelCase    =				text.replace('´'	,			'\''		)
						UpperCAmelCase    =				re.sub(R'(-+|~+|!+|"+|;+|\?+|\++|,+|\)+|\(+|\\+|\/+|\*+|\[+|\]+|}+|{+|\|+|_+)'	,			R' \1 '	,			lowercase_		)
						UpperCAmelCase    =				re.sub(R'\s*\n\s*'	,			' \n '	,			lowercase_		)
						UpperCAmelCase    =				re.sub(R'[^\S\n]+'	,			' '	,			lowercase_		)
						return text.strip()







class    A_    (  SCREAMING_SNAKE_CASE_       ):



						"""simple docstring"""
						__UpperCamelCase	       =							VOCAB_FILES_NAMES
						__UpperCamelCase	       =							PRETRAINED_VOCAB_FILES_MAP
						__UpperCamelCase	       =							PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
						__UpperCamelCase	       =							["""input_ids""", """attention_mask"""]






						def __init__(      self				:Dict     ,						lowercase_				:Optional[int]     ,						lowercase_				:Dict     ,						lowercase_				:List[str]="<unk>"     ,						**lowercase_				:Tuple      )       ->    Dict:
												super().__init__(unk_token=lowercase_     ,						**lowercase_      )

												try:
																		import ftfy
																		from spacy.lang.en import English

																		UpperCAmelCase    =				English()
																		UpperCAmelCase    =				_nlp.tokenizer
																		UpperCAmelCase    =				ftfy.fix_text
												except ImportError:
																		logger.warning('ftfy or spacy is not installed using BERT BasicTokenizer instead of SpaCy & ftfy.'      )
																		UpperCAmelCase    =				BasicTokenizer(do_lower_case=lowercase_      )
																		UpperCAmelCase    =				None

												with open(lowercase_     ,						encoding='utf-8'      ) as vocab_handle:
																		UpperCAmelCase    =				json.load(lowercase_      )
												UpperCAmelCase    =				{v: k for k, v in self.encoder.items()}
												with open(lowercase_     ,						encoding='utf-8'      ) as merges_handle:
																		UpperCAmelCase    =				merges_handle.read().split('\n'      )[1:-1]
												UpperCAmelCase    =				[tuple(merge.split()      ) for merge in merges]
												UpperCAmelCase    =				dict(zip(lowercase_     ,						range(len(lowercase_      )      )      )      )
												UpperCAmelCase    =				{}






						@property
						def 			UpperCAmelCase__  (      self				:Union[str, Any]      )       ->    List[Any]:
												return True






						@property
						def 			UpperCAmelCase__  (      self				:str      )       ->    str:
												return len(self.encoder      )






						def 			UpperCAmelCase__  (      self				:Optional[int]      )       ->    Optional[Any]:
												return dict(self.encoder     ,						**self.added_tokens_encoder      )






						def 			UpperCAmelCase__  (      self				:Union[str, Any]     ,						lowercase_				:List[Any]      )       ->    int:
												UpperCAmelCase    =				tuple(token[:-1]      ) + (token[-1] + '</w>',)
												if token in self.cache:
																		return self.cache[token]
												UpperCAmelCase    =				get_pairs(lowercase_      )

												if not pairs:
																		return token + "</w>"

												while True:
																		UpperCAmelCase    =				min(lowercase_     ,						key=lambda lowercase_      : self.bpe_ranks.get(lowercase_     ,						float('inf'      )      )      )
																		if bigram not in self.bpe_ranks:
																								break
																		UpperCAmelCase   ,					UpperCAmelCase    =				bigram
																		UpperCAmelCase    =				[]
																		UpperCAmelCase    =				0
																		while i < len(lowercase_      ):
																								try:
																														UpperCAmelCase    =				word.index(lowercase_     ,						lowercase_      )
																								except ValueError:
																														new_word.extend(word[i:]      )
																														break
																								else:
																														new_word.extend(word[i:j]      )
																														UpperCAmelCase    =				j

																								if word[i] == first and i < len(lowercase_      ) - 1 and word[i + 1] == second:
																														new_word.append(first + second      )
																														i += 2
																								else:
																														new_word.append(word[i]      )
																														i += 1
																		UpperCAmelCase    =				tuple(lowercase_      )
																		UpperCAmelCase    =				new_word
																		if len(lowercase_      ) == 1:
																								break
																		else:
																								UpperCAmelCase    =				get_pairs(lowercase_      )
												UpperCAmelCase    =				' '.join(lowercase_      )
												if word == "\n  </w>":
																		UpperCAmelCase    =				'\n</w>'
												UpperCAmelCase    =				word
												return word






						def 			UpperCAmelCase__  (      self				:List[str]     ,						lowercase_				:Union[str, Any]      )       ->    str:
												UpperCAmelCase    =				[]
												if self.fix_text is None:
																		# Using BERT's BasicTokenizer
																		UpperCAmelCase    =				self.nlp.tokenize(lowercase_      )
																		for token in text:
																								split_tokens.extend(list(self.bpe(lowercase_      ).split(' '      )      )      )
												else:
																		# Using SpaCy & ftfy (original tokenization process of OpenAI GPT)
																		UpperCAmelCase    =				self.nlp(text_standardize(self.fix_text(lowercase_      )      )      )
																		for token in text:
																								split_tokens.extend(list(self.bpe(token.text.lower()      ).split(' '      )      )      )
												return split_tokens






						def 			UpperCAmelCase__  (      self				:Tuple     ,						lowercase_				:Optional[Any]      )       ->    Tuple:
												return self.encoder.get(lowercase_     ,						self.encoder.get(self.unk_token      )      )






						def 			UpperCAmelCase__  (      self				:List[Any]     ,						lowercase_				:str      )       ->    Union[str, Any]:
												return self.decoder.get(lowercase_     ,						self.unk_token      )






						def 			UpperCAmelCase__  (      self				:Tuple     ,						lowercase_				:Optional[Any]      )       ->    Tuple:
												UpperCAmelCase    =				''.join(lowercase_      ).replace('</w>'     ,						' '      ).strip()
												return out_string






						def 			UpperCAmelCase__  (      self				:List[str]     ,						lowercase_				:str     ,						lowercase_				:Optional[str] = None      )       ->    Tuple[str]:
												if not os.path.isdir(lowercase_      ):
																		logger.error(f"""Vocabulary path ({save_directory}) should be a directory"""      )
																		return
												UpperCAmelCase    =				os.path.join(
												    lowercase_     ,						(filename_prefix + '-' if filename_prefix else '') + VOCAB_FILES_NAMES['vocab_file']      )
												UpperCAmelCase    =				os.path.join(
												    lowercase_     ,						(filename_prefix + '-' if filename_prefix else '') + VOCAB_FILES_NAMES['merges_file']      )

												with open(lowercase_     ,						'w'     ,						encoding='utf-8'      ) as f:
																		f.write(json.dumps(self.encoder     ,						indent=2     ,						sort_keys=lowercase_     ,						ensure_ascii=lowercase_      ) + '\n'      )

												UpperCAmelCase    =				0
												with open(lowercase_     ,						'w'     ,						encoding='utf-8'      ) as writer:
																		writer.write('#version: 0.2\n'      )
																		for bpe_tokens, token_index in sorted(self.bpe_ranks.items()     ,						key=lambda lowercase_      : kv[1]      ):
																								if index != token_index:
																														logger.warning(
																														    f"""Saving vocabulary to {merge_file}: BPE merge indices are not consecutive."""
																														    ' Please check that the tokenizer is not corrupted!'      )
																														UpperCAmelCase    =				token_index
																								writer.write(' '.join(lowercase_      ) + '\n'      )
																								index += 1

												return vocab_file, merge_file





