#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-последовательность подчеркивания.