



'''simple docstring'''

from typing import List, Optional, Union

import numpy as np
import tensorflow as tf

from .utils import logging


SCREAMING_SNAKE_CASE__     :						str	=  logging.get_logger(__name__)






def 				a  (     UpperCamelCase_    :    Union[tf.Tensor, np.ndarray]			)       ->	List[int]:
		if isinstance(UpperCamelCase_      ,					np.ndarray			):
				return list(tensor.shape			)

		snake_case__	     =tf.shape(UpperCamelCase_			)

		if tensor.shape == tf.TensorShape(UpperCamelCase_			):
				return dynamic

		snake_case__	     =tensor.shape.as_list()

		return [dynamic[i] if s is None else s for i, s in enumerate(UpperCamelCase_			)]






def 				a  (     UpperCamelCase_    :    tf.Tensor      ,					UpperCamelCase_    :    Optional[int] = None      ,					UpperCamelCase_    :    Optional[str] = None			)       ->	tf.Tensor:
		return tf.nn.softmax(logits=logits + 1e-9      ,					axis=UpperCamelCase_      ,					name=UpperCamelCase_			)






def 				a  (     UpperCamelCase_    :    Tuple      ,					UpperCamelCase_    :    List[Any]      ,					UpperCamelCase_    :    Optional[Any]      ,					UpperCamelCase_    :    str=1e-5      ,					UpperCamelCase_    :    List[Any]=-1			)       ->	List[Any]:
		# This is a very simplified functional layernorm, designed to duplicate
		# the functionality of PyTorch nn.functional.layer_norm when this is needed to port
		# models in Transformers.

		if weight.shape.rank != 1 or bias.shape.rank != 1 or not isinstance(UpperCamelCase_      ,					UpperCamelCase_			):
				raise NotImplementedError('Only 1D weight and bias tensors are supported for now, with only a single axis.'			)

		# Get mean and variance on the axis to be normalized
		snake_case__     ,	snake_case__	     =tf.nn.moments(UpperCamelCase_      ,					axes=[axis]      ,					keepdims=UpperCamelCase_			)

		if axis != -1:
				# Reshape scale and weight to have the same rank as inputs, but with 1 dimensions
				# on every dimension except axis
				snake_case__	     =[1] * inputs.shape.rank
				snake_case__	     =shape_list(UpperCamelCase_			)[axis]
				snake_case__	     =tf.reshape(UpperCamelCase_      ,					UpperCamelCase_			)
				snake_case__	     =tf.reshape(UpperCamelCase_      ,					UpperCamelCase_			)

		# Compute layer normalization using the batch_normalization
		# function.
		snake_case__	     =tf.nn.batch_normalization(
		    UpperCamelCase_      ,					UpperCamelCase_      ,					UpperCamelCase_      ,					offset=UpperCamelCase_      ,					scale=UpperCamelCase_      ,					variance_epsilon=UpperCamelCase_      ,					)
		return outputs






def 				a  (     UpperCamelCase_    :    str      ,					UpperCamelCase_    :    Optional[int]=0      ,					UpperCamelCase_    :    int=-1			)       ->	int:
		# Replicates the behavior of torch.flatten in TF

		# If end_dim or start_dim is negative, count them from the end
		if end_dim < 0:
				end_dim += input.shape.rank
		if start_dim < 0:
				start_dim += input.shape.rank

		if start_dim == end_dim:
				return input

		snake_case__	     =tf.shape(UpperCamelCase_			)
		snake_case__	     =tf.math.reduce_prod(in_shape[start_dim : end_dim + 1]			)
		snake_case__	     =tf.concat([in_shape[:start_dim], [flattened_dim], in_shape[end_dim + 1 :]]      ,					axis=0			)
		return tf.reshape(UpperCamelCase_      ,					UpperCamelCase_			)






def 				a  (     UpperCamelCase_    :    tf.Tensor			)       ->	tf.Tensor:
		if not isinstance(UpperCamelCase_      ,					tf.Tensor			):
				snake_case__	     =tf.convert_to_tensor(UpperCamelCase_			)  # Catches stray NumPy inputs
		if encoder_attention_mask.shape.rank == 3:
				snake_case__	     =encoder_attention_mask[:, None, :, :]
		if encoder_attention_mask.shape.rank == 2:
				snake_case__	     =encoder_attention_mask[:, None, None, :]
		# T5 has a mask that can compare sequence ids, we can simulate this here with this transposition
		# Cf. https://github.com/tensorflow/mesh/blob/8d2465e9bc93129b913b5ccc6a59aa97abd96ec6/mesh_tensorflow
		# /transformer/transformer_layers.py#L270
		# encoder_extended_attention_mask = (encoder_extended_attention_mask ==
		# encoder_extended_attention_mask.transpose(-1, -2))
		snake_case__	     =(
		    tf.cast(1      ,					encoder_attention_mask.dtype			) - encoder_extended_attention_mask
		) * encoder_extended_attention_mask.dtype.min

		return encoder_extended_attention_mask






def 				a  (     UpperCamelCase_    :    tf.Tensor      ,					UpperCamelCase_    :    int      ,					UpperCamelCase_    :    str = "input_ids"			)       ->	None:
		tf.debugging.assert_less(
		    UpperCamelCase_      ,					tf.cast(UpperCamelCase_      ,					dtype=tensor.dtype			)      ,					message=(
		        f"""The maximum value of {tensor_name} ({tf.math.reduce_max(UpperCamelCase_			)}) must be smaller than the embedding """
		        f"""layer's input dimension ({embed_dim}). The likely cause is some problem at tokenization time."""
		    )      ,					)






def 				a  (     UpperCamelCase_    :    Dict      ,					UpperCamelCase_    :    List[str]      ,					UpperCamelCase_    :    Dict			)       ->	Optional[Any]:
		snake_case__	     =64512
		# Check that no item in `data` is larger than `HDF5_OBJECT_HEADER_LIMIT`
		# because in that case even chunking the array would not make the saving
		# possible.
		snake_case__	     =[x for x in data if len(UpperCamelCase_			) > HDF5_OBJECT_HEADER_LIMIT]

		# Expecting this to never be true.
		if bad_attributes:
				raise RuntimeError(
				    'The following attributes cannot be saved to HDF5 file because '
				    f"""they are larger than {HDF5_OBJECT_HEADER_LIMIT} """
				    f"""bytes: {bad_attributes}"""			)

		snake_case__	     =np.asarray(UpperCamelCase_			)

		snake_case__	     =1
		snake_case__	     =np.array_split(UpperCamelCase_      ,					UpperCamelCase_			)

		# This will never loop forever thanks to the test above.
		while any(x.nbytes > HDF5_OBJECT_HEADER_LIMIT for x in chunked_data			):
				num_chunks += 1
				snake_case__	     =np.array_split(UpperCamelCase_      ,					UpperCamelCase_			)

		if num_chunks > 1:
				for chunk_id, chunk_data in enumerate(UpperCamelCase_			):
						snake_case__	     =chunk_data
		else:
				snake_case__	     =data






def 				a  (     UpperCamelCase_    :    Optional[int]      ,					UpperCamelCase_    :    Dict			)       ->	Optional[int]:
		if name in group.attrs:
				snake_case__	     =[n.decode('utf8'			) if hasattr(UpperCamelCase_      ,					'decode'			) else n for n in group.attrs[name]]
		else:
				snake_case__	     =[]
				snake_case__	     =0
				while "%s%d" % (name, chunk_id) in group.attrs:
						data.extend(
						    [n.decode('utf8'			) if hasattr(UpperCamelCase_      ,					'decode'			) else n for n in group.attrs['%s%d' % (name, chunk_id)]]			)
						chunk_id += 1
		return data






def 				a  (     UpperCamelCase_    :    List[str]			)       ->	List[Any]:

		def _expand_single_ad_tensor(UpperCamelCase_    :    Dict			):
				if isinstance(UpperCamelCase_      ,					tf.Tensor			) and t.shape.rank == 1:
						return tf.expand_dims(UpperCamelCase_      ,					axis=-1			)
				return t

		return tf.nest.map_structure(_expand_single_ad_tensor      ,					UpperCamelCase_			)









'''simple docstring'''

import os
import pickle
import unittest

from transformers import AutoTokenizer
from transformers.models.bert.tokenization_bert import BertTokenizer
from transformers.models.bert_japanese.tokenization_bert_japanese import (
    VOCAB_FILES_NAMES,
    BertJapaneseTokenizer,
    CharacterTokenizer,
    JumanppTokenizer,
    MecabTokenizer,
    SudachiTokenizer,
    WordpieceTokenizer,
)
from transformers.testing_utils import custom_tokenizers, require_jumanpp, require_sudachi

from ...test_tokenization_common import TokenizerTesterMixin

@custom_tokenizers
class 							a__( snake_case__   ,      unittest.TestCase     ):
			a_	: str									=      BertJapaneseTokenizer
			a_	: List[str]									=      False
			a_	: List[Any]									=      True






			def 						_lowercase  (     self						)							->							Union[str, Any]:
					super().setUp()

					snake_case__	     =[
					    '[UNK]',
					    '[CLS]',
					    '[SEP]',
					    'こんにちは',
					    'こん',
					    'にちは',
					    'ばんは',
					    '##こん',
					    '##にちは',
					    '##ばんは',
					    '世界',
					    '##世界',
					    '、',
					    '##、',
					    '。',
					    '##。',
					]

					snake_case__	     =os.path.join(self.tmpdirname					,   VOCAB_FILES_NAMES['vocab_file']						)
					with open(self.vocab_file					,   'w'					,   encoding='utf-8'						) as vocab_writer:
							vocab_writer.write(''.join([x + '\n' for x in vocab_tokens]						)						)






			def 						_lowercase  (     self					,   _UpperCAmelCase						)							->							str:
					snake_case__	     ='こんにちは、世界。 \nこんばんは、世界。'
					snake_case__	     ='こんにちは 、 世界 。 こんばんは 、 世界 。'
					return input_text, output_text






			def 						_lowercase  (     self					,   _UpperCAmelCase						)							->							Any:
					snake_case__     ,	snake_case__	     =self.get_input_output_texts(_UpperCAmelCase						)
					snake_case__	     =tokenizer.encode(_UpperCAmelCase					,   add_special_tokens=_UpperCAmelCase						)
					snake_case__	     =tokenizer.decode(_UpperCAmelCase					,   clean_up_tokenization_spaces=_UpperCAmelCase						)
					return text, ids






			def 						_lowercase  (     self						)							->							Dict:
					pass  # TODO add if relevant






			def 						_lowercase  (     self						)							->							List[str]:
					pass  # TODO add if relevant






			def 						_lowercase  (     self						)							->							str:
					pass  # TODO add if relevant






			def 						_lowercase  (     self						)							->							Any:
					snake_case__	     =self.tokenizer_class(self.vocab_file						)

					snake_case__	     =tokenizer.tokenize('こんにちは、世界。\nこんばんは、世界。'						)
					self.assertListEqual(_UpperCAmelCase					,   ['こんにちは', '、', '世界', '。', 'こん', '##ばんは', '、', '世界', '。']						)
					self.assertListEqual(tokenizer.convert_tokens_to_ids(_UpperCAmelCase						)					,   [3, 12, 10, 14, 4, 9, 12, 10, 14]						)






			def 						_lowercase  (     self						)							->							List[Any]:
					snake_case__	     =self.tokenizer_class(self.vocab_file					,   word_tokenizer_type='mecab'						)
					self.assertIsNotNone(_UpperCAmelCase						)

					snake_case__	     ='こんにちは、世界。\nこんばんは、世界。'
					snake_case__	     =tokenizer.tokenize(_UpperCAmelCase						)
					self.assertListEqual(_UpperCAmelCase					,   ['こんにちは', '、', '世界', '。', 'こん', '##ばんは', '、', '世界', '。']						)
					self.assertListEqual(tokenizer.convert_tokens_to_ids(_UpperCAmelCase						)					,   [3, 12, 10, 14, 4, 9, 12, 10, 14]						)

					snake_case__	     =os.path.join(self.tmpdirname					,   'tokenizer.bin'						)
					with open(_UpperCAmelCase					,   'wb'						) as handle:
							pickle.dump(_UpperCAmelCase					,   _UpperCAmelCase						)

					with open(_UpperCAmelCase					,   'rb'						) as handle:
							snake_case__	     =pickle.load(_UpperCAmelCase						)

					snake_case__	     =tokenizer_new.tokenize(_UpperCAmelCase						)

					self.assertListEqual(_UpperCAmelCase					,   _UpperCAmelCase						)






			def 						_lowercase  (     self						)							->							Any:
					snake_case__	     =MecabTokenizer(mecab_dic='ipadic'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップルストア', 'で', 'iPhone', '8', 'が', '発売', 'さ', 'れ', 'た', '。']					,   )






			def 						_lowercase  (     self						)							->							str:
					try:
							snake_case__	     =MecabTokenizer(mecab_dic='unidic_lite'						)
					except ModuleNotFoundError:
							return

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップル', 'ストア', 'で', 'iPhone', '8', 'が', '発売', 'さ', 'れ', 'た', '。']					,   )






			def 						_lowercase  (     self						)							->							List[str]:
					try:
							snake_case__	     =MecabTokenizer(mecab_dic='unidic'						)
					except ModuleNotFoundError:
							return

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップル', 'ストア', 'で', 'iPhone', '8', 'が', '発売', 'さ', 'れ', 'た', '。']					,   )






			def 						_lowercase  (     self						)							->							int:
					snake_case__	     =MecabTokenizer(do_lower_case=_UpperCAmelCase					,   mecab_dic='ipadic'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップルストア', 'で', 'iphone', '8', 'が', '発売', 'さ', 'れ', 'た', '。']					,   )






			def 						_lowercase  (     self						)							->							List[Any]:
					try:
							snake_case__	     =MecabTokenizer(
							    do_lower_case=_UpperCAmelCase					,   normalize_text=_UpperCAmelCase					,   mecab_option='-d /usr/local/lib/mecab/dic/jumandic'						)
					except RuntimeError:
							# if dict doesn't exist in the system, previous code raises this error.
							return

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['ｱｯﾌﾟﾙストア', 'で', 'iPhone', '８', 'が', '発売', 'さ', 'れた', '\u3000', '。']					,   )






			def 						_lowercase  (     self						)							->							List[Any]:
					snake_case__	     =MecabTokenizer(normalize_text=_UpperCAmelCase					,   mecab_dic='ipadic'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['ｱｯﾌﾟﾙストア', 'で', 'iPhone', '８', 'が', '発売', 'さ', 'れ', 'た', '　', '。']					,   )






			@require_sudachi
			def 						_lowercase  (     self						)							->							List[Any]:
					snake_case__	     =self.tokenizer_class(self.vocab_file					,   word_tokenizer_type='sudachi'						)
					self.assertIsNotNone(_UpperCAmelCase						)

					snake_case__	     ='こんにちは、世界。\nこんばんは、世界。'
					snake_case__	     =tokenizer.tokenize(_UpperCAmelCase						)
					self.assertListEqual(_UpperCAmelCase					,   ['こんにちは', '、', '世界', '。', 'こん', '##ばんは', '、', '世界', '。']						)
					self.assertListEqual(tokenizer.convert_tokens_to_ids(_UpperCAmelCase						)					,   [3, 12, 10, 14, 4, 9, 12, 10, 14]						)

					snake_case__	     =os.path.join(self.tmpdirname					,   'tokenizer.bin'						)
					with open(_UpperCAmelCase					,   'wb'						) as handle:
							pickle.dump(_UpperCAmelCase					,   _UpperCAmelCase						)

					with open(_UpperCAmelCase					,   'rb'						) as handle:
							snake_case__	     =pickle.load(_UpperCAmelCase						)

					snake_case__	     =tokenizer_new.tokenize(_UpperCAmelCase						)

					self.assertListEqual(_UpperCAmelCase					,   _UpperCAmelCase						)






			@require_sudachi
			def 						_lowercase  (     self						)							->							Union[str, Any]:
					snake_case__	     =SudachiTokenizer(sudachi_dict_type='core'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   [' ', '\t', 'アップル', 'ストア', 'で', 'iPhone', '8', ' ', 'が', ' ', ' ', '\n ', '発売', 'さ', 'れ', 'た', ' ', '。', ' ', ' ']					,   )






			@require_sudachi
			def 						_lowercase  (     self						)							->							Optional[Any]:
					snake_case__	     =SudachiTokenizer(sudachi_dict_type='core'					,   sudachi_split_mode='A'						)

					self.assertListEqual(tokenizer.tokenize('外国人参政権'						)					,   ['外国', '人', '参政', '権']						)






			@require_sudachi
			def 						_lowercase  (     self						)							->							List[Any]:
					snake_case__	     =SudachiTokenizer(sudachi_dict_type='core'					,   sudachi_split_mode='B'						)

					self.assertListEqual(tokenizer.tokenize('外国人参政権'						)					,   ['外国人', '参政権']						)






			@require_sudachi
			def 						_lowercase  (     self						)							->							Optional[Any]:
					snake_case__	     =SudachiTokenizer(sudachi_dict_type='core'					,   sudachi_split_mode='C'						)

					self.assertListEqual(tokenizer.tokenize('外国人参政権'						)					,   ['外国人参政権']						)






			@require_sudachi
			def 						_lowercase  (     self						)							->							Tuple:
					snake_case__	     =SudachiTokenizer(do_lower_case=_UpperCAmelCase					,   sudachi_dict_type='core'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   [' ', '\t', 'アップル', 'ストア', 'で', 'iphone', '8', ' ', 'が', ' ', ' ', '\n ', '発売', 'さ', 'れ', 'た', ' ', '。', ' ', ' ']					,   )






			@require_sudachi
			def 						_lowercase  (     self						)							->							Dict:
					snake_case__	     =SudachiTokenizer(normalize_text=_UpperCAmelCase					,   sudachi_dict_type='core'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   [' ', '\t', 'ｱｯﾌﾟﾙ', 'ストア', 'で', 'iPhone', '８', ' ', 'が', ' ', ' ', '\n ', '発売', 'さ', 'れ', 'た', '\u3000', '。', ' ', ' ']					,   )






			@require_sudachi
			def 						_lowercase  (     self						)							->							Optional[int]:
					snake_case__	     =SudachiTokenizer(trim_whitespace=_UpperCAmelCase					,   sudachi_dict_type='core'						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップル', 'ストア', 'で', 'iPhone', '8', 'が', '発売', 'さ', 'れ', 'た', '。']					,   )






			@require_jumanpp
			def 						_lowercase  (     self						)							->							Optional[Any]:
					snake_case__	     =self.tokenizer_class(self.vocab_file					,   word_tokenizer_type='jumanpp'						)
					self.assertIsNotNone(_UpperCAmelCase						)

					snake_case__	     ='こんにちは、世界。\nこんばんは、世界。'
					snake_case__	     =tokenizer.tokenize(_UpperCAmelCase						)
					self.assertListEqual(_UpperCAmelCase					,   ['こんにちは', '、', '世界', '。', 'こん', '##ばんは', '、', '世界', '。']						)
					self.assertListEqual(tokenizer.convert_tokens_to_ids(_UpperCAmelCase						)					,   [3, 12, 10, 14, 4, 9, 12, 10, 14]						)

					snake_case__	     =os.path.join(self.tmpdirname					,   'tokenizer.bin'						)
					with open(_UpperCAmelCase					,   'wb'						) as handle:
							pickle.dump(_UpperCAmelCase					,   _UpperCAmelCase						)

					with open(_UpperCAmelCase					,   'rb'						) as handle:
							snake_case__	     =pickle.load(_UpperCAmelCase						)

					snake_case__	     =tokenizer_new.tokenize(_UpperCAmelCase						)

					self.assertListEqual(_UpperCAmelCase					,   _UpperCAmelCase						)






			@require_jumanpp
			def 						_lowercase  (     self						)							->							int:
					snake_case__	     =JumanppTokenizer()

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップル', 'ストア', 'で', 'iPhone', '8', '\u3000', 'が', '\u3000', '\u3000', '\u3000', '発売', 'さ', 'れた', '\u3000', '。']					,   )






			@require_jumanpp
			def 						_lowercase  (     self						)							->							Tuple:
					snake_case__	     =JumanppTokenizer(do_lower_case=_UpperCAmelCase						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップル', 'ストア', 'で', 'iphone', '8', '\u3000', 'が', '\u3000', '\u3000', '\u3000', '発売', 'さ', 'れた', '\u3000', '。']					,   )






			@require_jumanpp
			def 						_lowercase  (     self						)							->							Tuple:
					snake_case__	     =JumanppTokenizer(normalize_text=_UpperCAmelCase						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['ｱ', 'ｯ', 'ﾌ', 'ﾟ', 'ﾙ', 'ストア', 'で', 'iPhone', '８', '\u3000', 'が', '\u3000', '\u3000', '\u3000', '発売', 'さ', 'れた', '\u3000', '。']					,   )






			@require_jumanpp
			def 						_lowercase  (     self						)							->							int:
					snake_case__	     =JumanppTokenizer(trim_whitespace=_UpperCAmelCase						)

					self.assertListEqual(
					    tokenizer.tokenize(' \tｱｯﾌﾟﾙストアでiPhone８ が  \n 発売された　。  '						)					,   ['アップル', 'ストア', 'で', 'iPhone', '8', 'が', '発売', 'さ', 'れた', '。']					,   )






			@require_jumanpp
			def 						_lowercase  (     self						)							->							str:
					snake_case__	     =JumanppTokenizer()

					self.assertListEqual(
					    tokenizer.tokenize('ありがとうございますm(_ _)ｍ見つけるのが大変です。'						)					,   ['ありがとう', 'ございます', 'm(_ _)m', '見つける', 'の', 'が', '大変です', '。']					,   )






			def 						_lowercase  (     self						)							->							Optional[Any]:
					snake_case__	     =['[UNK]', '[CLS]', '[SEP]', 'こんにちは', 'こん', 'にちは', 'ばんは', '##こん', '##にちは', '##ばんは']

					snake_case__	     ={}
					for i, token in enumerate(_UpperCAmelCase						):
							snake_case__	     =i
					snake_case__	     =WordpieceTokenizer(vocab=_UpperCAmelCase					,   unk_token='[UNK]'						)

					self.assertListEqual(tokenizer.tokenize(''						)					,   []						)

					self.assertListEqual(tokenizer.tokenize('こんにちは'						)					,   ['こんにちは']						)

					self.assertListEqual(tokenizer.tokenize('こんばんは'						)					,   ['こん', '##ばんは']						)

					self.assertListEqual(tokenizer.tokenize('こんばんは こんばんにちは こんにちは'						)					,   ['こん', '##ばんは', '[UNK]', 'こんにちは']						)






			def 						_lowercase  (     self						)							->							Tuple:
					snake_case__	     =BertJapaneseTokenizer.from_pretrained('nlp-waseda/roberta-base-japanese-with-auto-jumanpp'						)
					snake_case__	     =tokenizer.subword_tokenizer

					snake_case__	     =subword_tokenizer.tokenize('国境 の 長い トンネル を 抜ける と 雪国 であった 。'						)
					self.assertListEqual(_UpperCAmelCase					,   ['▁国境', '▁の', '▁長い', '▁トンネル', '▁を', '▁抜ける', '▁と', '▁雪', '国', '▁であった', '▁。']						)

					snake_case__	     =subword_tokenizer.tokenize('こんばんは こんばん にち は こんにちは'						)
					self.assertListEqual(_UpperCAmelCase					,   ['▁こん', 'ばん', 'は', '▁こん', 'ばん', '▁に', 'ち', '▁は', '▁こんにちは']						)






			def 						_lowercase  (     self						)							->							Optional[int]:
					snake_case__	     =self.tokenizer_class.from_pretrained('cl-tohoku/bert-base-japanese'						)

					snake_case__	     =tokenizer.encode('ありがとう。'					,   add_special_tokens=_UpperCAmelCase						)
					snake_case__	     =tokenizer.encode('どういたしまして。'					,   add_special_tokens=_UpperCAmelCase						)

					snake_case__	     =tokenizer.build_inputs_with_special_tokens(_UpperCAmelCase						)
					snake_case__	     =tokenizer.build_inputs_with_special_tokens(_UpperCAmelCase					,   _UpperCAmelCase						)

					# 2 is for "[CLS]", 3 is for "[SEP]"
					assert encoded_sentence == [2] + text + [3]
					assert encoded_pair == [2] + text + [3] + text_a + [3]





@custom_tokenizers
class 							a__( snake_case__   ,      unittest.TestCase     ):
			a_	: int									=      BertJapaneseTokenizer
			a_	: Optional[Any]									=      False






			def 						_lowercase  (     self						)							->							Any:
					super().setUp()

					snake_case__	     =['[UNK]', '[CLS]', '[SEP]', 'こ', 'ん', 'に', 'ち', 'は', 'ば', '世', '界', '、', '。']

					snake_case__	     =os.path.join(self.tmpdirname					,   VOCAB_FILES_NAMES['vocab_file']						)
					with open(self.vocab_file					,   'w'					,   encoding='utf-8'						) as vocab_writer:
							vocab_writer.write(''.join([x + '\n' for x in vocab_tokens]						)						)






			def 						_lowercase  (     self					,   **_UpperCAmelCase						)							->							Union[str, Any]:
					return BertJapaneseTokenizer.from_pretrained(self.tmpdirname					,   subword_tokenizer_type='character'					,   **_UpperCAmelCase						)






			def 						_lowercase  (     self					,   _UpperCAmelCase						)							->							Optional[Any]:
					snake_case__	     ='こんにちは、世界。 \nこんばんは、世界。'
					snake_case__	     ='こ ん に ち は 、 世 界 。 こ ん ば ん は 、 世 界 。'
					return input_text, output_text






			def 						_lowercase  (     self						)							->							List[Any]:
					pass  # TODO add if relevant






			def 						_lowercase  (     self						)							->							Union[str, Any]:
					pass  # TODO add if relevant






			def 						_lowercase  (     self						)							->							Tuple:
					pass  # TODO add if relevant






			def 						_lowercase  (     self						)							->							Any:
					snake_case__	     =self.tokenizer_class(self.vocab_file					,   subword_tokenizer_type='character'						)

					snake_case__	     =tokenizer.tokenize('こんにちは、世界。 \nこんばんは、世界。'						)
					self.assertListEqual(
					    _UpperCAmelCase					,   ['こ', 'ん', 'に', 'ち', 'は', '、', '世', '界', '。', 'こ', 'ん', 'ば', 'ん', 'は', '、', '世', '界', '。']						)
					self.assertListEqual(
					    tokenizer.convert_tokens_to_ids(_UpperCAmelCase						)					,   [3, 4, 5, 6, 7, 11, 9, 10, 12, 3, 4, 8, 4, 7, 11, 9, 10, 12]						)






			def 						_lowercase  (     self						)							->							Optional[Any]:
					snake_case__	     =['[UNK]', '[CLS]', '[SEP]', 'こ', 'ん', 'に', 'ち', 'は', 'ば', '世', '界', '、', '。']

					snake_case__	     ={}
					for i, token in enumerate(_UpperCAmelCase						):
							snake_case__	     =i
					snake_case__	     =CharacterTokenizer(vocab=_UpperCAmelCase					,   unk_token='[UNK]'						)

					self.assertListEqual(tokenizer.tokenize(''						)					,   []						)

					self.assertListEqual(tokenizer.tokenize('こんにちは'						)					,   ['こ', 'ん', 'に', 'ち', 'は']						)

					self.assertListEqual(tokenizer.tokenize('こんにちほ'						)					,   ['こ', 'ん', 'に', 'ち', '[UNK]']						)






			def 						_lowercase  (     self						)							->							Any:
					snake_case__	     =self.tokenizer_class.from_pretrained('cl-tohoku/bert-base-japanese-char'						)

					snake_case__	     =tokenizer.encode('ありがとう。'					,   add_special_tokens=_UpperCAmelCase						)
					snake_case__	     =tokenizer.encode('どういたしまして。'					,   add_special_tokens=_UpperCAmelCase						)

					snake_case__	     =tokenizer.build_inputs_with_special_tokens(_UpperCAmelCase						)
					snake_case__	     =tokenizer.build_inputs_with_special_tokens(_UpperCAmelCase					,   _UpperCAmelCase						)

					# 2 is for "[CLS]", 3 is for "[SEP]"
					assert encoded_sentence == [2] + text + [3]
					assert encoded_pair == [2] + text + [3] + text_a + [3]





@custom_tokenizers
class 							a__( unittest.TestCase     ):






			def 						_lowercase  (     self						)							->							Optional[Any]:
					snake_case__	     ='cl-tohoku/bert-base-japanese'
					snake_case__	     =AutoTokenizer.from_pretrained(_UpperCAmelCase						)
					self.assertIsInstance(_UpperCAmelCase					,   _UpperCAmelCase						)





class 							a__( unittest.TestCase     ):






			def 						_lowercase  (     self						)							->							int:
					snake_case__	     ='cl-tohoku/bert-base-japanese'
					with self.assertLogs('transformers'					,   level='WARNING'						) as cm:
							BertTokenizer.from_pretrained(_UpperCAmelCase						)
							self.assertTrue(
							    cm.records[0].message.startswith(
							        'The tokenizer class you load from this checkpoint is not the same type as the class this function'
							        ' is called from.'						)						)
					snake_case__	     ='bert-base-cased'
					with self.assertLogs('transformers'					,   level='WARNING'						) as cm:
							BertJapaneseTokenizer.from_pretrained(_UpperCAmelCase						)
							self.assertTrue(
							    cm.records[0].message.startswith(
							        'The tokenizer class you load from this checkpoint is not the same type as the class this function'
							        ' is called from.'						)						)




