首页 > 解决方案 > Tensorflow 分词器:要保留的最大单词数

问题描述

尝试通过应用 Tensorflow 标记器来标记 IMDB 电影评论。我希望拥有最多 10000 个单词的词汇。对于看不见的单词,我使用默认标记。

type(X), X.shape, X[:3]

(pandas.core.series.Series,(25000,),
 0    first think another disney movie might good it...
 1    put aside dr house repeat missed desperate hou...
 2    big fan stephen king s work film made even gre...
 Name: SentimentText, dtype: object)

from tensorflow.keras.preprocessing.text import Tokenizer

tokenizer=Tokenizer(num_words=10000,oov_token='xxxxxxx')
# fit on the input data 
tokenizer.fit_on_texts(X)

当我检查标记器字典中的单词数时,我得到:

X_dict=tokenizer.word_index

list(enumerate(X_dict.items()))[:10]
[(0, ('xxxxxxx', 1)),
 (1, ('s', 2)),
 (2, ('movie', 3)),
 (3, ('film', 4)),
 (4, ('not', 5)),
 (5, ('it', 6)),
 (6, ('one', 7)),
 (7, ('like', 8)),
 (8, ('i', 9)),
 (9, ('good', 10))]

print(len(X_dict))

Out: 74120

为什么我得到 74120 字而不是 10000 字?

标签: tensorflowtensorflow2.0tokenize

解决方案


因为字典总是被保存的。当您查看源代码时,您会看到函数fit_on_texts()中的参数num_words被忽略了。但是,当您将文本转换为序列时,texts_to_sequences()您可以看到对texts_to_sequences_generator()which 的调用具有以下代码:

for w in seq:
    i = self.word_index.get(w)
    if i is not None:
         if num_words and i >= num_words:
              if oov_token_index is not None:
                  vect.append(oov_token_index)
              else:
                  vect.append(i)
         elif self.oov_token is not None:
            vect.append(oov_token_index)
    yield vect

在那里你可以看到,num_words 被注意到并用于进一步生成序列。这很有用,因为您可以轻松更改单词的数量而无需再次拟合整个文本,因此请尝试它是否适合您的需求,或者您需要更多的单词才能成功完成您的任务,正如 nicolewhite 在她的 github回答中所说的那样。

所以基本上,你观察到的结果和预期的一样,当你np.unique()在所有序列上运行时,你不会有超过 10000 个值。


推荐阅读