huggingface的transformers与datatsets的安装与使用

news2024/11/17 7:28:18

目录

1.安装 

2.分词

2.1tokenizer.encode() 

2.2tokenizer.encode_plus ()

2.3tokenizer.batch_encode_plus() 

3.添加新词或特殊字符

 3.1tokenizer.add_tokens()

3.2 tokenizer.add_special_tokens()

 4.datasets的使用

4.1加载datasets 

4.2从dataset中取数据 

 4.3对datasets中的label排序

4.4打乱数据

4.5select   选择指定位置的数据 

4.6过滤

4.7切分训练集和测试集

4.8分桶 

4.9列的重命名 

4.10删除列 

4.11map()函数, 统一在相同位置添加相同信息

4.12设置格式 

4.13导出与加载csv这种常见格式

 

4.14导出与加载json这种常见格式 


 

1.安装 

#安装python语句

pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install datasets -i https://pypi.tuna.tsinghua.edu.cn/simple

#在jupyter notebook中 安装语句

!pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple

!pip install datasets -i https://pypi.tuna.tsinghua.edu.cn/simple

2.分词

2.1tokenizer.encode() 

from transformers import BertTokenizer

#本地磁盘加载bert-base-chinese预训练词向量模型
tokenizer = BertTokenizer.from_pretrained(
    pretrained_model_name_or_path=r'E:\ALOT\10_deep_learning\data\bert-base-chinese',
    cache_dir=None,   #有无缓存目录
    fore_download=False  #需不需要下载
)


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


out = tokenizer.encode(
    text=sents[0],
    text_pair=sents[1],
    #句子长度>max_length时, 进行截断操作
    truncation=True,
    #句子长度不够就统一拼接
    padding='max_length',
    add_special_tokens=True,  #添加特殊字符,如<pad>、<unk>.....
    max_length=30,
    #默认None返回一个列表, 或者选择 tf(tensflow),pt(pytorch), np(numpy)
    return_tensors=None
)


print(out)

[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]
tokenizer.decode(out)

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

2.2tokenizer.encode_plus ()

#增强版编码endoce函数
out = tokenizer.encode_plus(
    text=sents[0],
    text_pair=sents[1],
    truncation=True,
    padding='max_length',
    add_special_tokens=True,
    max_length=15,
    return_tensors=None,
    
    #增强版的增加的参数
    return_token_type_ids=True,  #标记0是第一句话;标记1是第二句话
    return_attention_mask=True,
    return_special_tokens_mask=True,  #返回特殊符号的标识
    return_length=True  #返回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
print(out)  #多输出会变成字典
{'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}

2.3tokenizer.batch_encode_plus() 

#批量编码句子
out_batch_encode = tokenizer.batch_encode_plus(
    batch_text_or_text_pairs=[sents[0], sents[1], sents[2]],
    truncation=True,
    padding='max_length',
    add_special_tokens=True,
    max_length=50,
    return_tensors=None,
    
    #增强版的增加的参数
    return_token_type_ids=True,  #标记0是第一句话;标记1是第二句话, 1后面的0表示第二句话补充的pad
    return_attention_mask=True,
    return_special_tokens_mask=True,  #返回特殊符号的标识
    return_length=True  #返回length标识长度
)


for k, v in out_batch_encode.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], [101, 2791, 7313, 1922, 2207, 511, 1071, 800, 4638, 6963, 671, 5663, 511, 102, 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], [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], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]
length : [15, 12, 14]
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, 0]]
tokenizer.decode(out_batch_encode['input_ids'][0]), tokenizer.decode(out_batch_encode['input_ids'][1])

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

#编码批量成对的句子
out_batch_encode_2 = tokenizer.batch_encode_plus(
    batch_text_or_text_pairs=[(sents[0], sents[1]), (sents[2], sents[3])],
    truncation=True,
    padding='max_length',
    add_special_tokens=True,
    max_length=30,
    return_tensors=None,
    
    #增强版的增加的参数
    return_token_type_ids=True,  #标记0是第一句话;标记1是第二句话, 1后面的0表示第二句话补充的pad
    return_attention_mask=True,
    return_special_tokens_mask=True,  #返回特殊符号的标识
    return_length=True  #返回length标识长度
)


for k, v in out_batch_encode_2.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]]
len(vocab)

 21128

'手机' in vocab

 False

3.添加新词或特殊字符

 3.1tokenizer.add_tokens()

#添加新词
tokenizer.add_tokens(new_tokens=['你好', '手机'])

 2

3.2 tokenizer.add_special_tokens()

#添加新字符
tokenizer.add_special_tokens({'eos_token':'[EOS]'})
vocab = tokenizer.get_vocab()  #获取词汇表
len(vocab)

 21131

'你好' in vocab

True

#用get查询不存在的词,不会报错
vocab.get('你好')  #获取查询词的索引

#查询不存在的词,会报错
vocab['你好']   vocab['你好']

 21128

#编码新添加的词
out_new_add_word_encode = tokenizer.encode(text='你好的手机[EOS]',
    text_pair=None,
    truncation=True,
    #句子长度不够就统一拼接
    padding='max_length',
    add_special_tokens=True,  #添加特殊字符,如<pad>、<unk>.....
    max_length=10,
    #默认None返回一个列表, 或者选择 tf(tensflow),pt(pytorch), np(numpy)
    return_tensors=None
)


print(out_new_add_word_encode)

 [101, 21128, 4638, 21129, 21130, 102, 0, 0, 0, 0]

tokenizer.decode(out_new_add_word_encode)

 '[CLS] 你好 的 手机 [EOS] [SEP] [PAD] [PAD] [PAD] [PAD]'

 4.datasets的使用

#从镜像网站下载的datasets 本地磁盘加载方式一
#网址:seamew/ChnSentiCorp at mainseamew/ChnSentiCorp at mainseamew/ChnSentiCorp at main 

4.1加载datasets 

from datasets import load_dataset

datasets = load_dataset(path=r'E:\ALOT\10_deep_learning\data\Chn')

datasets
DatasetDict({
    train: Dataset({
        features: ['label', 'text'],
        num_rows: 9600
    })
    validation: Dataset({
        features: ['label', 'text'],
        num_rows: 1200
    })
    test: Dataset({
        features: ['label', 'text'],
        num_rows: 1200
    })
})

#从学习课件资料的datasets 本地磁盘加载方式二 

# from datasets import load_dataset
# #直接从官网下载datasets
# dataset = load_dataset(path='seamew/ChnSentiCorp')

# #保存数据集到磁盘
# #注意:上面的加载数据要成功运行才可以执行保存
# dataset.save_to_disk(dataset_dict_path='../data/ChnSentiCorp')
from datasets import load_from_disk

dataset = load_from_disk(r'E:\ALOT\10_deep_learning\data\ChnSentiCorp')


dataset
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.2从dataset中取数据 

#按照字典的方法取数据
dataset_train = dataset['train']


dataset_train   #可迭代的Dataset对象,像列表一样用索引获取数据

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

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

 4.3对datasets中的label排序

#排序
print(dataset_train['label'])  #标签是乱码的

输出太多,展示部分

[1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1,]
#对标签排序
dataset_sorted = dataset_train.sort('label')

dataset_sorted

Dataset({
    features: ['text', 'label'],
    num_rows: 9600
})
print(dataset_sorted[:5])

{'text': ['房间太小。其他的都一般。。。。。。。。。', '1.接电源没有几分钟,电源适配器热的不行. 2.摄像头用不起来. 3.机盖的钢琴漆,手不能摸,一摸一个印. 4.硬盘分区不好办.', '机器背面似乎被撕了张什么标签,残胶还在。但是又看不出是什么标签不见了,该有的都在,怪', '呵呵,虽然表皮看上去不错很精致,但是我还是能看得出来是盗的。但是里面的内容真的不错,我妈爱看,我自己也学着找一些穴位。', '这本书实在是太烂了,以前听浙大的老师说这本书怎么怎么不对,哪些地方都是误导的还不相信,终于买了一本看一下,发现真是~~~无语,这种书都写得出来'], 'label': [0, 0, 0, 0, 0]}
print(dataset_sorted['label'][:5])  #前5条数据的标签
[0, 0, 0, 0, 0]
print(dataset_sorted['text'][:5])  #前5条数据的文本

['房间太小。其他的都一般。。。。。。。。。', '1.接电源没有几分钟,电源适配器热的不行. 2.摄像头用不起来. 3.机盖的钢琴漆,手不能摸,一摸一个印. 4.硬盘分区不好办.', '机器背面似乎被撕了张什么标签,残胶还在。但是又看不出是什么标签不见了,该有的都在,怪', '呵呵,虽然表皮看上去不错很精致,但是我还是能看得出来是盗的。但是里面的内容真的不错,我妈爱看,我自己也学着找一些穴位。', '这本书实在是太烂了,以前听浙大的老师说这本书怎么怎么不对,哪些地方都是误导的还不相信,终于买了一本看一下,发现真是~~~无语,这种书都写得出来']
print(dataset_sorted['label'][-5:])  #最后5条数据的标签

[1, 1, 1, 1, 1]

4.4打乱数据

#打乱数据
#shuffle
dataset_shuffle=dataset_sorted.shuffle(seed=10)  #seed=10随机种子,将打乱之后的顺序固定


print(dataset_shuffle['label'][:5])

[0, 1, 0, 0, 0]

4.5select   选择指定位置的数据 

#select   选择指定位置的数据
dataset_select = dataset_train.select([0, 10, 20, 30, 40, 50])


dataset_select

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

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

4.6过滤

#过滤
#filter () 里面需要放一个函数来过滤

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

start_with_ar = dataset_train.filter(f)
len(start_with_ar), start_with_ar['text']

(2,
 ['选择珠江花园的原因就是方便,有电动扶梯直接到达海边,周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般,但还算整洁。 泳池在大堂的屋顶,因此很小,不过女儿倒是喜欢。 包的早餐是西式的,还算丰富。 服务吗,一般',
  '选择的事例太离奇了,夸大了心理咨询的现实意义,让人失去了信任感!如果说这样写的效果能在一开始抓住读者的眼球,但是看到案例主人公心理问题的原因解释时就逐渐失去了兴趣,反正有点拣了芝麻丢了西瓜的感觉。'])

4.7切分训练集和测试集

dataset_train.train_test_split(test_size=0.2)

DatasetDict({
    train: Dataset({
        features: ['text', 'label'],
        num_rows: 7680
    })
    test: Dataset({
        features: ['text', 'label'],
        num_rows: 1920
    })
})

4.8分桶 

#分桶
#把数据均匀分配到N个桶中
dataset_train.shard(num_shards=4, index=1)  #num_shards=4分的桶数, index=1获取索引为1的桶里的数据

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

4.9列的重命名 

#列的重命名
dataset_train.rename_column('text', 'context')

Dataset({
    features: ['context', 'label'],
    num_rows: 9600
})

4.10删除列 

#删除列
dataset_train.remove_columns(['text'])

Dataset({
    features: ['label'],
    num_rows: 9600
})

4.11map()函数, 统一在相同位置添加相同信息

#map()函数, 统一在相同位置添加相同信息
def m_f(data):
    data['text'] = 'My sentence:' + data['text']
    return data

dataset_map = dataset_train.map(m_f)
dataset_map['text'][:5]

['My sentence:选择珠江花园的原因就是方便,有电动扶梯直接到达海边,周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般,但还算整洁。 泳池在大堂的屋顶,因此很小,不过女儿倒是喜欢。 包的早餐是西式的,还算丰富。 服务吗,一般',
 'My sentence:15.4寸笔记本的键盘确实爽,基本跟台式机差不多了,蛮喜欢数字小键盘,输数字特方便,样子也很美观,做工也相当不错',
 'My sentence:房间太小。其他的都一般。。。。。。。。。',
 'My sentence:1.接电源没有几分钟,电源适配器热的不行. 2.摄像头用不起来. 3.机盖的钢琴漆,手不能摸,一摸一个印. 4.硬盘分区不好办.',
 'My sentence:今天才知道这书还有第6卷,真有点郁闷:为什么同一套书有两种版本呢?当当网是不是该跟出版社商量商量,单独出个第6卷,让我们的孩子不会有所遗憾。']

4.12设置格式 

#设置格式
dataset_train.set_format(type='torch', columns=['label'])
dataset_train[0]

{'label': tensor(1)}

4.13导出与加载csv这种常见格式

#导出为csv这种常见格式
dataset_train.to_csv(path_or_buf='../data/ChnSentiCorp/ChnSC.csv')

3032906   字节

#加载本地磁盘csv格式文件
#split='train'指定加载TensorFlow Datasets中的数据集的哪一部分,即训练集。
csv_dataset = load_dataset(path='csv', data_files='../data/ChnSentiCorp/ChnSC.csv', split='train')
csv_dataset[20]
{'text': '非常不错,服务很好,位于市中心区,交通方便,不过价格也高!', 'label': 1}

4.14导出与加载json这种常见格式 

#导出成json格式文件
dataset_train.to_json(path_or_buf='../data/ChnSentiCorp/ChnSC.json')

 6125321 字节

#加载json格式的数据
json_dataset = load_dataset(path='json', data_files='../data/ChnSentiCorp/ChnSC.json', split='train')
json_dataset[20]

{'text': '非常不错,服务很好,位于市中心区,交通方便,不过价格也高!', 'label': 1}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自动收发邮件的详细步骤与使用方法?

Python自动收发邮件教程&#xff1f;Python怎么实现收发邮件&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库和工具&#xff0c;使得自动收发邮件变得简单而高效。AokSend将详细介绍如何使用Python自动收发邮件&#xff0c;帮助读者掌握这一实用技能。 …

【ASE】第四课_护盾效果(有碰撞效果)

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习护盾的效果。 思路&#xff1a; 1.添加纹理贴图和法线贴图&#xff08;这里省略&#xff09; 2.添加护盾边缘顶点扰动效果&#xff0c;也可以理解成变形效果 3.添加碰撞…

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档&#xff1a;https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

59 双向循环神经网络_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录双向RNN推理 总结以下为理论部分双向循环神经网络隐马尔可夫模型中的动态规划双向模型定义模型的计算代价及其应用 (**双向循环神经网络的错误应用**)小结练习 双向RNN 这里理解这个图的时候&#xff0c;不要把正向和逆向认为有上下的关系&a…

计算机毕业设计 基于Python的音乐平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

IDE 使用技巧与插件推荐(含例说明)

在使用集成开发环境&#xff08;IDE&#xff09;进行编程时&#xff0c;掌握一些技巧和使用高效的插件可以显著提高开发效率。以下是一些通用的IDE使用技巧和插件推荐&#xff0c;适用于多种流行的IDE&#xff0c;如IntelliJ IDEA、Visual Studio Code、PyCharm等。每个技巧和插…

泳池异常检测系统源码分享

泳池异常检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Pencils Protocol 成市场新宠,生态通证$DAPP价值几何

Pencils Protocol 是 Scroll 生态综合性收益平台&#xff0c;其仅在 Scroll 生态单链 TVL 就已经突破了 3.5 亿美元&#xff0c;同时在上线短短几个月的时间里就积累了超 50 万活跃社区用户。现阶段 Pencils Protocol 已经完成了 DAPP 通证的 TGE &#xff0c;分别在 Tokensoft…

[SAP ABAP] 锁对象

在SAP中使用锁对象&#xff0c;用于避免在数据库中插入或更改数据时出现不一致的情况 1.创建锁对象 数据准备 学校表(ZDBT_SCH_437) 使用事务码SE11创建锁对象 点击"锁对象"单选按钮&#xff0c;输入以E开头的锁定对象的名称&#xff0c;然后点击创建按钮 锁对象名…

关于宝塔PHP getenv无法获取环境变量问题解决办法

今天有用ThinkPHP8接入阿里云OSS时&#xff0c;需要用的用到getenv()来读取环境变量&#xff0c;因为新版OSS SDK是用环境变更来设置AK的。 现象 正常执行PHP文件&#xff0c;可以取到环境变量&#xff1b;但是通过nginxphp-fpm调用脚本取到不到环境变量 原因 php-fpm为了防止…

【软考】高速缓存的组成

目录 1. 说明2. 组成 1. 说明 1.高速缓存用来存放当前最活跃的程序和数据。2.高速缓存位于CPU 与主存之间。3.容量般在几千字节到几兆字节之间。4.速度一般比主存快 5~10 倍&#xff0c;由快速半导体存储器构成。5.其内容是主存局部域的副本&#xff0c;对程序员来说是透明的。…

【C++】C++中如何处理多返回值、C++中的模板

十四、C中如何处理多返回值 本部分也是碎碎念&#xff0c;因为这些点都是很小的点&#xff0c;构不成一篇文章&#xff0c;所以本篇就是想到哪个点就写哪个点。 1、C中如何处理多个返回值 写过python的同学都知道&#xff0c;当你写一个函数的返回时&#xff0c;那是你想返回…

STM32 F1移植FATFS文件系统 USMART组件测试相关函数功能

STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能 文章目录 STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能前言部分主要相关代码# USMART介绍1. mf_scan_files 扫描磁盘文件2. mf_mount 挂载磁盘3. mf_open 打开文件4. mf_read 读数据内容5. mf…

软件测试学习路线图

软件测试工程师是专门从事软件、系统或产品测试和评估的技术专业人士&#xff0c;确保它们符合既定标准并无任何缺陷。通过精心设计和执行测试计划&#xff0c;软件测试工程师发现 Bug、故障和需要改进的领域&#xff0c;从而提高最终产品的可靠性和性能。 软件测试工程师在软…

干货|CNAS-CL01设备部分解读,透彻掌握软件测试实验室设备关键点

CNAS-CL01《检测和校准实验室能力认可准则》是软件测试实验室建立符合CNAS标准的质量管理体系必须要贯彻的一部准则&#xff0c;分为五大核心部分&#xff1a;通用要求、结构要求、资源要求、过程要求和管理体系要求。前面的文章中我们为大家分享了通用要求部分、结构要求部分以…

WebAssembly进阶,vue3 使用 WebAssembly,及 WebAssembly vs JavaScript 的性能对比

目录 核心使用步骤 .c文件.cpp文件编译 使用 Emscripten 转译文件 页面中引入.wasm文件中的函数 WebAssembly vs JavaScript 的性能对比 性能对比关键点: 具体场景 实际案例分析 如果对WebAssembly不熟悉可以前往:WebAssembly最详教程,进行WebAssembly基础学习 Web…

一篇文章弄懂数据结构中的各种排序_插入排序_冒泡排序_快速排序_堆排序_归并排序_基数排序

文章目录 一篇文章弄懂数据结构中的各种排序1.排序的概念2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希尔排序 3.冒泡排序3.1 算法原理3.2 性能分析 4.快速排序4.1 算法原理4.2 性能分析 5. 选择排序5.1 简单选择排序5.2 堆排序5.1 算法流程5.2 算法效率分析5.3 堆排序的…

2024CSCO 芦康沙妥珠单抗创造晚期TNBC二线治疗新高度

前言 “魔法子弹”的概念从上世纪初提出&#xff0c;经过一百多年的不断探索&#xff0c;抗体药物偶联物&#xff08;ADC&#xff09;从理想照进现实&#xff0c;达到今天百舸争流的盛况&#xff0c;被认为是极具前景的创新疗法&#xff0c;全球范围内已有十余款产品被批准用于…

使用Mendeley生成APA格式参考文献

Mendeley 是一款文献管理工具&#xff0c;可以在Word中方便的插入引用文献。 效果对比&#xff1a; 注&#xff1a;小绿鲸有三种导出格式&#xff0c;分别为复制、导出为Bibtex和导出为Endnote三种。 Mendeley 下载与安装 Download Mendeley Reference Manager For Desktop m…

报道|解读INFORMS期刊影响因子的下降及运筹与管理科学出版的未来

编者按 David Simchi-Levi和Tinglong Dai老师近期在ORMS Today上发表了一篇名为拥抱影响力的变化&#xff1a;解读INFORMS期刊影响因子的下降及运筹与管理科学出版的未来的文章&#xff0c;探讨了近几年INFORMS的大多数期刊影响因子下降的原因以及带给我们的启示。 2023年7月&a…