Keras 中的嵌入层:Vocab Size +1

Embedding Layer in Keras: Vocab Size +1

从我看到的一些例子来看,当我们从keras中使用text_tokenizer时,在为输入层指定输入大小时,我们使用vocab size +1。这自然会产生一个带有 +1 'rows' 的嵌入 space。

例如,我拟合了一个简单模型来估计大小为 3 = I like turtles 的词汇的嵌入向量。嵌入 space 在我们的词汇表中每个词的长度为 5。

嵌入权重为:

0.01209533  0.034303080 -0.04666784 0.02803965  -0.03691160
-0.01302978 -0.030584216    -0.02506201 0.04771456  0.01906699
0.02800793  0.042204402 0.05223191  -0.01184921 0.02000498
0.02692273  -0.008792922    0.01560913  -0.02783649 0.02692282

我的问题:我假设矩阵中的第一个 "row" 是基于 0 的向量,这样第 2、3 和 4 行将与 "I"、"like", 和 "turtles" 分别。

是这样吗?我想确保我的词汇正确对齐,但我无法确定任何文档来证实这个假设。

我知道您想提取每个单词的嵌入,但我认为真正的问题是:分词器产生的输出是什么。

另外,分词器有点乱。你会在下面明白我的意思。

因为分词器会过滤单词(假设是一个非常重要的词汇表​​),我不想假设单词是按照它们被发现的顺序存储的。所以在这里我使用 word_index 以编程方式确定词汇表。然后我明确地检查哪些词在 过滤最常用的词后 被标记化。 (Word_index 记住 所有 个单词;即预过滤值。)

import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
corpus = 'I like turtles'
num_words = len(corpus.split())
oov = 'OOV'
tokenizer = Tokenizer(num_words=num_words + 2, oov_token=oov)
tokenizer.fit_on_texts(corpus.split())
print(f'word_index: {tokenizer.word_index}')
print(f'vocabulary: {tokenizer.word_index.keys()}')
text = [key for key in tokenizer.word_index.keys()]
print(f'keys: {text}: {tokenizer.texts_to_sequences(text)}')

text = 'I like turtles'.split()
print(f'{text}: {tokenizer.texts_to_sequences(text)}')

text = 'I like marshmallows'.split() 
print(f'{text}: {tokenizer.texts_to_sequences(text)}')

这会产生以下输出:

word_index: {'OOV': 1, 'i': 2, 'like': 3, 'turtles': 4}
vocabulary: dict_keys(['OOV', 'i', 'like', 'turtles'])
keys: ['OOV', 'i', 'like', 'turtles']: [[1], [2], [3], [4]]
['I', 'like', 'turtles']: [[2], [3], [4]]
['I', 'like', 'marshmallows']: [[2], [3], [1]]

但是,如果您指定 oov_token,输出将如下所示:

{'OOV': 1, 'i': 2, 'like': 3, 'turtles': 4}

请注意我必须指定 num_words=num_words + 2 而不是预期的“+1”。 那是因为我们明确定义了一个 OOV 标记,它被添加到词汇表中,这在我看来有点疯狂。

如果您指定 OOV 令牌并设置 num_words=num_words + 1(如文档所述),则 'I like turtles' 获得与 'I like marshmallows' 相同的编码。也很疯狂。

希望您现在拥有了解分词器向编码层提供什么的工具。然后希望将令牌与其嵌入相关联是微不足道的。

请让我们知道您找到了什么。 :)

(有关疯狂的更多信息,请查看 Whosebug post。)