Datasets documentation
Toplu eşleme
Toplu eşleme
Dataset.map() işlevselliğini toplu (batch) modla birleştirmek son derece güçlüdür. Bu sayede işleme hızını artırabilir ve oluşturulan veri setinin boyutunu serbestçe kontrol edebilirsiniz.
Hız ihtiyacı
Batch mapping'in birincil amacı işleme hızını artırmaktır. Çoğu zaman, tekil örneklerle çalışmak yerine veri topluluklarıyla (batch) çalışmak daha hızlıdır. Doğal olarak, batch mapping tokenizasyon için uygundur. Örneğin, 🤗 Tokenizers kütüphanesi, bir batch içindeki tüm örneklerin tokenizasyonunu paralelleştirdiği için topluluklarla çalışırken daha hızlıdır.
Girdi boyutu != çıktı boyutu
Üretilen veri setinin boyutunu kontrol etme yeteneği, birçok ilginç kullanım senaryosunda değerlendirilebilir. map nasıl yapılır bölümünde, toplu haritalamanın şu amaçlarla kullanımına dair örnekler bulunmaktadır:
- Uzun cümleleri daha kısa parçalara bölün.
- Bir veri setini ek jetonlarla artırın.
Bu mekanizmanın nasıl çalıştığını anlamak, toplu eşleme (batch mapping) için kendi kullanım yollarınızı geliştirmenize yardımcı olur. Bu noktada, oluşturulan veri setinin boyutunu nasıl kontrol edebileceğinizi merak ediyor olabilirsiniz. Cevap şudur: eşlenen fonksiyon, aynı boyutta bir çıktı partisi döndürmek zorunda değildir.
Başka bir deyişle, eşlenmiş işlev girdiniz N boyutunda bir parti olabilir ve M boyutunda bir parti döndürebilir. Çıktı M, N'den büyük veya küçük olabilir. Bu, örneklerinizi birleştirebileceğinizi, bölümlere ayırabileceğinizi ve hatta daha fazla örnek ekleyebileceğiniz anlamına gelir!
Ancak, çıktı sözlüğündeki tüm değerlerin, çıktı sözlüğündeki diğer alanlarla aynı sayıda öğe içermesi gerektiğini unutmayın. Aksi takdirde, eşlenmiş işlevin döndürdüğü çıktıdaki örnek sayısını tanımlamak mümkün olmaz. Bu sayı, eşlenmiş işlev tarafından işlenen ardışık toplular arasında değişebilir. Ancak tek bir top için, çıktı sözlüğündeki tüm değerlerin aynı uzunlukta (yani aynı öğe sayısına sahip) olması gerekir.
Örneğin, 1 sütun ve 3 satırdan oluşan bir veri setinde, map kullanarak satır sayısının iki katı olan yeni bir sütun döndürürseniz bir hata alırsınız.
Bu durumda, 3 satırlı bir sütun ve 6 satırlı bir sütun elde edersiniz. Görüldüğü gibi tablo geçerli olmayacaktır:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset.map(lambda batch: {"b": batch["a"] * 2}, batched=True) # new column with 6 elements: [0, 1, 2, 0, 1, 2]
'ArrowInvalid: Column 1 named b expected length 3 but got length 6'Geçerli hale getirmek için sütunlardan birini kaldırmalısınız:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset_with_duplicates = dataset.map(lambda batch: {"b": batch["a"] * 2}, remove_columns=["a"], batched=True)
>>> len(dataset_with_duplicates)
6Alternatif olarak, aynı sonucu elde etmek için mevcut sütunu üzerine yazabilirsiniz.
Örneğin, "a" sütununu üzerine yazarak veri setindeki her satırı nasıl kopyalayacağınız aşağıda gösterilmektedir:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
# overwrites the existing "a" column with duplicated values
>>> duplicated_dataset = dataset.map(
... lambda batch: {"a": [x for x in batch["a"] for _ in range(2)]},
... batched=True
... )
>>> duplicated_dataset
Dataset({
features: ['a'],
num_rows: 6
})
>>> duplicated_dataset["a"]
[0, 0, 1, 1, 2, 2]