源码
def tokenize():
eot = enc._special_tokens['<|endoftext|>'] # end of text token
data_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare.txt")
text = open(data_filename, 'r').read()
# let's treat every person's statement in the dialog as a separate document
text = "<|endoftext|>" + text
text = text.replace('\n\n', '\n\n<|endoftext|>')
# encode the text
tokens = encode(text)
tokens_np = np.array(tokens, dtype=np.int32)
# let's take the first 32,768 tokens as the validation split (~10%)
val_tokens_np = tokens_np[:32768]
train_tokens_np = tokens_np[32768:]
# save to file
val_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_val.bin")
train_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_train.bin")
with open(val_filename, "wb") as f:
f.write(val_tokens_np.tobytes())
with open(train_filename, "wb") as f:
f.write(train_tokens_np.tobytes())
# prints
print(f"Saved {len(val_tokens_np)} tokens to {val_filename}")
print(f"Saved {len(train_tokens_np)} tokens to {train_filename}")
注释
"""
将Tiny Shakespeare数据集进行分词处理,并将分词结果保存为二进制文件。
Args:
无参数。
Returns:
无返回值。
"""
def tokenize():
# 结束文本标记
eot = enc._special_tokens['<|endoftext|>'] # end of text token
# 数据文件路径
data_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare.txt")
# 读取文件内容
text = open(data_filename, 'r').read()
# 将每个人的对话视为单独的文档
# let's treat every person's statement in the dialog as a separate document
text = "<|endoftext|>" + text
# 在每个对话之间添加结束文本标记
text = text.replace('\n\n', '\n\n<|endoftext|>')
# 编码文本
# encode the text
tokens = encode(text)
# 将 tokens 转换为 numpy 数组
tokens_np = np.array(tokens, dtype=np.int32)
# 取前 32,768 个 tokens 作为验证集(约占总量的 10%)
# let's take the first 32,768 tokens as the validation split (~10%)
val_tokens_np = tokens_np[:32768]
# 剩余 tokens 作为训练集
train_tokens_np = tokens_np[32768:]
# 保存验证集到文件
val_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_val.bin")
with open(val_filename, "wb") as f:
f.write(val_tokens_np.tobytes())
# 保存训练集到文件
train_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_train.bin")
with open(train_filename, "wb") as f:
f.write(train_tokens_np.tobytes())
# 打印保存结果
# prints
print(f"Saved {len(val_tokens_np)} tokens to {val_filename}")
print(f"Saved {len(train_tokens_np)} tokens to {train_filename}")
def tokenize():
"""
对Tiny Shakespeare数据集进行分词和切分,以创建训练和验证数据集。
该函数首先读取Tiny Shakespeare文本数据,然后对其进行处理,使得每个对话段落被视作独立的文档。
接着,对处理后的文本进行编码,并将数据集划分为训练集和验证集。最后,将这些分好类的令牌保存到二进制文件中。
参数:
无
返回值:
无
"""
# 获取结束文本标记的索引
eot = enc._special_tokens['']
# 指定数据文件的路径
data_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare.txt")
# 读取文本数据
text = open(data_filename, 'r').read()
# 将每个段落的结尾添加为结束文本标记,以便将每个段落作为单独的文档处理
text = "" + text
text = text.replace('\n\n', '\n\n')
# 对处理后的文本进行编码
tokens = encode(text)
tokens_np = np.array(tokens, dtype=np.int32)
# 将前32,768个令牌划分为验证集(约总数据集的10%)
val_tokens_np = tokens_np[:32768]
train_tokens_np = tokens_np[32768:]
# 将训练集和验证集令牌保存到二进制文件
val_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_val.bin")
train_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_train.bin")
with open(val_filename, "wb") as f:
f.write(val_tokens_np.tobytes())
with open(train_filename, "wb") as f:
f.write(train_tokens_np.tobytes())
# 打印保存的令牌数量和文件路径
print(f"Saved {len(val_tokens_np)} tokens to {val_filename}")
print(f"Saved {len(train_tokens_np)} tokens to {train_filename}")
解释
这段代码是一个用于将文本数据分为训练集和验证集的Python函数。以下是对该代码的逐行解释:
-
def tokenize():
- 定义一个名为tokenize
的函数。 -
eot = enc._special_tokens['<|endoftext|>']
- 从enc
对象(该对象在此代码段中未定义,可能是外部的全局变量或已导入的对象)的特殊标记中获取"end of text"的标记,并将其赋值给eot
变量。 -
data_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare.txt")
- 使用os.path.join
函数将DATA_CACHE_DIR
(另一个未在此代码段中定义的变量,可能是一个路径字符串)和文件名"tiny_shakespeare.txt"
组合成一个完整的文件路径,并将其赋值给data_filename
变量。 -
text = open(data_filename, 'r').read()
- 打开data_filename
指定的文件,并读取其内容,然后将其赋值给text
变量。 -
text = "<|endoftext|>" + text
- 在text
的开头添加"end of text"标记。 -
text = text.replace('\n\n', '\n\n<|endoftext|>')
- 将text
中的所有连续两个换行符替换为连续两个换行符后跟一个"end of text"标记。 -
tokens = encode(text)
- 调用encode
函数(该函数在此代码段中未定义)对text
进行编码,并将结果赋值给tokens
变量。 -
tokens_np = np.array(tokens, dtype=np.int32)
- 使用NumPy库将tokens
转换为一个32位整数的NumPy数组,并将其赋值给tokens_np
变量。 -
val_tokens_np = tokens_np[:32768]
- 从tokens_np
数组中获取前32,768个元素作为验证集,并将其赋值给val_tokens_np
变量。 -
train_tokens_np = tokens_np[32768:]
- 从tokens_np
数组中获取从第32,769个元素开始的所有元素作为训练集,并将其赋值给train_tokens_np
变量。 -
val_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_val.bin")
- 为验证集创建一个文件名,由DATA_CACHE_DIR
和"tiny_shakespeare_val.bin"
组合而成,并将其赋值给val_filename
变量。 -
train_filename = os.path.join(DATA_CACHE_DIR, "tiny_shakespeare_train.bin")
- 为训练集创建一个文件名,由DATA_CACHE_DIR
和"tiny_shakespeare_train.bin"
组合而成,并将其赋值给train_filename
变量。 -
使用
with open(val_filename, "wb") as f:
和with open(train_filename, "wb") as f:
语句块分别打开验证集和训练集的文件,并将它们的内容以二进制形式写入文件。 -
最后两行是打印语句,分别显示验证集和训练集中保存的令牌数量以及对应的文件路径。
简而言之,这个函数读取一个文本文件,使用特殊的"end of text"标记将对话中的每个人的陈述分隔开,然后对该文本进行编码,并将编码后的令牌分为验证集和训练集,最后将这两个集合分别保存到二进制文件中。
该函数用于对Tiny Shakespeare数据集进行预处理和划分,将数据集中的文本进行编码,并将其划分为训练集和验证集。具体步骤包括:读取Tiny Shakespeare数据集文本,将每個人的陈述作为单独的文档处理,对文本进行编码,将编码后的文本划分为训练集和验证集,并将划分后的数据集保存为二进制文件。最后,打印保存的训练集和验证集的令牌数量和文件路径。