如何在大数据集上训练分词器?

Posted

技术标签:

【中文标题】如何在大数据集上训练分词器?【英文标题】:How to train a tokenizer on a big dataset? 【发布时间】:2021-11-23 18:24:23 【问题描述】:

基于examples,我正在尝试为波斯语的 T5 训练一个标记器和一个模型。 我使用 Google Colab 专业版, 当我尝试运行以下代码时:

import datasets

from t5_tokenizer_model import SentencePieceUnigramTokenizer


vocab_size = 32_000
input_sentence_size = None # change to 100_000 works

# Initialize a dataset
dataset = datasets.load_dataset("oscar", name="unshuffled_deduplicated_fa", split="train")

tokenizer = SentencePieceUnigramTokenizer(unk_token="<unk>", eos_token="</s>", pad_token="<pad>")

print("len dataset:", len(dataset))

# Build an iterator over this dataset
def batch_iterator(input_sentence_size=None):
    if input_sentence_size is None:
        input_sentence_size = len(dataset)
    batch_length = 100
    for i in range(0, input_sentence_size, batch_length):
        yield dataset[i: i + batch_length]["text"]


# Train tokenizer
tokenizer.train_from_iterator(
    iterator=batch_iterator(input_sentence_size=input_sentence_size),
    vocab_size=vocab_size,
    show_progress=True,
)

# Save files to disk
tokenizer.save("/content/drive/MyDrive/Pouramini/tokenizer.json")

它卡在train_from_iterator,因为数据集的大小很大(input_sentence_size 大约是 8M 句子) 如何划分数据集并在每个块上运行代码,然后将它们合并到分词器输出?

【问题讨论】:

分区可能适用。 【参考方案1】:

您是否尝试过使用可迭代数据集?

dataset = datasets.load_dataset("oscar", name="unshuffled_deduplicated_fa", split="train", streaming=True)

tokenizer = SentencePieceUnigramTokenizer(unk_token="<unk>", eos_token="</s>", pad_token="<pad>")

def batch_iterator(dataset):
    for i in dataset:
        yield i["text"]

【讨论】:

以上是关于如何在大数据集上训练分词器?的主要内容,如果未能解决你的问题,请参考以下文章

对不在训练集中的新词使用 keras 分词器

ElastiSearch默认分词器

pkuseg:领域细分的中文分词工具

文本分类(机器学习方法)

文本分类(机器学习方法)

五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg, THULAC, HanLP