# 深度学习笔记(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 AutoTokenizer

tokenizer = 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 Dataset

freq_dataset = Dataset.from_pandas(frequencies)
freq_dataset

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值