huggingface的transformers与datatsets的安装与使用

目录

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/simplepip 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表示第二句话补充的padreturn_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表示第二句话补充的padreturn_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_datasetdatasets = 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_diskdataset = 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 datadataset_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.mzph.cn/web/53846.shtml

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

相关文章

第L4周:机器学习-KNN总结-分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 概念&#xff1a; 在第L4周&#xff1a;机器学习-K-邻近算法模型&#xff08;KNN&#xff09;-CSDN博客中学习了KNN的基本概念&#xff0c;本次主要加深印象&a…

锐捷 NBR 1300G路由器 越权CLI命令执行漏洞

漏洞描述 锐捷NBR 1300G路由器 越权CLI命令执行漏洞&#xff0c;guest账户可以越权获取管理员账号密码 漏洞复现 FOFA title"锐捷网络 --NBR路由器--登录界面" 请求包 POST /WEB_VMS/LEVEL15/ HTTP/1.1 Host: Connection: keep-alive Content-Length: 73 Autho…

硬件设计-噪声的学习

目录 LDO 噪声和 PSRR ​编辑 噪声类型 数据表中的噪声规格 哪种规格适合您的应用 如何降低 LDO 噪声&#xff1f; LDO 噪声的影响 LDO 噪声和 PSRR 低压差线性稳压器 (LDO) 为调节由较高电压输入产生的输出电压提供了一种简单方法。虽然操作简单&#xff0c;但其自生噪…

如何禁止电脑上某个软件运行?电脑设置禁止运行软件的4个方法速成

在日常使用电脑的过程中&#xff0c;可能会遇到需要禁止某些软件运行的情况。 无论是为了防止员工随意使用与工作无关的软件&#xff0c;还是为了管理孩子的电脑使用时间&#xff0c;禁止特定软件运行都是有效的解决方案。 下面介绍4个速成方法&#xff0c;帮你轻松禁止电脑上…

QQ机器人搭建

使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人 文章目录 使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人前言编写机器人代码机器人监听群聊进行文字回复机器人监听群聊进行图片回复机器人监听群聊进行文件发送机器人监听群聊进行视频发送机器人监听群聊进行语…

3.js - 运动曲线

这个球&#xff0c;绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据&#xff0c;一系列的点&#xff0c;创建曲线 le…

【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!

正点原子《基于GD32 ARM32单片机项目实战入门》全新培训课程上线啦&#xff01;正点原子工程师手把手教你学&#xff01;彻底解决ARM32单片机项目入门难的问题&#xff01; 一、课程介绍 本课程专为ARM32单片机的入门学习者设计&#xff0c;涵盖了环境搭建、编程软件使用、模…

ML 系列:机器学习和深度学习的深层次总结(08)—欠拟合、过拟合,正确拟合

ML 系列赛&#xff1a;第 9 天 — Under、Over 和 Good Fit 文章目录 一、说明二、了解欠拟合、过拟合和实现正确的平衡三、关于泛化四、欠拟合五、过拟合六、适度拟合七、结论 一、说明 在有监督学习过程中&#xff0c;对于指定数据集进行训练&#xff0c;训练结果存在欠拟合…

微软Win11 22H2/23H2 九月可选更新KB5043145发布!

系统之家于9月27日发出最新报道&#xff0c;微软针对Windows11系统&#xff0c;发布了九月最新可选更新补丁KB5043145&#xff0c;22H2用户安装后&#xff0c;系统版本号升至22621.4249&#xff0c;23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…

本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

远程访问软路由

远程访问软路由主要涉及通过互联网从远程位置访问和控制基于软件的路由器系统。以下是远程访问软路由的一般方法&#xff1a; 一、远程访问软路由的方法 通过Web管理界面访问&#xff1a; 适用于大多数支持Web管理的软路由系统。用户只需在浏览器中输入软路由的公网IP地址或域…

[Linux#58][HTTP] 自己构建服务器 | 实现网页分离 | 设计思路

目录 一. 最简单的HTTP服务器 二.服务器 2.0 Protocol.hpp httpServer.hpp 子进程的创建和退出 子进程退出的意义 父进程关闭连接套接字 httpServer.cc argc (argument count) argv (argument vector) 三.服务器和网页分离 思考与补充&#xff1a; 一. 最简单的HTT…

ONFI 5.1:定义、缩写语和约定

address 该地址由一个行地址和一个列地址组成。行地址标识要访问的page、block和LUN。列地址标识要访问的page中的byte或word。 asynchronous 异步是指数据用WE_n信号进行写&#xff0c;RE_n信号进行读。 block 由多个page组成&#xff0c;是擦除操作的最小可寻址单元。 column…

安卓开发板_MTK开发板_联发科开发评估套件Demo板接口介绍

开发板是一种功能丰富的电路平台&#xff0c;专为开发人员设计&#xff0c;集成了多种传感器、扩展接口和通信模块。这使得开发者能够高效进行原型设计和功能验证&#xff0c;极大地简化了软硬件开发的过程。 此次介绍的安卓开发板由MT8788核心板与底板构成&#xff0c;特别之处…

OpenCV视频I/O(5)视频采集类VideoCapture之从视频流中获取下一帧的函数grab()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从视频文件或捕获设备中抓取下一帧。 grab() 函数是 OpenCV 中 VideoCapture 类的一个成员函数&#xff0c;用于从视频流中获取下一帧而不立即检…

AB plc设备数据 转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集AB PLC数据 2 5 用PROFINET IO协议转发数据 4 6 案例总结 7 1 案例说明 设置网关采集AB PLC数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0…

Vue.js与Flask/Django全栈开发实战:从零搭建前后端分离的高效Web应用,打造现代化全栈开发体验!

将Vue.js与Flask或Django等后端框架配合使用&#xff0c;可以构建一个全栈的Web应用。以下是一个简要的指南&#xff0c;介绍如何将Vue.js与Flask或Django结合使用。 1. 准备工作 确保你已经安装了Node.js、npm&#xff08;或yarn&#xff09;以及Python和相应的包管理工具&am…

【系统交付资料】软件文档交付清单整理套用原件(Word,PPT,Excel)

软件文档交付清单是指在软件开发项目完成后&#xff0c;开发团队需要准备的一份详细清单&#xff0c;用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&…

CSS的弹性盒子模型(Flex box)

弹性盒子模型是CSS3的一种新的布局模式&#xff0c;弹性盒是一种当页面需要适应不同的屏幕大小以及设备类型时确保拥有合适的布局方式&#xff0c;引入弹性盒子模型的目的时提供更加有效的方式来对一个容器中的子元素进行排列&#xff0c;对齐和分配空白空间。 弹性盒子由弹性容…

高密度EEG人脑成像:技术与应用

摘要 EEG是一种非侵入性的人脑神经活动测量技术。随着数字技术的进步&#xff0c;EEG分析已从定性分析幅值和频率调制发展到全面分析记录信号的复杂时空特征。EEG能够在亚秒级的时间范围内测量神经过程&#xff0c;但其空间分辨率较低&#xff0c;这使得难以准确可靠地定位EEG…