如何解决需要了解 SubwordTextEncoder tokenizer 背后的概念
我目前正在将 Transformer 模型用于我的 NLP 任务。我正在研究来自 Tensorflow.org 的转换器模型 explanation。
我理解整个模型背后的概念,但我在标记化部分有点卡住了。
标记化使用 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 即将被弃用?
解决方法
基本上,您可以通过三种方式对文本数据进行编码:
- 基于字符(小词汇量)
- 基于单词(大量词汇)
- 基于子词(任何预定义大小的词汇表)。
理想情况下,最好的选择是第二个,因为每个单词都有其语义,可以通过 NN 学习。但是除非您的模型在小领域工作,否则您的词汇量可能太大。神经网络仅需约 3 万个令牌即可有效工作。
当你用字符编码时 - 模型很难有效地找到语义模式。
第三个选项是尝试创建预定义大小的最有效词汇表。最初的词汇由字符组成,然后添加最常用的子词,直到获得所需的大小。
在您的情况下 - 分词器仅基于词汇量相对较大(258)的几个单词创建词汇表。所以你所有的单词都被添加到词汇表中。结果 - 您的词汇包含您的 8 个单词和所有字符。
当您尝试解码一个新句子时 - 解码器在词汇表中找不到任何新词。所以它们是由字符编码的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。