接著前一天的部分繼續說後半部
以上圖出自 Hugging Face 官方
加州大學機器學習儲存庫的藥物審查資料集
。!wget "https://archive.ics.uci.edu/ml/machine-learning-databases/00462/drugsCom_raw.zip"
!unzip drugsCom_raw.zip
from datasets import load_dataset
data_files = {"train": "drugsComTrain_raw.tsv", "test": "drugsComTest_raw.tsv"}
drug_dataset = load_dataset("csv", data_files=data_files, delimiter="\t")
print(drug_dataset)
DatasetDict({
train: Dataset({
features: ['Unnamed: 0', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount'],
num_rows: 161297
})
test: Dataset({
features: ['Unnamed: 0', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount'],
num_rows: 53766
})
})
Unnamed: 0
,它是屬於病人的編號或是ID。drug_dataset = drug_dataset.rename_column(
original_column_name="Unnamed: 0", new_column_name="patient_id"
)
print(drug_dataset)
DatasetDict({
train: Dataset({
features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount'],
num_rows: 161297
})
test: Dataset({
features: ['patient_id', 'drugName', 'condition', 'review', 'rating', 'date', 'usefulCount'],
num_rows: 53766
})
})
pattient_id
drug_dataset = drug_dataset.remove_columns(['rating', 'usefulCount'])
print(drug_dataset)
rating
和usefulCount
刪除DatasetDict({
train: Dataset({
features: ['Unnamed: 0', 'drugName', 'condition', 'review', 'date'],
num_rows: 161297
})
test: Dataset({
features: ['Unnamed: 0', 'drugName', 'condition', 'review', 'date'],
num_rows: 53766
})
})
def lowercase_condition(example):
return {"condition": example["review"].lower()}
drug_dataset.map(lowercase_condition)
map()方法有一個batched參數,如果設定為True , map 函數將會分批執行所需要進行的操作(批次大小是可配置的,但預設為1,000)。例如,先前對 review 進行轉小寫的 map 函數運行需要一些時間(您可以從進度條中讀取所用時間)
。我們可以透過使用列表推導同時處理多個元素來加快速度,作法也很簡單。
new_drug_dataset = drug_dataset.map(
lambda x: {"review": [o.lower() for o in x["review"]]}, batched=True
)
x['review].lower()
,轉成 [o.lower() for o in x["review"]]
,這是因為當我們將 batched 設為 True 時,map 處理的方式就會是批次處理也就是打包成 List,因此我們需要將處理的方式做一個轉換。速度上快很多
%time new_drug_dataset = drug_dataset.map( lambda x: {"review": x["review"]} )
# Wall time: 25.3 s
%time new_drug_dataset = drug_dataset.map( lambda x: {"review": [o.lower() for o in x["review"]]}, batched=True )
# Wall time: 1.61 s
它用於控制在 map 在運行期間同時處理多少個元素。每個進程都可以處理一個元素,因此 num_proc 指定了同時處理多少個元素的並行數,(指定並行處理(parallel processing)的進程數量)
。
%time new_drug_dataset = drug_dataset.map( lambda x: {"review": [o.lower() for o in x["review"]]}, batched=True, num_proc=8)
# Wall time: 3.66 s
%time new_drug_dataset = drug_dataset.map( lambda x: {"review": [o.lower() for o in x["review"]]}, batched=True, num_proc=4)
# Wall time: 3.49 s
%time new_drug_dataset = drug_dataset.map( lambda x: {"review": [o.lower() for o in x["review"]]}, batched=True, num_proc=2)
# Wall time: 2.14 s
使用 num_proc 以加快處理速度通常是一個好主意,只要您使用的函數還沒有自己帶有的進行某種多進程處理的方法,但並非情況都是如此,像上面測試的三組都沒有原本單純加上
batched=True
來的快
(把它放在最後是因為在原本資料集中沒有可以實作 flatten 的地方)
from datasets import load_dataset
squad = load_dataset('squad', split='train')
print(squad)
(斯坦福問答資料集(Stanford Question Answering Dataset))
Dataset({
features: ['id', 'title', 'context', 'question', 'answers'],
num_rows: 87599
})
在上述所有 columns 中的 answers 這個 column 它其實還可以再拆分成 text
和answer_start
squad.flatten()
Dataset({
features: ['id', 'title', 'context', 'question', 'answers.text', 'answers.answer_start'],
num_rows: 87599
})