首页 > 其他分享 >transformers入门使用

transformers入门使用

时间:2023-06-02 15:22:39浏览次数:44  
标签:BERT transformers 入门 text 模型 dataset train 使用 True

transformers入门使用

HuggingFace是一个开源社区,它提供了先进的NLP模型,数据集,以及其他工具。

模型:https://huggingface.co/models

数据集:https://huggingface.co/datasets

主要的模型

  • 自然回归: GPT2, Trasnformer-XL, XLNet
  • 自编码: BERT , ALBERT, ROBERTa, ELECTRA
  • StoS: BART, Pegasus, T5

1 简介

transformers库是一个用于自然语言处理(NLP)的机器学习库,提供了近几年在NLP领域取得巨大成功的预训练模型,例如BERTGPTRoBERTaT5等。

该库由Hugging Face公司开发,是目前最流行的NLP预训练模型库之一。在实际应用中,使用已经训练好的模型可以显著提高模型的效果和速度。

同时,该库还提供了丰富的工具和API,可以帮助用户更方便地使用这些预训练模型,包括文本分类、实体识别、摘要生成、文本翻译等各种NLP任务。

transformers库支持多种主流深度学习框架,例如PyTorchTensorflow等,用户可以根据自己的喜好选择相应的框架进行使用。

BERT(Bidirectional Encoder Representations from Transformers)是一种用于自然语言处理(NLP)的预训练模型。它是在2018年由Google发布的,并被认为是最具革命性的NLP模型之一。BERT模型是基于Transformer网络结构的,并使用了一种预训练的方法来学习上下文相关的词向量表示。

BERT模型的目标是让一个模型具有理解自然语言的能力,而不是人为地将所有知识和规则硬编码到算法中。这种目标是通过对巨型文本数据集进行预训练来实现的。BERT可以学习从一个句子到另一个句子的上下文语境,因此可以更好地处理自然语言。

BERT模型的架构涵盖了两个阶段:预训练和微调。

  • 预训练:在预训练阶段中,BERT模型利用无监督的方式从海量的文本数据中学习常识。在这个过程中,模型先使用“掩码语言模型”(Masked Language Model,MLM)来训练模型,然后再使用“下一句预测模型”(Next Sentence Prediction,NSP)来进一步提高模型的性能。MLM使BERT模型学会推断词语中被遮盖的部分,而NSP是让BERT模型对文本对的关系进行预测,是一个判断文本连贯性的过程。预训练过程中,BERT模型可处理各种类型的文本数据,包括电子邮件、网页、微博、评论等等。

  • 微调:微调阶段是指将预训练的模型用于实际任务,并根据实际任务的目标对模型进行微调。BERT模型的微调可以应用于多种自然语言处理任务,包括情感分析、自动问答、文本分类等等。

BERT模型的优点是它可以处理各种不规则文本数据,并提供比以前的NLP模型更加准确和有用的结果,因为BERT能够建立更好的理解自然语言的语境。此外,BERT还有一个优点是它开放源代码,可以自由使用和修改,方便大家进行相关研究和开发。

2 分词器 transformers.BertTokenizer

BERT 分词器是一种自然语言处理工具,主要用于将文本数据进行分词、词性标注、实体识别、句子划分等预处理操作。

具体来说,BERT 分词器的作用包括以下几个方面:

  1. 分词:将文本中的连续字符串按照一定规则划分成单个的词语,常用的算法有最大匹配、最小匹配、双向匹配等。

  2. 词性标注:对每个词语进行词性标注,例如名词、动词、形容词等,有助于后续的语义分析。

  3. 实体识别:识别文本中的人名、地名、组织机构名等实体,为知识图谱构建和命名实体识别等任务提供数据基础。

  4. 句子划分:将整篇文本按照句子结构进行划分,为文本分类、情感分析等任务提供语义单元划分的基础。

BERT 分词器编码句子的作用:

  1. BERT 分词器在进行分词时,不仅仅是将每个单词转化为固定的编号,而是将整个句子编码为一个向量。这是因为句子的语义信息往往不仅仅取决于每个单词的意义,还和上下文有关。编码句子可以使得句子的语义信息包含在向量中,有助于后续的自然语言处理任务。

  2. 具体来说,BERT 分词器采用的是 Transformer 模型,这种模型可以将句子作为输入,经过多层自注意力(self-attention)机制的加工,得到一个表示整个句子的向量,称为句子嵌入(sentence embedding)向量。这种方法可以同时考虑每个单词的上下文信息,而且还可以避免传统的词向量模型中单词之间的相关性计算问题。

  3. 通过编码句子,BERT 分词器为后续的自然语言处理任务提供了更丰富的语义信息。而且由于 BERT 分词器是基于预训练的方式进行编码句子,其能力可以应用到多个自然语言处理任务中,从而实现了更广泛的语义理解和处理。

总的来说,BERT 分词器的主要作用是将自然语言文本进行可处理的单元划分,为后续的BERT 模型自然语言处理任务提供数据基础。

下面是分词器的代码演示:

from transformers import BertTokenizer

# 加载分词器
tokenizer = BertTokenizer.from_pretrained(
    pretrained_model_name_or_path='bert-base-chinese',
    cache_dir=None,
    force_download=False,
)

# 待编码的句子
sents = [
    '选择珠江花园的原因就是方便。',
    '笔记本的键盘确实爽。',
    '房间太小。其他的都一般。',
    '今天才知道这书还有第6卷,真有点郁闷.',
    '机器背面似乎被撕了张什么标签,残胶还在。',
]

tokenizer, sents

2.1 简单编码

简单编码,一次可以编码一个句子或者两个句子。

分词器的encode方法可以将tokens编码成ids.

# 编码两个句子
input_ids = tokenizer.encode(
    text=sents[0],  # 句子1
    text_pair=sents[1],  # 句子2
    truncation=True,  # 当句子长度大于max_length时,截断
    padding='max_length',  # 一律补pad到max_length长度
    add_special_tokens=True,
    max_length=30,  # 最大长度
    return_tensors=None,   # 返回list
)

print(input_ids)

tokenizer.decode(input_ids)

"""
句子编码后的结果:
[101, 6848, 2885, 4403, 3736, 5709, 1736, 4638, 1333, 1728, 2218, 3221, 3175, 912, 511, 102, 5011, 6381, 3315, 4638, 7241, 4669, 4802, 2141, 4272, 511, 102, 0, 0, 0]

解码:
'[CLS] 选 择 珠 江 花 园 的 原 因 就 是 方 便 。 [SEP] 笔 记 本 的 键 盘 确 实 爽 。 [SEP] [PAD] [PAD] [PAD]'
"""

2.2 增强编码

# 增强的编码
out = tokenizer.encode_plus(
    text=sents[0],  # 句子1
    text_pair=sents[1],  # 句子2
    truncation=True,  # 当句子长度大于max_length时,截断
    padding='max_length',  # 一律补零到max_length长度
    max_length=30,  # 最大长度
    add_special_tokens=True,
    return_tensors=None,  # 可取值tf,pt,np,默认为返回list
    return_token_type_ids=True,  # 返回token_type_ids
    return_attention_mask=True,  # 返回attention_mask
    return_special_tokens_mask=True,  # 返回special_tokens_mask 特殊符号标识
    #返回offset_mapping 标识每个词的起止位置,这个参数只能BertTokenizerFast使用
    #return_offsets_mapping=True,
    #返回length 标识长度
    return_length=True,
)

# input_ids           就是编码后的词
# token_type_ids      第一个句子和特殊符号的位置是0,第二个句子的位置是1
# special_tokens_mask 特殊符号的位置是1,其他位置是0
# attention_mask      pad的位置是0,其他位置是1
# length             返回句子长度
for k, v in out.items():
    print(k, ':', v)
    
"""
input_ids : [101, 6848, 2885, 4403, 3736, 5709, 1736, 4638, 1333, 1728, 2218, 3221, 3175, 912, 511, 102, 5011, 6381, 3315, 4638, 7241, 4669, 4802, 2141, 4272, 511, 102, 0, 0, 0]
token_type_ids : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
special_tokens_mask : [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
attention_mask : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
length : 30
"""

# 解码
tokenizer.decode(out['input_ids'])
"""
'[CLS] 选 择 珠 江 花 园 的 原 因 就 是 方 便 。 [SEP] 笔 记 本 的 键 盘 确 实 爽 。 [SEP] [PAD] [PAD] [PAD]'
"""

2.3 批量增强编码

第一种:

# 批量编码句子
out = tokenizer.batch_encode_plus(
    batch_text_or_text_pairs=[sents[0], sents[1]],  # 编码两个句子
    add_special_tokens=True,  # 特殊符号的位置是1,其他位置是0
    truncation=True,  # 当句子长度大于max_length时,截断
    padding='max_length',  # 不足最大长度时, 一律补零到max_length长度
    max_length=15,  # 最大长度
    return_tensors=None,  # 可取值tf,pt,np,默认为返回list
    return_token_type_ids=True,  # 返回token_type_ids 第一个句子和特殊符号的位置是0,第二个句子的位置是1
    return_attention_mask=True,  # 返回attention_mask pad(不足最大长度补0)的位置是0,其他位置是1
    return_special_tokens_mask=True,  # 返回special_tokens_mask 特殊符号标识
    # 返回offset_mapping 标识每个词的起止位置,这个参数只能BertTokenizerFast使用
    # return_offsets_mapping=True,
    # 返回length 标识长度
    return_length=True,
)

# input_ids           就是编码后的词
# token_type_ids      第一个句子和特殊符号的位置是0,第二个句子的位置是1
# special_tokens_mask 特殊符号的位置是1,其他位置是0
# attention_mask      pad的位置是0,其他位置是1
# length             返回句子长度
for k, v in out.items():
    print(k, ':', v)
    
"""
input_ids : [[101, 6848, 2885, 4403, 3736, 5709, 1736, 4638, 1333, 1728, 2218, 3221, 3175, 912, 102], [101, 5011, 6381, 3315, 4638, 7241, 4669, 4802, 2141, 4272, 511, 102, 0, 0, 0]]
token_type_ids : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
special_tokens_mask : [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]]
length : [15, 12]
attention_mask : [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]]
"""

# 解码两个句子
tokenizer.decode(out['input_ids'][0]), 
"""
'[CLS] 选 择 珠 江 花 园 的 原 因 就 是 方 便 [SEP]'
"""

tokenizer.decode(out['input_ids'][1])
"""
'[CLS] 笔 记 本 的 键 盘 确 实 爽 。 [SEP] [PAD] [PAD] [PAD]'
"""

第二种:

# 批量编码成对的句子
out = tokenizer.batch_encode_plus(
    batch_text_or_text_pairs=[(sents[0], sents[1]), (sents[2], sents[3])],  # 可以编码成对的多种组合 
    add_special_tokens=True,
    truncation=True,  # 当句子长度大于max_length时,截断
    padding='max_length',  # 不足最大长度的位置,补到最大长度
    max_length=30,  # 最大长度
    return_tensors=None,  # 可取值tf,pt,np,默认为返回list
    return_token_type_ids=True,  # 返回token_type_ids
    return_attention_mask=True,  # 返回attention_mask
    #返回special_tokens_mask 特殊符号标识
    return_special_tokens_mask=True,
    # 返回offset_mapping 标识每个词的起止位置,这个参数只能BertTokenizerFast使用
    # return_offsets_mapping=True,
    # 返回length 标识长度
    return_length=True,
)

# input_ids           就是编码后的词
# token_type_ids      第一个句子和特殊符号的位置是0,第二个句子的位置是1
# special_tokens_mask 特殊符号的位置是1,其他位置是0
# attention_mask      pad的位置是0,其他位置是1
# length             返回句子长度
for k, v in out.items():
    print(k, ':', v)

"""
input_ids : [[101, 6848, 2885, 4403, 3736, 5709, 1736, 4638, 1333, 1728, 2218, 3221, 3175, 912, 511, 102, 5011, 6381, 3315, 4638, 7241, 4669, 4802, 2141, 4272, 511, 102, 0, 0, 0], [101, 2791, 7313, 1922, 2207, 511, 1071, 800, 4638, 6963, 671, 5663, 511, 102, 791, 1921, 2798, 4761, 6887, 6821, 741, 6820, 3300, 5018, 127, 1318, 117, 4696, 3300, 102]]
token_type_ids : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
special_tokens_mask : [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]
length : [27, 30]
attention_mask : [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
"""

# 解码
tokenizer.decode(out['input_ids'][0])
"""
'[CLS] 选 择 珠 江 花 园 的 原 因 就 是 方 便 。 [SEP] 笔 记 本 的 键 盘 确 实 爽 。 [SEP] [PAD] [PAD] [PAD]'
"""

tokenizer.decode(out['input_ids'][1])
"""
'[CLS] 房 间 太 小 。 其 他 的 都 一 般 。 [SEP] 今 天 才 知 道 这 书 还 有 第 6 卷, 真 有 [SEP]'
"""

2.4 字典操作

# 获取字典
zidian = tokenizer.get_vocab()  # {token: id, ...}
type(zidian), len(zidian), '月光' in zidian  # (dict, 21128, False)
'月' in zidian, '光' in zidian  # (True, True) 
# 月和光都在字典中, 但月光不在字典中
# 添加新词
tokenizer.add_tokens(new_tokens=['月光', '希望'])

# 添加新符号
tokenizer.add_special_tokens({'eos_token': '[EOS]'})

zidian = tokenizer.get_vocab()
type(zidian), len(zidian), zidian['月光'], zidian['[EOS]']  # (dict, 21131, 21128, 21130)

# 编码新添加的词
out = tokenizer.encode(
    text='月光的新希望[EOS]',
    text_pair=None,
    truncation=True,  # 当 句子长度大于max_length时,截断
    padding='max_length',  # 不足最大长度时,一律补pad到max_length长度
    add_special_tokens=True,
    max_length=8,  # 最大长度
    return_tensors=None,
)

print(out)  # [101, 21128, 4638, 3173, 21129, 21130, 102, 0]

tokenizer.decode(out)  # '[CLS] 月光 的 新 希望 [EOS] [SEP] [PAD]'

3 transformers 模型使用

使用transformers库主要分为以下几个步骤:

  1. 安装transformers库

可以使用pip命令安装transformers库:

pip install transformers
  1. 加载预训练模型

使用transformers库需要先加载相应的预训练模型。可以从Hugging Face网站上下载相应的模型,也可以通过API从transformers库中直接下载预训练模型。

加载预训练模型的代码示例:

from transformers import BertModel, BertTokenizer

model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

以上代码使用了BERT模型进行加载,加载过程中同样进行了对应的tokenization操作。

  1. 使用预训练模型进行NLP任务

加载预训练模型后,即可使用其进行NLP任务,例如文本分类、命名实体识别、序列标注、文本生成等。

以BERT模型进行文本分类为例的代码示例:

from transformers import BertForSequenceClassification, BertTokenizer

model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)

inputs = tokenizer("This is a sentence", return_tensors="pt")
outputs = model(**inputs)

logits = outputs.logits

以上代码使用了已经加载好的BERT模型进行文本分类,输入了一个句子,并返回了该句子的分类概率(logits)。

  1. fine-tune预训练模型

使用预训练模型进行迁移学习,可以针对任务领域的特定数据进行fine-tune。fine-tune是指在预训练模型的基础上,针对特定数据集进行进一步的训练,以适应特定的数据和任务。

以下是使用BERT进行情感分类fine-tune的代码示例:

from transformers import BertForSequenceClassification, BertTokenizer, AdamW
import torch

# 1. 加载数据集,假设训练集和验证集已经准备好了
train_data = ...
valid_data = ...

# 2. 加载预训练模型和tokenizer
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name)

# 3. 使用GPU进行模型训练
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model.to(device)

# 4. 设置训练参数
epochs = 5
batch_size = 16
optimizer = AdamW(model.parameters(), lr=2e-5)

# 5. 开始训练
for epoch in range(epochs):
    # 6. 训练集batch循环
    for i in range(0, len(train_data), batch_size):
        # 6.1 批处理  训练数据
        batch = train_data[i:i+batch_size]
        # 6.2 分词器编码
        inputs = tokenizer.batch_encode_plus(batch, return_tensors="pt", padding=True, truncation=True)
        inputs.to(device)
        # 6.3 张量处理 labels
        labels = torch.tensor([d['label'] for d in batch]).to(device)
        # 6.4 训练
        outputs = model(input_ids=inputs['input_ids'], token_type_ids=inputs['token_type_ids'], attention_mask=inputs['attention_mask'], labels=labels)
        # 6.5 损失函数
        loss = outputs.loss
        # 6.6 反向传播 计算梯度
        loss.backward()
        # 6.7 参数更新
        optimizer.step()
        # 6.8 梯度置为0
        optimizer.zero_grad()

    # 7. 验证集batch循环
    with torch.no_grad():  # 模型评估不需要计算梯度
        for i in range(0, len(valid_data), batch_size):
            # 7.1 验证集批处理
            batch = valid_data[i:i+batch_size]
            # 7.2 验证集分词器编码
            inputs = tokenizer.batch_encode_plus(batch, return_tensors="pt", padding=True, truncation=True)
            inputs.to(device)
            # 7.3 验证集 labels 转 张量
            labels = torch.tensor([d['label'] for d in batch]).to(device)
            # 7.4 预测
            outputs = model(input_ids=inputs['input_ids'], token_type_ids=inputs['token_type_ids'], attention_mask=inputs['attention_mask'], labels=labels)
            # 7.5 计算损失
            loss = outputs.loss

    # 8. 打印一些训练过程中的指标
    print(f"Epoch {epoch} training loss: {loss.item()}")

以上代码中,针对情感分类任务的数据集,使用fine-tune技术对BERT模型进行了训练,并输出了训练过程中的损失。

以上代码加载了BERT模型和tokenizer,并使用fine-tune技术在情感分类数据集上进行了训练。

4 数据集操作 datasets

4.1 load_dataset

from datasets import load_dataset

# 加载数据
# 注意:如果你的网络不允许你执行这段的代码,则直接运行【从磁盘加载数据】即可
# 转载自seamew/ChnSentiCorp, 或者传入本地数据数据集文件路径
dataset = load_dataset(path='lansinuote/ChnSentiCorp')  # 从网络上下载数据集

dataset
"""数据集结构
DatasetDict({
    train: Dataset({
        features: ['text', 'label'],
        num_rows: 9600
    })
    test: Dataset({
        features: ['text', 'label'],
        num_rows: 1200
    })
    validation: Dataset({
        features: ['text', 'label'],
        num_rows: 1200
    })
})
"""

4.2 save_to_disk

# save_to_disk 保存数据集到磁盘
#注意:运行这段代码要确保【加载数据】运行是正常的,否则直接运行【从磁盘加载数据】即可
dataset.save_to_disk(dataset_dict_path='./data/ChnSentiCorp')

4.3 load_from_disk

从磁盘加载数据

# 从磁盘加载数据
from datasets import load_from_disk

dataset = load_from_disk('./data/ChnSentiCorp')

dataset

4.4 获取 训练集 测试集 验证集

# 获取 训练集 测试集 验证集
# 获取训练集
dataset_train = dataset['train']
# 获取测试集
dataset_test = dataset['test']
# 获取验证集
dataset_val = dataset['validation']

# 查看一条数据
dataset_train[0]
"""
{'text': '选择珠江花园的原因就是方便,有电动扶梯直接到达海边,周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般,但还算整洁。 泳池在大堂的屋顶,因此很小,不过女儿倒是喜欢。 包的早餐是西式的,还算丰富。 服务吗,一般', 'label': 1}
"""

4.5 sort

排序

# 4. 查看一条数据
dataset_train[0]
"""
{'text': '选择珠江花园的原因就是方便,有电动扶梯直接到达海边,周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般,但还算整洁。 泳池在大堂的屋顶,因此很小,不过女儿倒是喜欢。 包的早餐是西式的,还算丰富。 服务吗,一般', 'label': 1}
"""

# 未排序的label是乱序的
print(dataset_train['label'][:10])  # [1, 1, 0, 0, 1, 0, 0, 0, 1, 1]

# 排序之后label有序了
sorted_dataset = dataset_train.sort('label')
print(sorted_dataset['label'][:10])  # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
print(sorted_dataset['label'][-10:])  # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

4.6 shuffle

打乱顺序

#打乱顺序
shuffled_dataset = sorted_dataset.shuffle(seed=42)
shuffled_dataset['label'][:10]  # [0, 1, 0, 0, 1, 0, 1, 0, 1, 0]

4.7 select

选择

dataset_train.select([0, 10, 20, 30, 40, 50])

"""
Dataset({
    features: ['text', 'label'],
    num_rows: 6
})
"""

4.8 filter

过滤

def f(data):
    return data['text'].startswith('选择')


start_with_ar = dataset_train.filter(f)

4.9 train_test_split

切割训练集和训练集

dataset_train.train_test_split(test_size=0.1)  # 0.1 表示测试集占01
"""
DatasetDict({
    train: Dataset({
        features: ['text', 'label'],
        num_rows: 8640
    })
    test: Dataset({
        features: ['text', 'label'],
        num_rows: 960
    })
})
"""

4.10 shard

将数据集均匀切分

# 切分前
"""dataset_train
Dataset({
     features: ['text', 'label'],
     num_rows: 9600
 })
"""
# 把数据切分到4个桶中,均匀分配
dataset_train.shard(num_shards=4, index=0)
"""
Dataset({
     features: ['text', 'label'],
     num_rows: 2400
 })
"""

4.11 rename_column

重名列名

dataset_train.rename_column('text', 'textA')
"""
Dataset({
    features: ['textA', 'label'],
    num_rows: 9600
})
"""

4.12 remove_columns

移除列

dataset_train.remove_columns(['text'])
"""
Dataset({
    features: ['label'],
    num_rows: 9600
})
"""

4.13 map

值映射:逐次修改每个元素值

def f(data):
    data['text'] = 'My sentence: ' + data['text']
    return data


dataset_train_map = dataset_train.map(f)

dataset_train_map['text'][:5]

4.14 set_format

设置格式

dataset.set_format(type='torch', columns=['label'])

dataset[0]
"""
{'label': tensor(1)}
"""

4.15 加载或导出csv文件

# 从网络上加载数据
dataset = load_dataset(path='lansinuote/ChnSentiCorp', split='train')
# 保存csv文件
dataset.to_csv(path_or_buf='./data/ChnSentiCorp.csv')

# 加载csv格式数据
csv_dataset = load_dataset(path='csv',
                           data_files='./data/ChnSentiCorp.csv',
                           split='train')
csv_dataset[20]
"""
{'text': '非常不错,服务很好,位于市中心区,交通方便,不过价格也高!', 'label': 1}
"""

4.16 加载或导出json文件

# 从网络上加载数据
dataset = load_dataset(path='lansinuote/ChnSentiCorp', split='train')
# 保存csv文件
dataset.to_json(path_or_buf='./data/ChnSentiCorp.json')

#加载json格式数据
json_dataset = load_dataset(path='json',
                            data_files='./data/ChnSentiCorp.json',
                            split='train')
json_dataset[20]
"""
{'text': '非常不错,服务很好,位于市中心区,交通方便,不过价格也高!', 'label': 1}
"""

4.17 评价指标 evaluate库

地址:https://huggingface.co/docs/evaluate

有哪些评价指标呢?

from datasets import list_metrics

# 列出评价指标
metrics_list = list_metrics()

print(len(metrics_list))  # 121
print(metrics_list)

如何使用评价指标,上面列出的121种评价指标,选择其中一个合适的指标即可,由于load_metric已弃用,并将在数据集的下一个datasets主要版本中删除, 因此需要安装新库评价evaluate库:pip install evaluate

# from datasets import load_metric
# 未来警告:load_metric已弃用,并将在数据集的下一个主要版本中删除。改用“evaluate.load”,从新库中

标签:BERT,transformers,入门,text,模型,dataset,train,使用,True
From: https://www.cnblogs.com/itelephant/p/17451875.html

相关文章

  • 如何4天快速入门性能测试
    在现代软件开发中,性能测试是至关重要的步骤之一。它可以帮助我们确定系统的负载极限和稳定性,以确保应用程序和网站在高流量期间仍然能够正常运行。但是,性能测试通常需要大量的时间和资源,对于初学者而言可能会感到有些棘手。以下是4天快速入门性能测试的步骤,帮助您开始追踪应用程序......
  • Oracle 游标使用全解
    --声明游标;CURSORcursor_nameISselect_statement--For循环游标--(1)定义游标--(2)定义游标变量--(3)使用for循环来使用这个游标declare--类型定义cursorc_jobisselectempno,ename,job,salfromempwherejob='MANAGER';......
  • Python编程入门常用代码
    这些代码片段涵盖了Python编程的一些常用方面,包括日期和时间操作、列表排序、字符串格式化、文件读写以及包和模块的使用。继续探索和学习这些概念,以及其他相关的Python特性,将使你的编程能力不断提升。1.输出语句:print("Hello,World!")#打印字符串2.变量和赋值:x=5#整数y......
  • Python编程入门常用代码
    这些代码片段涵盖了Python编程的一些常用方面,包括日期和时间操作、列表排序、字符串格式化、文件读写以及包和模块的使用。继续探索和学习这些概念,以及其他相关的Python特性,将使你的编程能力不断提升。1.输出语句:print("Hello,World!")#打印字符串2.变量和赋值:x=5#整数y......
  • ​​拍照替换 IOS手机端安装使用教程​
    拍照替换IOS手机端安装使用教程拍照插件是一款自动替换拍照数据的插件,支持单张多张照片选择替换,作用于系统全局,所有调用拍照的APP均有效。功能使用简单,单张,多张图片选择,按音量键切换照片。一、适用机型及系统1、机型:除SE和XR之外单所有iphone机型,可越狱即可2、系统:支持12系统及以......
  • Python编程入门常用代码
    这些代码片段涵盖了Python编程的一些常用方面,包括日期和时间操作、列表排序、字符串格式化、文件读写以及包和模块的使用。继续探索和学习这些概念,以及其他相关的Python特性,将使你的编程能力不断提升。1.输出语句:print("Hello,World!")#打印字符串2.变量和赋值:x=5#整......
  • 如何4天快速入门性能测试
    在现代软件开发中,性能测试是至关重要的步骤之一。它可以帮助我们确定系统的负载极限和稳定性,以确保应用程序和网站在高流量期间仍然能够正常运行。但是,性能测试通常需要大量的时间和资源,对于初学者而言可能会感到有些棘手。以下是4天快速入门性能测试的步骤,帮助您开始追踪应用程序......
  • webrtc-streamer使用
    下载地址:https://github.com/mpromonet/webrtc-streamer/releases获取使用的所有api:webrtc-streamer的服务地址:192.168.1.8:8000查询所有api:http://192.168.1.8:8000/api/help["/api/addIceCandidate","/api/call","/api/createOffer",......
  • paddleocr使用
    安装Anaconda3-2023.03-1-Windows-x86_64.exe配置源C:\Users\thzn>pipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple/#配置condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/condaconfig--addchannelsh......
  • 使用HHDBCS的SSH通道登陆数据库
    传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,SSH协议已经越来越被用户所青睐。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。因此HHDBCS提供了SSH通道的登陆方式......