# 深度学习笔记(9)huggingface 构建数据集
# 深度学习笔记(9)huggingface 构建数据集
一、怎么处理数据
药品评价数据集:https://archive.ics.uci.edu/dataset/462/drug+review+dataset+drugs+com
# 定义数据文件的路径,分别指定训练集和测试集的文件名
data_files = {"train": "drugsComTrain_raw.tsv", # 训练集文件路径"test": "drugsComTest_raw.tsv" # 测试集文件路径
}# 使用load_dataset函数加载数据集,指定数据格式为csv
# data_files参数指定了训练集和测试集的文件路径
# delimiter参数指定了文件中的分隔符为制表符("\t")
drug_dataset = load_dataset("csv", data_files=data_files, delimiter="\t"
)
测试的时候为了训练速度,做一个采样,真实环境是不采样的
#选择一小部分数据集:drug_sample = drug_dataset["train"].shuffle(seed=42).select(range(1000))#采样
# Peek at the first few examples
drug_sample[:5]
#病人ID,症状...评分,评论
'Unnamed: 0': [87571, 178045, 80482, 159268, 205477], #病人id'condition': ['Gout, Acute', #症状'ibromyalgia','Inflammatory Conditions','Birth Control','Depression'],'date': ['September 2, 2015', #日期'November 7, 2011','June 5, 2013','October 21, 2010','July 13, 2013'],'drugName': ['Naproxen', 'Duloxetine', 'Mobic', 'TriNessa', 'Pristiq'], #药名'rating': [9.0, 3.0, 10.0, 10.0, 10.0], #评分'review': ['"like the previous person mention, I'm a #评论
二、基本操作
数据集的基本处理操作
1.更换列名,把名字都写的好听好认识
2.将所有大写的都转换成小写
3.转换之前要注意先把所有的空值剔除掉
4.要计算每一个样本中评论的长度
5.对长度小于30的文本数据进行剔除
6.文本清洗去掉一些爬虫留下的痕迹
7.删除一些无用的列名,一般保存ID和标签之类的即可
1.更改列名
# 遍历数据集的不同部分(通常是训练集和测试集)
for split in drug_dataset.keys():# 断言每个部分中的数据行数与"Unnamed: 0"列的唯一值数量相等# 这意味着"Unnamed: 0"列中的每个值都是唯一的,没有重复assert len(drug_dataset[split]) == len(drug_dataset[split].unique("Unnamed: 0"))
更改id
# 重命名数据集中的列,将"Unnamed: 0"列名改为"patient_id"
drug_dataset = drug_dataset.rename_column(original_column_name="Unnamed: 0", new_column_name="patient_id"
)# 打印数据集的列名以确认更改
print(drug_dataset["train"].column_names)# 如果需要查看数据集的具体内容,可以打印前几行
# 例如,查看训练集的前5条记录
print(drug_dataset["train"].head())
2.去掉空值
from datasets import load_dataset# 假设数据集已经被加载到 drug_dataset 中
# drug_dataset = load_dataset(...)# 使用 filter 方法来剔除 "condition" 字段为 None 的样本
drug_dataset = drug_dataset.filter(lambda x: x["condition"] is not None)# 现在,drug_dataset 应该只包含 "condition" 字段非空的样本
# 打印数据集的一些信息来验证这一点
print(drug_dataset)
3.把condition字段转成小写
from datasets import load_dataset
2
# 定义一个函数,将"condition"字段的值转换为小写
def lowercase_condition(example):return {"condition": example["condition"].lower()}# 假设数据集已经被加载到 drug_dataset 中
# drug_dataset = load_dataset(...)# 使用 map 方法将 lowercase_condition 函数应用到数据集的每个样本上
drug_dataset = drug_dataset.map(lowercase_condition)# 现在,drug_dataset 中的 "condition" 字段值应该都是小写的
# 你可以通过打印数据集的前几行来验证这一点
print(drug_dataset["train"].head())
4.统计下评论的长度
from datasets import load_dataset
# 假设数据集已经被加载到 drug_dataset 中
# drug_dataset = load_dataset(...)# 定义一个函数,计算评论中的单词数量
def compute_review_length(example):return {"review_length": len(example["review"].split())}# 使用 map 方法将 compute_review_length 函数应用到数据集的每个样本上
drug_dataset = drug_dataset.map(compute_review_length)# 现在,每个样本都应该有一个 "review_length" 字段
# 打印数据集的前几行来验证这一点
print(drug_dataset["train"].head())
{'condition': 'left ventricular dysfunction','date': 'May 20, 2012','drugName': 'Valsartan','patient_id': 206461,'rating': 9.0,'review': '"It has no side effect, I take it in combination of Bystolic 5 Mg and Fish Oil"','review_length': 17,'usefulCount': 27}
可以看到 ,多出来’review_length这一列
drug_dataset["train"].sort("review_length")[:3]#按长度排序
5.去掉过短的
过短的评论对建模帮助不大
drug_dataset = drug_dataset.filter(lambda x: x["review_length"] > 30)
print(drug_dataset.num_rows)
6.处理一些爬虫留下的问题
直接调用包就行,包如下
import html #直接调包就行text = "I'm a transformer called BERT"
html.unescape(text)
应用到我这个项目代码如下
new_drug_dataset = drug_dataset.map(lambda x: {"review": [html.unescape(o) for o in x["review"]]}, batched=True
)
你正在使用 map 方法结合一个 lambda 函数来遍历 drug_dataset 数据集中的每个样本,并对 “review” 字段中的每个元素应用 - html.unescape() 函数。这样做是为了将 “review” 字段中的任何 HTML 实体字符转换回普通字符。
map 方法:这是 Hugging Face datasets 库中的方法,用于对数据集中的每个样本应用一个函数。
lambda x: …:这是一个匿名函数,用于定义对每个样本的操作。
html.unescape():这是 html 模块中的一个函数,用于将 HTML 实体字符转换回普通字符。
batched=True:这个参数告诉 map 方法在处理数据时使用批处理,这通常可以提高处理效率。
7.删除无用id等
from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
def tokenize_and_split(examples):return tokenizer(examples["review"],truncation=True,max_length=128,return_overflowing_tokens=True,#如果一句话超过了长度,会展开成多句话)
转换成pandas
train_df = drug_dataset["train"][:]
frequencies = (train_df["condition"].value_counts().to_frame().reset_index().rename(columns={"index": "condition", "condition": "frequency"})
)
frequencies.head()
转完了记得转回去
from datasets import Datasetfreq_dataset = Dataset.from_pandas(frequencies)
freq_dataset
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。