为什么Tokenizer跟踪的单词多于num_words?

时间:2019-09-12 04:34:01

标签: python tensorflow keras

我有以下代码

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

sentences = [
             'I love my dog',
             'I love my cat',
             'You love my dog',
]

tokenizer = Tokenizer(num_words=3)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index

print(word_index)
  

输出:{'love':1,'my':2,'i':3,'dog':4,'cat':5,'you':6}

现在我的代码如何跟踪超过3个唯一的常用单词?

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:2)

看着source code,似乎索引被分配给所有遇到的单词。但是,一旦您实际使用令牌生成器将文本转换为索引序列(例如,使用texts_to_sequences),所有“不常用单词”都将被OOV令牌替换。请注意,只有在您实际指定了OOV令牌(您尚未指定)的情况下,此操作才会完成。例子:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

sentences = [
             'I love my dog',
             'I love my cat',
             'You love my dog dog',
]

tokenizer = Tokenizer(num_words=4, oov_token=None)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index

print(word_index)
tokenizer.texts_to_sequences(["I love my cat"])
  

{'love':1,'you':6,'i':4,'dog':3,'my':2,'cat':5}
  [[1,2]]

我稍微修改了文本以打破“ dog”和“ I”之间的纽带,并将存储的单词数增加了一个(无论出于什么原因,指定4实际上仅使用三个最常见的单词...)。您可以看到即使分配了索引,OOV单词(“ I”和“ cat”)也被简单地排除在文本之外。

如果我们指定OOV令牌,则会发生以下情况:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

sentences = [
             'I love my dog',
             'I love my cat',
             'You love my dog dog',
]

tokenizer = Tokenizer(num_words=4, oov_token="oov")
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index

print(word_index)
tokenizer.texts_to_sequences(["I love my cat"])
  

{'love':2,'you':7,'i':5,'dog':4,'my':3,'cat':6,'oov':1}
  [[1、2、3、1]]

如您所见,索引1现在为OOV令牌保留,并且在转换时不频繁的单词分配给该索引。