我了解您想要提取每个单词的嵌入,但我认为真正的问题是:分词器产生的输出是什么。
另外,那个分词器有点乱。你会在下面看到我的意思。
因为分词器会过滤单词(假设是一个重要的词汇表),我不想假设单词是按照它们被发现的顺序存储的。所以在这里我使用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(如文档所述),则“我喜欢海龟”将获得与“我喜欢棉花糖”相同的编码。也疯了。
希望您现在必须使用工具来了解标记器为编码层提供的内容。然后希望将令牌与它们的嵌入相关联起来是微不足道的。
请告诉我们您发现了什么。 :)
(有关疯狂的更多信息,请查看this StackOverflow 帖子。)