zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

nlp,fer2013数据集

2023-03-07 09:47:18 时间

NLP Research 0玩家的学习笔记

目录一、所需环境二、数据集三的理解、数据集三的获取、方法一、直接调用函数获取三、方法二、官网下载获取四、数据集的操作、排序和打乱4.2选择和过滤4.3 切分和分桶的添加、删除和重命名4.5地图功能4.6保存和加载五、总结六、补充说明

前一篇文章链接了: NLP 冻手之路(1)—— 中文/英文词典和分词器。

一、所需环境 python需要3.6pytorch需要1.10

本文使用的库基于拥抱脸transformer官网链接https://huggingface.co/docs/transformers/index【一个非常好的开源网站,为Transformer框架做了很多集成,目前GitHub 72.3k】

要安装抱脸变压器库,只需在终端输入pip install transformers【这是pip安装方式】。如果你用的是康达,进入康达install-c抱脸变压器。

在本文中,除了上述配置之外,还应安装一个名为datasets的数据集处理包。只需在终端中输入pip安装数据集[这是pip安装方法]。如果你使用的是康达,进入康达安装-C拥抱脸-C康达锻造数据集。

二、对数据集的理解这里我用pprint函数打印,比print打印出来的东西要整洁。

import Datasets from pprint import pprintmy _ Datasets _ list Datasets . list _ Datasets()Print(数据集库中的数据集数:len(my _ Datasets _ list))pprint(my _ Datasets _ list[:20],True) #打印数据集列表中的前20个数据集,以查看数据集库中数据集的输出结果数3360 12173[acronym _ identificati on,ade _ corpus _ v2,advanced _ QA,aeslc,afrikaans_ner_corpus,ag ANLI] 从结果中我们可以看到,截止到2022年10月20日,当前数据库中有12172个数据集。

那么我们来看看中文情绪分析的一个数据集,即seamw/ChnSentiCorp。请注意,所有未来的实验都将基于这个数据集。一般这里的数据集都有描述,这个没有。我粗略的说一下,这个数据集就是所有的段落文本,每一段文本都是用户对某件事、某件事等的评价。

My_datasets _ list . index(seawew/chnseticorp)#获取此数据集在my _ datasets(其类型为list)中的位置info datasets . list _ datasets(with _ details true)[index]#通过将with _ details设置为True来获取数据集的详细信息pprint(info)输出数据集信息3360 { id : seawew/chnseticorpsha : 5 fad07523 f 9 C5 fc 76 b 8 babaca 9 ab 6 fdeb 6 af 2 dlastmodified : 2360数据集的获取数据集的获取有两种方式。第一种方式是直接调用load_dataset函数,第二种方式是从官网下载。

第一种方法可能需要在F墙上安装VPN。需要注意的是,这个VPN要开放到“网卡模式”,而不仅仅是“网页模式”。因为“web模式”只能看Youtube等外部网页,而不能让Python编辑器访问外部web。

3.1方法1直接调用函数获取我们将数据集下载到。/my_data,方法是设置cache_dir。

导入数据集my _ dataset _ all datasets . load _ dataset(p

athseamew/ChnSentiCorp, cache_dir./my_data) # 获取整个数据集my_dataset_train my_dataset_all[train]my_dataset_validation my_dataset_all[validation]my_dataset_test my_dataset_all[test]print(my_dataset_all:, my_dataset_all)print(my_dataset_train:, my_dataset_train)print(my_dataset_validation[0]:, my_dataset_validation[0]) # 打印第一个print(my_dataset_test[:3]:, my_dataset_test[:3]) # 打印前三个

● 运行结果如下其中 label 为 1 代表对应的那段评论是 积极 的反之若 label 为 0 则代表对应的那段评论是 消极 的。其中训练集有 9600 个样例验证集和测试集分别有 1200 个样例。

● 如果通过这种方法下载的数据集即可通过 save_to_disk 函数来保存到本地下一次加载数据集时就不需要再重复到网上下载直接加载本地的即可。加载函数详见 “2.2 方法二官网下载获取” 的 load_from_disk。

my_dataset_all.save_to_disk(dataset_dict_path./save_data) 3.2 方法二官网下载获取

● 如果方法一行不通就用这个方法。首先进入该数据集的网页https://huggingface.co/datasets/seamew/ChnSentiCorp。

● 然后依照上图打开对话框接着使用 git clone https://huggingface.co/datasets/seamew/ChnSentiCorp 来将数据集下载到本地如下图所示。

● 我们然后还有做一系列文件夹划分操作以便代码调用1. 首先我们在 ChnSentiCorp 文件夹里新建一个 dataset.json 文件其中写入 { splits: [train, validation, test] } 即可。2. 然后我们需要编辑三个文件夹分别命名为 train、validation、test。然后需要将 dataset_info.json 复制三份分别放到这三个文件夹中同时对应的 *.arrow 数据文件也放入其中。3. 最后在这三个文件夹内新建一个 state.json 文件其内容如下(以 train 为例注意对于不同的文件夹(train、validation和test)其 filename 和 _split 要做相应的改写)

{ _data_files: [ { filename: chn_senti_corp-train.arrow } ], _fingerprint: 24c4fd9824d8b978, _format_columns: null, _format_kwargs: {}, _format_type: null, _indexes: {}, _output_all_columns: false, _split: train}

● 最后ChnSentiCorp 文件夹里面的结构如下

● 我们通过 load_from_disk 函数来将本地保存的数据集加载到内存

my_dataset_all_git datasets.load_from_disk(./git_example/ChnSentiCorp)print(my_dataset_all_git)输出DatasetDict({ train: Dataset({ features: [text, label], num_rows: 9600 }) validation: Dataset({ features: [text, label], num_rows: 1200 }) test: Dataset({ features: [text, label], num_rows: 1200 })})


四、数据集的操作 4.1 排序与打乱

● 在实际训练的时候我们常用到 排序(sort) 与 打乱(shuffle)具体操作如下

my_dataset datasets.load_from_disk(./git_example/ChnSentiCorp)[train] # 获取 train 集print(my_dataset) # 简单打印 train集 的信息pprint(my_dataset[:10]) # 未排序的 label 是乱序的my_dataset_sort my_dataset.sort(label) # 排序之后 label 便有序了print(my_dataset_sort[label][:10]) # 前十个 label 的值print(my_dataset_sort[label][-10:]) # 最后十个 label 的值shuffled_dataset my_dataset.shuffle(seed42) # 打乱顺序 seed 的值可调print(shuffled_dataset[label][:10])

● 运行结果

4.2 选择和过滤

● 再介绍一下常用的选择函数 select 和 过滤函数 filter。

my_dataset datasets.load_from_disk(./git_example/ChnSentiCorp)[train] # 获取 train 集x my_dataset.select([1, 0, 10, 20, 30, 40, 50]) # 选择下标为 1、0、10、...、50 的数据pprint(x)def f(data): return data[text].startswith(很差) # 返回一个 true 或者 false# 这里的 filter 函数需要用一个 lambda 函数start_with_ar my_dataset.filter(f)print(len(start_with_ar), start_with_ar[text]) # 打印以 很差 开头的句子的数量和内容输出Dataset({ features: [label, text], num_rows: 7})2 [很差相当差搞得我们的外国客人都发大火了服务不符合四星级的酒店标准, 很差劲的地方。是人都不要住。设施什么都不好还贵。真是晦气] 4.3 切分和分桶

● 如果我们还想对 train集 进行划分可以用 train_test_split 函数另外还有一个好用的均分函数 shard。

my_dataset datasets.load_from_disk(./git_example/ChnSentiCorp)[train] # 获取 train 集x my_dataset.train_test_split(test_size0.1) # 按照 9:1 的比例对 train集 再划分为新的 train集 和 test集print(原始 train集: , my_dataset)print(切分过后的 train集: , x)t my_dataset.shard(num_shards4, index0) # 把数据均匀分配到 4 个桶中. 然后取下标为 0 的桶里的数据print(均匀(4)分桶过后且取下标为 0 的桶里的数据: , t)

● 运行结果

4.4 列的新增、删除和重命名

● 如果我们想对数据集里面的每一个样例都多加一个标签即列的新增那就要用到 add_column具体方法如下。另外还有常用的列的删除 remove_columns 和列的重命名 rename_column。

my_dataset datasets.load_from_disk(./git_example/ChnSentiCorp)[train] # 获取 train 集new_column [null] * len(my_dataset)my_dataset_add my_dataset.add_column(info, new_column)print(原始 train集: , my_dataset)print(新增了一列的 train集: , my_dataset_add)print(原始 train集 的一个例子: , my_dataset[1])print(新增了一列的 train集 的一个例子: , my_dataset_add[1])my_dataset_newName my_dataset_add.rename_column(info, likes)print(重命名后的 train集: , my_dataset_newName)my_dataset_remove my_dataset_newName.remove_columns([likes])print(删除了一列的 train集: , my_dataset_remove)

● 运行结果

4.5 map 函数

● 这个 map 函数是比较重要的说白了可以用这个函数对数据集里面的内容进行了人为的修改。

my_dataset datasets.load_from_disk(./git_example/ChnSentiCorp)[train] # 获取 train 集def m(data): data[text] My sentence: data[text] return datamy_datatset_map my_dataset.map(m) # 也是通过一个 lambda 函数来处理pprint(my_datatset_map[text][:5], width300) # 打印前五个print(原始 train集: , my_dataset)print(经过 map 后的 train集: , my_datatset_map)

● 运行结果

4.6 保存与加载

● 其实在 “3.1 方法一直接调用函数获取” 中已经讲了一个保存的函数 save_to_disk下面运行结果图中文件夹里的 save_data 即为函数 my_dataset.save_to_disk(dataset_dict_path./save_data) 运行后的结果。另外如果保存为 .csv 或 .json 格式的文件就要用到 to_csv 或 to_json 函数加载的话除了本地加载的 load_from_disk 函数还有一个就是 load_dataset。

my_dataset datasets.load_from_disk(./git_example/ChnSentiCorp)[train] # 获取 train 集print(原始的数据:, my_dataset[1:3], end\n) # 打印 2 个例子看看my_dataset.to_csv(path_or_buf./save_csv_data.csv) # 导出为 csv 格式csv_dataset datasets.load_dataset(pathcsv, data_files./save_csv_data.csv, splittrain) # 加载 csv 格式数据print(csv 格式的数据:, csv_dataset[1:3], end\n) # 打印 2 个例子看看csv_dataset.to_json(path_or_buf./save_json_data.json) # 导出为 json 格式json_dataset datasets.load_dataset(pathjson, data_files./save_json_data.json, splittrain) # 加载 json 格式数据print(json 格式的数据:, json_dataset[1:3], end\n) # 打印 2 个例子看看

● 运行结果


五、小结

● 关于数据集的操作不难但是很重要大致看一遍过一遍即可。


六、补充说明

● 上一篇文章链接: NLP冻手之路(1)——中文/英文字典与分词操作(Tokenizer)

● 若有写得不对的地方或有疑问欢迎评论交流。

● 参考视频HuggingFace简明教程,BERT中文模型实战示例.NLP预训练模型,Transformers类库,datasets类库快速入门.

● 参考资料使用Hugging Face的数据集库