分詞器文件
從記憶體中訓練
並獲得增強的文件體驗
開始使用
從記憶體中訓練
在快速入門中,我們看到了如何使用文字檔案構建和訓練一個分詞器,但實際上我們可以使用任何 Python 迭代器。在本節中,我們將看到幾種不同的訓練分詞器的方法。
對於下面列出的所有示例,我們將使用相同的 Tokenizer 和 Trainer
,構建方式如下:
from tokenizers import Tokenizer, decoders, models, normalizers, pre_tokenizers, trainers
tokenizer = Tokenizer(models.Unigram())
tokenizer.normalizer = normalizers.NFKC()
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel()
tokenizer.decoder = decoders.ByteLevel()
trainer = trainers.UnigramTrainer(
vocab_size=20000,
initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),
special_tokens=["<PAD>", "<BOS>", "<EOS>"],
)
此分詞器基於 Unigram 模型。它使用 NFKC Unicode 規範化方法對輸入進行規範化處理,並使用 ByteLevel 預分詞器以及相應的解碼器。
有關此處使用的元件的更多資訊,可以檢視這裡。
最基本的方法
你可能已經猜到了,訓練分詞器最簡單的方法是使用 List
{.interpreted-text role=“obj”}:
# First few lines of the "Zen of Python" https://python.club.tw/dev/peps/pep-0020/
data = [
"Beautiful is better than ugly."
"Explicit is better than implicit."
"Simple is better than complex."
"Complex is better than complicated."
"Flat is better than nested."
"Sparse is better than dense."
"Readability counts."
]
tokenizer.train_from_iterator(data, trainer=trainer)
很簡單,對吧?你可以在這裡使用任何可作為迭代器的物件,無論是 List
{.interpreted-text role=“obj”}、Tuple
{.interpreted-text role=“obj”} 還是 np.Array
{.interpreted-text role=“obj”}。只要它能提供字串,任何物件都可以。
使用 🤗 Datasets 庫
使用 🤗 Datasets 庫是訪問眾多可用資料集的絕佳方式。有關更多資訊,請檢視此處的官方文件。
我們先載入資料集:
import datasets
dataset = datasets.load_dataset("wikitext", "wikitext-103-raw-v1", split="train+test+validation")
下一步是為這個資料集構建一個迭代器。最簡單的方法可能是使用生成器:
def batch_iterator(batch_size=1000):
# Only keep the text column to avoid decoding the rest of the columns unnecessarily
tok_dataset = dataset.select_columns("text")
for batch in tok_dataset.iter(batch_size):
yield batch["text"]
正如你在這裡看到的,為了提高效率,我們實際上可以提供一批用於訓練的樣本,而不是逐個迭代。透過這樣做,我們可以期望獲得與直接從檔案訓練時非常相似的效能。
迭代器準備好後,我們只需啟動訓練。為了讓進度條更好看,我們可以指定資料集的總長度:
tokenizer.train_from_iterator(batch_iterator(), trainer=trainer, length=len(dataset))
就這樣!
使用 gzip 檔案
由於 Python 中的 gzip 檔案可以用作迭代器,因此在這類檔案上進行訓練非常簡單:
import gzip
with gzip.open("data/my-file.0.gz", "rt") as f:
tokenizer.train_from_iterator(f, trainer=trainer)
現在,如果我們想從多個 gzip 檔案進行訓練,也不會難多少:
files = ["data/my-file.0.gz", "data/my-file.1.gz", "data/my-file.2.gz"]
def gzip_iterator():
for path in files:
with gzip.open(path, "rt") as f:
for line in f:
yield line
tokenizer.train_from_iterator(gzip_iterator(), trainer=trainer)
大功告成!
< > 在 GitHub 上更新