我有以下代码
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个唯一的常用单词?
我在这里错过了什么吗?
答案 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令牌保留,并且在转换时不频繁的单词分配给该索引。