【问题标题】:Need to understand the concept behind SubwordTextEncoder tokenizer需要了解 SubwordTextEncoder 分词器背后的概念
【发布时间】:2021-01-08 10:35:55
【问题描述】:

我目前正在为我的 NLP 任务使用转换器模型。我正在研究来自 Tensorflow.org 的变压器模型 explanation

我理解整个模型背后的概念,但我在标记化部分有点卡住。

Tokenization 使用 SubwordTextEncoder API,我们需要首先构建词汇表,然后用一组标记替换句子(为了被模型理解),我们使用它的 .encode() 函数。

当我查看 tensorflow 网站上给出的它的用法时,我发现有点令人费解,因为这种编码如何有助于自我注意。

为了验证我对其实现的理解,我用 2 个句子创建了自己的词汇表 - ['My name is xyz.我正在做实验。']如下-

my_tokenizer = tfds.deprecated.text.SubwordTextEncoder.build_from_corpus(
   (ex for ex in ['My name is xyz. I am doing experiments.']), target_vocab_size=258)

在这之后,我尝试编码几个句子。

首先,

代码-->

tokenized_string = my_tokenizer.encode('I am doing xyz.')
for ts in tokenized_string:
  print ('{} ----> {}'.format(ts, my_tokenizer.decode([ts])))

输出 -->

8 ----> I 
6 ----> am 
5 ----> doing 
1 ----> xyz
56 ----> .

另一个字符串是 -

代码-->

tokenized_string = my_tokenizer.encode('very nice.')
for ts in tokenized_string:
  print ('{} ----> {}'.format(ts, my_tokenizer.decode([ts])))

输出 -->

128 ----> v
111 ----> e
124 ----> r
131 ----> y
42 ---->  
120 ----> n
115 ----> i
109 ----> c
111 ----> e
56 ----> .

谁能告诉我这如何帮助实现更好的自我关注?或者这是执行标记化的旧方式,因为我可以看到这个特定的 API 即将被弃用?

【问题讨论】:

    标签: python tensorflow deep-learning nlp transformer


    【解决方案1】:

    基本上你有三个选项来编码你的文本数据:

    1. 基于字符(小词汇量)
    2. 基于单词(大量词汇)
    3. 基于子词(任何预定义大小的词汇)。

    理想情况下,最好的选择是第二个,因为每个单词都有它的语义,神经网络可以学习。但是你的词汇量可能太大,除非你的模型在一个小领域工作。神经网络只需约 3 万个令牌即可高效工作。

    当您使用字符进行编码时 - 模型很难有效地找到语义模式。

    第三个选项是尝试创建预定义大小的最有效词汇表。最初的词汇表由字符组成,然后添加最常见的子词,直到获得理想的大小。

    在您的情况下 - 标记器仅根据词汇量相对较大 (258) 的几个单词创建词汇表。因此,您的所有单词都已添加到词汇表中。结果 - 您的词汇表由 8 个单词和所有字符组成。

    当您尝试解码一个新句子时 - 解码器在词汇表中找不到任何新词。所以它们是由字符编码的。

    请看这里 - https://en.wikipedia.org/wiki/Byte_pair_encoding

    【讨论】:

    • 是的。我明白它在做什么。实际上,它并没有让我创建大小小于 258 的词汇表,原因是它想添加所有字符、数字和特殊字符。我想知道的是,这如何有助于实现自我关注,因为这些单独的字符本身没有任何语义意义。
    • @Pallavi 如果您不添加字符 - 您将无法对词汇表中的 258 个单词以外的任何内容进行编码。通常,您的词汇表包含 30000 个标记。在这种情况下,字符具有一些语义含义:例如该模型可能能够预测诸如“very”、“nic”、“e”之类的内容。它比'very'、'nic'、''好得多
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多