拟合后获取tf.Tokenizer中的词数

Getting the number of words from tf.Tokenizer after fitting

我最初尝试制作一个可以预测莎士比亚文本的循环神经网络,并且我使用字符级编码成功地做到了。但是当我切换到字级编码时,我 运行 遇到了很多问题。具体来说,我很难得到总数 字符数(我被告知它只是 dataset_size = tokenizer.document_count 但这只是 returns 1 ) 这样我就可以在拟合模型时设置 steps_per_epoch = dataset_size // batch_size (现在,字符级和字级编码 return 1).我尝试设置 dataset_size = sum(tokenizer.word_counts.values()) 但是当我拟合模型时,我在第一个纪元结束前得到这个错误:

WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least steps_per_epoch * epochs batches (in this case, 32 batches). You may need to use the repeat() function when building your dataset.

所以我假设我的代码认为我有比实际更多的可用训练集。或者可能是因为我在没有 TF 生产版本的新 M1 芯片上编程?所以真的,我只是不确定如何获得这篇文章中的确切字数。

代码如下:

import tensorflow as tf
from tensorflow import keras
import numpy as np
import re 

shakespeare_url = "https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt"
filepath = keras.utils.get_file("shakespeare.txt", shakespeare_url)

with open(filepath) as f:
    shakespeare_text = f.read()

tokenizer = keras.preprocessing.text.Tokenizer(char_level=False) #Set to word-level encoding
tokenizer.fit_on_texts([shakespeare_text])

max_id = len(tokenizer.word_index) # number of distinct characters
#dataset_size = sum(tokenizer.word_counts.values()) #Returns 204089
dataset_size = tokenizer.document_count # Returns 1

谢谢:)

在输入文本中找到的所有单词的计数存储在 OrderedDict tokenizer.word_counts 中。看起来像

OrderedDict([('first', 362), ('citizen', 100), ('before', 195), ('we', 862), ('proceed', 21), ('any', 189), ('further', 36), ('hear', 230), ...])

因此,要获得字数统计,您需要

sum([x for _,x in tokenizer.word_counts.items()])