目录
0.install
1.tokenizer
2.datasets
3.metrics
0.install
!pip install transformers
!pip install datasets
1.tokenizer
from transformers import BertTokenizer
#加载预训练字典和分词方法
tokenizer = BertTokenizer.from_pretrained(
pretrained_model_name_or_path='bert-large-uncased',
cache_dir=None,
force_download=False,
)
sents = [
'If I could,I surely would.',
'May there be enough clouds in your life to make a beautiful sunset.',
'The worst way to miss someone is to be sitting right beside them knowing you can not have them.',
'No pains,no gains.',
'Life is like a box of chocolates, you never know what you are going to get.',
]
tokenizer, sents
#编码两个句子
out = tokenizer.encode(
text=sents[0],
text_pair=sents[1],
#当句子长度大于max_length时,截断
truncation=True,
#一律补pad到max_length长度
padding='max_length',
add_special_tokens=True,
max_length=30,
return_tensors=None,
)
print(out)
tokenizer.decode(out)
#增强的编码函数
out = tokenizer.encode_plus(
text=sents[0],
text_pair=sents[1],
#当句子长度大于max_length时,截断
truncation=True,
#一律补零到max_length长度
padding='max_length',
max_length=30,
add_special_tokens=True,
#可取值tf,pt,np,默认为返回list
return_tensors=None,
#返回token_type_ids
return_token_type_ids=True,
#返回attention_mask
return_attention_mask=True,
#返回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)
tokenizer.decode(out['input_ids'])
#批量编码句子
out = tokenizer.batch_encode_plus(
batch_text_or_text_pairs=[sents[0], sents[1]],
add_special_tokens=True,
#当句子长度大于max_length时,截断
truncation=True,
#一律补零到max_length长度
padding='max_length',
max_length=15,
#可取值tf,pt,np,默认为返回list
return_tensors=None,
#返回token_type_ids
return_token_type_ids=True,
#返回attention_mask
return_attention_mask=True,
#返回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)
tokenizer.decode(out['input_ids'][0]), tokenizer.decode(out['input_ids'][1])
#批量编码成对的句子
out = tokenizer.batch_encode_plus(
batch_text_or_text_pairs=[(sents[0], sents[1]), (sents[2], sents[3])],
add_special_tokens=True,
#当句子长度大于max_length时,截断
truncation=True,
#一律补零到max_length长度
padding='max_length',
max_length=30,
#可取值tf,pt,np,默认为返回list
return_tensors=None,
#返回token_type_ids
return_token_type_ids=True,
#返回attention_mask
return_attention_mask=True,
#返回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)
tokenizer.decode(out['input_ids'][0])
#获取字典
zidian = tokenizer.get_vocab()
type(zidian), len(zidian), 'love' in zidian,
(dict, 30522, True)
2.datasets
from datasets import load_dataset
#加载数据
#注意:如果你的网络不允许你执行这段的代码,则直接运行【从磁盘加载数据】即可,我已经给你准备了本地化的数据文件
#转载自seamew/ChnSentiCorp
dataset = load_dataset(path='lansinuote/ChnSentiCorp')
dataset
#保存数据集到磁盘
dataset.save_to_disk(dataset_dict_path='./data/ChnSentiCorp')
#从磁盘加载数据
from datasets import load_from_disk
dataset = load_from_disk('./data/ChnSentiCorp')
#取出训练集
dataset = dataset['train']
#查看一个数据
dataset[3]
{'text': '1.接电源没有几分钟,电源适配器热的不行. 2.摄像头用不起来. 3.机盖的钢琴漆,手不能摸,一摸一个印. 4.硬盘分区不好办.', 'label': 0}
#排序
#未排序的label是乱序的
print(dataset['label'][:10])
#排序之后label有序了
sorted_dataset = dataset.sort('label')
print(sorted_dataset['label'][:10])
print(sorted_dataset['label'][-10:])
[1, 1, 0, 0, 1, 0, 0, 0, 1, 1] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
#shuffle
#打乱顺序
shuffled_dataset = sorted_dataset.shuffle(seed=40)
shuffled_dataset['label'][:10]
[1, 1, 1, 0, 0, 1, 1, 1, 1, 1]
#select
select=dataset.select([0, 10, 20, 30, 40, 50])
select,select[2]
#filter
def f(data):
return data['text'].startswith('使用')
start_with_ar = dataset.filter(f)
len(start_with_ar), start_with_ar['text']
#train_test_split, 切分训练集和测试集
dataset.train_test_split(test_size=0.3)
#shard
#把数据切分到4个桶中,均匀分配
dataset.shard(num_shards=4, index=0)
#rename_column
dataset.rename_column('text', 'textA')
Dataset({ features: ['textA', 'label'], num_rows: 9600 })
#map
def f(data):
data['text'] = 'My sentence: ' + data['text']
return data
datatset_map = dataset.map(f)
datatset_map['text'][:5]
#set_format
dataset.set_format(type='torch', columns=['label'])
dataset[0]
{'label': tensor(1)}
#导出为csv格式
dataset = load_dataset(path='lansinuote/ChnSentiCorp', split='train')
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}
#导出为json格式
dataset = load_dataset(path='lansinuote/ChnSentiCorp', split='train')
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}
3.metrics
from datasets import list_metrics
#列出评价指标
metrics_list = list_metrics()
len(metrics_list), metrics_list
from datasets import load_metric
#加载一个评价指标
metric = load_metric('glue', 'mrpc')
print(metric.inputs_description)
#计算一个评价指标
prediction = [0,1,0,1,1] #预测
reference = [0,1,1,1,1] #参考
final_score = metric.compute(predictions=prediction, references=reference)
final_score
{'accuracy': 0.8, 'f1': 0.8571428571428571}