Keras Tokenizer num_words似乎不起作用

时间:2017-09-13 16:24:47

标签: machine-learning neural-network keras deep-learning tokenize

>>> t = Tokenizer(num_words=3)
>>> l = ["Hello, World! This is so&#$ fantastic!", "There is no other world like this one"]
>>> t.fit_on_texts(l)
>>> t.word_index
{'fantastic': 6, 'like': 10, 'no': 8, 'this': 2, 'is': 3, 'there': 7, 'one': 11, 'other': 9, 'so': 5, 'world': 1, 'hello': 4}

我预计t.word_index只有前3个单词。我做错了什么?

4 个答案:

答案 0 :(得分:8)

你在做什么没有错。 word_index的计算方法与您以后使用的最常用词数相同(正如您可能会看到here)。因此,当你打电话给任何变形方法时 - Tokenizer将只使用三个最常见的单词,同时,它将保留所有单词的反击 - 即使很明显它不会使用它后面。

答案 1 :(得分:2)

只需增加Marcin的答案即可(“它将保留所有单词的计数器-即使很明显以后不再使用它也可以。”)

它与所有字词相反的原因是您可以多次调用fit_on_texts。每次它将更新内部计数器,并在调用转换时,它将使用基于更新的计数器的高位字。

希望有帮助。

答案 2 :(得分:1)

只是在 farid khafizov 的回答中添加一点, 从texts_to_sequences的结果中去除num_words及以上序列的单词(第1句4个,第2句5个,第3句6个分别消失)

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

print(tf.__version__) # 2.4.1, in my case
sentences = [
    'I love my dog',
    'I, love my cat',
    'You love my dog!'
]

tokenizer = Tokenizer(num_words=4)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index
seq = tokenizer.texts_to_sequences(sentences)
print(word_index)  # {'love': 1, 'my': 2, 'i': 3, 'dog': 4, 'cat': 5, 'you': 6}
print(seq)         # [[3, 1, 2], [3, 1, 2], [1, 2]]

答案 3 :(得分:0)

个单词限制为少量(例如3个)不会影响 fit_on_texts输出,例如 word_index,word_counts,word_docs 。它确实对 texts_to_matrix 具有影响。生成的矩阵将具有 num_words (3)列。

>>> t = Tokenizer(num_words=3)
>>> l = ["Hello, World! This is so&#$ fantastic!", "There is no other world like this one"]
>>> t.fit_on_texts(l)
>>> print(t.word_index)
{'world': 1, 'this': 2, 'is': 3, 'hello': 4, 'so': 5, 'fantastic': 6, 'there': 7, 'no': 8, 'other': 9, 'like': 10, 'one': 11}

>>> t.texts_to_matrix(l, mode='count')
array([[0., 1., 1.],       
       [0., 1., 1.]])