tensorflow - 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 字?
解决方案
因为字典总是被保存的。当您查看源代码时,您会看到函数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 个值。
推荐阅读
- 3d - 使用 Python 创建 3D EEG 地形图
- python - 一定半径内分组 GPS 数据的平均值
- powerbi - Expression.Error:无法识别名称“DIVIDE”。确保拼写正确
- google-analytics - GA4 等效获取 > 广告系列 > 自然关键字 > 着陆页
- javascript - Frontity 错误中的矿物 UI 情感
- cocoapods - 我自己的 pod 库没有在项目中导入
- python - 来自关系模型的 Django 复杂查询
- git - 从 branch1 开始 branch2 与从 master 开始 branch2 并在 branch1 中合并
- android - Firebase(不能将 .addValueEventListener 与 DatabaseReference 一起使用)
- visual-studio - 在 Visual Studio 项模板中修改项目中的文件