Как `tfds.features.text.SubwordTextEncoder` создает кодировку слов?

#python #tensorflow #deep-learning #token

#python #тензорный поток #глубокое обучение #токен

Вопрос:

В настоящее время я занимаюсь учебным пособием по преобразованию тензорного потока для преобразования последовательности в последовательность. В начале урока вызывается класс tfds.features.text.SubwordTextEncoder . Этот класс можно использовать для преобразования строки в список с целыми числами, каждое из которых представляет слово.

После использования класса SubwordTextEncoder для обучения английскому токенизатору следующим образом:

 tokenizer_en = tfds.features.text.SubwordTextEncoder.build_from_corpus(
(en.numpy() for pt, en in train_examples), target_vocab_size=2**13)
  

в руководстве показано, как этот токенизатор теперь можно использовать для преобразования строк в списки с целыми числами. Этот фрагмент кода

 sample_string = 'Transformer is awesome.'

tokenized_string = tokenizer_en.encode(sample_string)
print ('Tokenized string is {}'.format(tokenized_string))
  

дает следующий результат:

 [7915, 1248, 7946, 7194, 13, 2799]
  

где отображение целого числа в слово может быть показано следующим образом:

 for ts in tokenized_string:
  print ('{} ----> {}'.format(ts, tokenizer_en.decode([ts])))
  

ВОЗВРАТ

 7915 ----> T
1248 ----> ran
7946 ----> s
7194 ----> former 
13 ----> is 
2799 ----> awesome
  

Для меня все это имеет смысл. Токенизатор распознает слова «is» и «awesome» из своего обучающего набора и присваивает соответствующие целые числа. Слово ‘Transformer’, которого не было в его обучающем наборе, разбивается на части, как указано в документации.

Однако после некоторых экспериментов с токенизатором я запутался. Пожалуйста, рассмотрите следующие фрагменты кода

 sample_string2 = 'the best there is'
tokenized_string2 = tokenizer_en.encode(sample_string2)
print(tokenized_string2)
  

который возвращает

 [3, 332, 64, 156]
  

и

 for ts in tokenized_string2:
  print ('{} ----> {}'.format(ts, tokenizer_en.decode([ts])))
  

который возвращает

 3 ----> the 
332 ----> best 
64 ----> there 
156 ----> is
  

Вопрос: Почему токенизатор возвращает разные целые числа для одного и того же слова, если они находятся в разных частях предложения? Слово ‘is’ отображается на 156 во втором примере, где в первом примере оно отображается на целое число 13, используя тот же токенизатор.

Ответ №1:

Я добавил еще один оператор len(tokenizer_en.decode([ts]) в print оператор, чтобы увидеть длину, и я попробовал приведенный ниже пример —

Пример:

 sample_string2 = 'is is is is is is'
tokenized_string2 = tokenizer_en.encode(sample_string2)
print(tokenized_string2)

for ts in tokenized_string2:
  print ('{} ----> {} ----> {}'.format(ts, tokenizer_en.decode([ts]),len(tokenizer_en.decode([ts]))))
  

Вывод —

 13 ----> is  ----> 3
13 ----> is  ----> 3
13 ----> is  ----> 3
13 ----> is  ----> 3
13 ----> is  ----> 3
156 ----> is ----> 2
  

Согласно документации аргументов, в нем говорится —

vocab_list — list<str> список вложенных слов для словаря. Обратите внимание, что подчеркивание в конце подслова указывает на конец слова (т. Е. Пробел будет вставлен впоследствии при декодировании). Подчеркивания внутри вложенных слов запрещены и должны использовать escape-последовательность подчеркивания.