SSAN代码解析

文章目录

  • run_docred.py
      • 详细介绍每一行代码
  • dataset.py
      • 详细介绍每一行代码
      • 输入和输出
      • 示例
    • docred_convert_examples_to_features
      • 详细介绍每一行代码
    • DocREDProcessor
      • 详细介绍每一行代码
      • 输入和输出

run_docred.py

下面是带有详细中文注释的代码说明,包括输入和输出的介绍:

def load_and_cache_examples(args, tokenizer, evaluate=False, predict=False):# 如果在分布式训练中,并且不是第一个进程且不在评估模式下,则等待第一个进程处理数据集if args.local_rank not in [-1, 0] and not evaluate:torch.distributed.barrier()  # 确保只有第一个进程处理数据集,其余进程使用缓存processor = DocREDProcessor()  # 初始化DocRED处理器# 加载数据logger.info("Creating features from dataset file at %s", args.data_dir)label_map = processor.get_label_map(args.data_dir)  # 获取标签映射# 根据evaluate和predict标志决定加载哪种数据集if evaluate:examples = processor.get_dev_examples(args.data_dir)  # 获取验证集样本elif predict:examples = processor.get_test_examples(args.data_dir)  # 获取测试集样本else:examples = processor.get_train_examples(args.data_dir)  # 获取训练集样本# 将样本转换为特征features = convert_examples_to_features(examples,args.model_type,tokenizer,max_length=args.max_seq_length,max_ent_cnt=args.max_ent_cnt,label_map=label_map)# 如果在分布式训练中,并且是第一个进程且不在评估模式下,则等待处理完数据集if args.local_rank == 0 and not evaluate:torch.distributed.barrier()  # 确保只有第一个进程处理数据集,其余进程使用缓存# 将特征转换为Tensor并构建数据集all_input_ids = torch.tensor([f.input_ids for f in features], dtype=torch.long)  # 输入IDsall_attention_mask = torch.tensor([f.attention_mask for f in features], dtype=torch.long)  # 注意力掩码all_token_type_ids = torch.tensor([f.token_type_ids for f in features], dtype=torch.long)  # 句子类型IDsall_ent_mask = torch.tensor([f.ent_mask for f in features], dtype=torch.float)  # 实体掩码all_ent_ner = torch.tensor([f.ent_ner for f in features], dtype=torch.long)  # 实体命名实体识别(NER)标签all_ent_pos = torch.tensor([f.ent_pos for f in features], dtype=torch.long)  # 实体位置all_ent_distance = torch.tensor([f.ent_distance for f in features], dtype=torch.long)  # 实体距离all_structure_mask = torch.tensor([f.structure_mask for f in features], dtype=torch.bool)  # 结构掩码all_label = torch.tensor([f.label for f in features], dtype=torch.bool)  # 标签all_label_mask = torch.tensor([f.label_mask for f in features], dtype=torch.bool)  # 标签掩码# 创建TensorDatasetdataset = TensorDataset(all_input_ids, all_attention_mask, all_token_type_ids,all_ent_mask, all_ent_ner, all_ent_pos, all_ent_distance,all_structure_mask, all_label, all_label_mask)return dataset  # 返回构建的数据集

详细介绍每一行代码

  1. 函数定义:

    def load_and_cache_examples(args, tokenizer, evaluate=False, predict=False):
    
    • 功能: 加载并缓存样本数据。
    • 输入: args(参数配置),tokenizer(分词器),evaluate(是否评估),predict(是否预测)。
    • 输出: 返回构建的TensorDataset对象。
  2. 处理分布式训练的屏障:

    if args.local_rank not in [-1, 0] and not evaluate:torch.distributed.barrier()
    
    • 功能: 确保只有第一个进程处理数据集,其余进程等待使用缓存。
  3. 初始化处理器和加载标签映射:

    processor = DocREDProcessor()
    logger.info("Creating features from dataset file at %s", args.data_dir)
    label_map = processor.get_label_map(args.data_dir)
    
    • 功能: 初始化DocRED处理器并加载标签映射。
  4. 根据模式加载数据集:

    if evaluate:examples = processor.get_dev_examples(args.data_dir)
    elif predict:examples = processor.get_test_examples(args.data_dir)
    else:examples = processor.get_train_examples(args.data_dir)
    
    • 功能: 根据evaluatepredict标志,加载验证集、测试集或训练集的样本。
  5. 将样本转换为特征:

    features = convert_examples_to_features(examples,args.model_type,tokenizer,max_length=args.max_seq_length,max_ent_cnt=args.max_ent_cnt,label_map=label_map
    )
    
    • 功能: 将样本转换为特征,包括输入IDs、注意力掩码、句子类型IDs等。
  6. 处理分布式训练的屏障(第二次):

    if args.local_rank == 0 and not evaluate:torch.distributed.barrier()
    
    • 功能: 确保只有第一个进程处理数据集,其余进程等待使用缓存。
  7. 将特征转换为Tensor并构建数据集:

    all_input_ids = torch.tensor([f.input_ids for f in features], dtype=torch.long)
    all_attention_mask = torch.tensor([f.attention_mask for f in features], dtype=torch.long)
    all_token_type_ids = torch.tensor([f.token_type_ids for f in features], dtype=torch.long)
    all_ent_mask = torch.tensor([f.ent_mask for f in features], dtype=torch.float)
    all_ent_ner = torch.tensor([f.ent_ner for f in features], dtype=torch.long)
    all_ent_pos = torch.tensor([f.ent_pos for f in features], dtype=torch.long)
    all_ent_distance = torch.tensor([f.ent_distance for f in features], dtype=torch.long)
    all_structure_mask = torch.tensor([f.structure_mask for f in features], dtype=torch.bool)
    all_label = torch.tensor([f.label for f in features], dtype=torch.bool)
    all_label_mask = torch.tensor([f.label_mask for f in features], dtype=torch.bool)
    
    • 功能: 将每个特征属性转换为Tensor格式。
  8. 创建TensorDataset:

    dataset = TensorDataset(all_input_ids, all_attention_mask, all_token_type_ids,all_ent_mask, all_ent_ner, all_ent_pos, all_ent_distance,all_structure_mask, all_label, all_label_mask)
    
    • 功能: 使用上述Tensor创建一个TensorDataset对象。
  9. 返回构建的数据集:

    return dataset
    
    • 功能: 返回创建的TensorDataset对象。

以上代码实现了数据的加载、处理和转换,最终返回一个PyTorch中的TensorDataset对象,可用于模型训练、评估或预测。

dataset.py

当然,下面是带有详细中文注释的代码说明,包括输入和输出的介绍:

def norm_mask(input_mask):# 创建一个与input_mask形状相同的全零矩阵output_mask = numpy.zeros(input_mask.shape)# 遍历input_mask的每一行for i in range(len(input_mask)):# 如果当前行的所有元素不全为零if not numpy.all(input_mask[i] == 0):# 将当前行除以当前行元素之和,并将结果存储在output_mask的相应位置output_mask[i] = input_mask[i] / sum(input_mask[i])# 返回归一化后的掩码矩阵return output_mask

详细介绍每一行代码

  1. 函数定义:

    def norm_mask(input_mask):
    
    • 功能: 定义一个函数norm_mask,用于归一化输入掩码矩阵的每一行。
    • 输入: input_mask(numpy数组,形状为(m, n),每行表示一个掩码)。
    • 输出: 返回一个与输入掩码矩阵相同形状的归一化后的掩码矩阵。
  2. 创建一个与input_mask形状相同的全零矩阵:

    output_mask = numpy.zeros(input_mask.shape)
    
    • 功能: 初始化一个与input_mask形状相同的全零矩阵output_mask,用于存储归一化后的结果。
  3. 遍历input_mask的每一行:

    for i in range(len(input_mask)):
    
    • 功能: 使用for循环遍历input_mask的每一行。
  4. 检查当前行的所有元素是否不全为零:

    if not numpy.all(input_mask[i] == 0):
    
    • 功能: 使用numpy.all检查当前行的所有元素是否不全为零。如果当前行的所有元素都为零,则跳过该行。
  5. 归一化当前行并存储在output_mask的相应位置:

    output_mask[i] = input_mask[i] / sum(input_mask[i])
    
    • 功能: 将当前行的每个元素除以该行元素的总和,得到归一化后的结果,并存储在output_mask的相应位置。
  6. 返回归一化后的掩码矩阵:

    return output_mask
    
    • 功能: 返回output_mask,即归一化后的掩码矩阵。

输入和输出

  • 输入:
    • input_mask:一个形状为(m, n)的numpy数组,表示多个掩码矩阵。
  • 输出:
    • output_mask:一个形状为(m, n)的numpy数组,表示归一化后的掩码矩阵。每一行的元素之和为1(如果该行不全为零)。

示例

假设input_mask为:

input_mask = numpy.array([[1, 2, 3],[0, 0, 0],[4, 5, 6]
])

调用norm_mask函数:

output_mask = norm_mask(input_mask)

得到的output_mask为:

output_mask = numpy.array([[0.16666667, 0.33333333, 0.5       ],[0.        , 0.        , 0.        ],[0.26666667, 0.33333333, 0.4       ]
])

在上述示例中,第一行和第三行的元素被归一化为它们各自的总和,而第二行保持不变(全零)。

docred_convert_examples_to_features

def docred_convert_examples_to_features(examples,model_type,tokenizer,max_length=512,max_ent_cnt=42,label_map=None,pad_token=0,
):# 初始化存储特征的列表features = []# 命名实体识别标签映射ner_map = {'PAD':0, 'ORG':1, 'LOC':2, 'NUM':3, 'TIME':4, 'MISC':5, 'PER':6}# 初始化距离桶,用于实体间距离编码distance_buckets = numpy.zeros((512), dtype='int64')distance_buckets[1] = 1distance_buckets[2:] = 2distance_buckets[4:] = 3distance_buckets[8:] = 4distance_buckets[16:] = 5distance_buckets[32:] = 6distance_buckets[64:] = 7distance_buckets[128:] = 8distance_buckets[256:] = 9# 遍历每个样本for (ex_index, example) in enumerate(examples):len_examples = len(examples)# 每处理500个样本,打印日志信息if ex_index % 500 == 0:logger.info("Writing example %d/%d" % (ex_index, len_examples))# 初始化存储token的列表,以及token到句子和单词的映射input_tokens = []tok_to_sent = []tok_to_word = []# 遍历每个句子for sent_idx, sent in enumerate(example.sents):# 遍历句子中的每个单词for word_idx, word in enumerate(sent):tokens_tmp = tokenizer.tokenize(word, add_prefix_space=True)input_tokens += tokens_tmptok_to_sent += [sent_idx] * len(tokens_tmp)tok_to_word += [word_idx] * len(tokens_tmp)# 如果token数量小于等于最大长度减去2if len(input_tokens) <= max_length - 2:# 根据模型类型添加特殊tokenif model_type == 'roberta':input_tokens = [tokenizer.bos_token] + input_tokens + [tokenizer.eos_token]else:input_tokens = [tokenizer.cls_token] + input_tokens + [tokenizer.sep_token]tok_to_sent = [None] + tok_to_sent + [None]tok_to_word = [None] + tok_to_word + [None]input_ids = tokenizer.convert_tokens_to_ids(input_tokens)attention_mask = [1] * len(input_ids)token_type_ids = [0] * len(input_ids)# paddingpadding = [None] * (max_length - len(input_ids))tok_to_sent += paddingtok_to_word += paddingpadding = [0] * (max_length - len(input_ids))attention_mask += paddingtoken_type_ids += paddingpadding = [pad_token] * (max_length - len(input_ids))input_ids += paddingelse:# 截断超长的token序列input_tokens = input_tokens[:max_length - 2]tok_to_sent = tok_to_sent[:max_length - 2]tok_to_word = tok_to_word[:max_length - 2]# 根据模型类型添加特殊tokenif model_type == 'roberta':input_tokens = [tokenizer.bos_token] + input_tokens + [tokenizer.eos_token]else:input_tokens = [tokenizer.cls_token] + input_tokens + [tokenizer.sep_token]tok_to_sent = [None] + tok_to_sent + [None]tok_to_word = [None] + tok_to_word + [None]input_ids = tokenizer.convert_tokens_to_ids(input_tokens)attention_mask = [1] * len(input_ids)token_type_ids = [pad_token] * len(input_ids)# 实体掩码和NER / 共指特征ent_mask = numpy.zeros((max_ent_cnt, max_length), dtype='int64')ent_ner = [0] * max_lengthent_pos = [0] * max_lengthtok_to_ent = [-1] * max_lengthents = example.vertexSetfor ent_idx, ent in enumerate(ents):for mention in ent:for tok_idx in range(len(input_ids)):if tok_to_sent[tok_idx] == mention['sent_id'] and mention['pos'][0] <= tok_to_word[tok_idx] < mention['pos'][1]:ent_mask[ent_idx][tok_idx] = 1ent_ner[tok_idx] = ner_map[ent[0]['type']]ent_pos[tok_idx] = ent_idx + 1tok_to_ent[tok_idx] = ent_idx# 距离特征ent_first_appearance = [0] * max_ent_cntent_distance = numpy.zeros((max_ent_cnt, max_ent_cnt), dtype='int8')  # padding id is 10for i in range(len(ents)):if numpy.all(ent_mask[i] == 0):continueelse:ent_first_appearance[i] = numpy.where(ent_mask[i] == 1)[0][0]for i in range(len(ents)):for j in range(len(ents)):if ent_first_appearance[i] != 0 and ent_first_appearance[j] != 0:if ent_first_appearance[i] >= ent_first_appearance[j]:ent_distance[i][j] = distance_buckets[ent_first_appearance[i] - ent_first_appearance[j]]else:ent_distance[i][j] = -distance_buckets[-ent_first_appearance[i] + ent_first_appearance[j]]ent_distance += 10  # norm from [-9, 9] to [1, 19]# 结构掩码structure_mask = numpy.zeros((5, max_length, max_length), dtype='float')for i in range(max_length):if attention_mask[i] == 0:breakelse:if tok_to_ent[i] != -1:for j in range(max_length):if tok_to_sent[j] is None:continue# intraif tok_to_sent[j] == tok_to_sent[i]:# intra-corefif tok_to_ent[j] == tok_to_ent[i]:structure_mask[0][i][j] = 1# intra-relateelif tok_to_ent[j] != -1:structure_mask[1][i][j] = 1# intra-NAelse:structure_mask[2][i][j] = 1# interelse:# inter-corefif tok_to_ent[j] == tok_to_ent[i]:structure_mask[3][i][j] = 1# inter-relateelif tok_to_ent[j] != -1:structure_mask[4][i][j] = 1# 标签label_ids = numpy.zeros((max_ent_cnt, max_ent_cnt, len(label_map.keys())), dtype='bool')# 测试文件没有“labels”if example.labels is not None:labels = example.labelsfor label in labels:label_ids[label['h']][label['t']][label_map[label['r']]] = 1for h in range(len(ents)):for t in range(len(ents)):if numpy.all(label_ids[h][t] == 0):label_ids[h][t][0] = 1# 标签掩码label_mask = numpy.zeros((max_ent_cnt, max_ent_cnt), dtype='bool')label_mask[:len(ents), :len(ents)] = 1for ent in range(len(ents)):label_mask[ent][ent] = 0for ent in range(len(ents)):if numpy.all(ent_mask[ent] == 0):label_mask[ent, :] = 0label_mask[:, ent] = 0# 归一化实体掩码ent_mask = norm_mask(ent_mask)# 断言检查特征维度assert len(input_ids) == max_lengthassert len(attention_mask) == max_lengthassert len(token_type_ids) == max_lengthassert ent_mask.shape == (max_ent_cnt, max_length)assert label_ids.shape == (max_ent_cnt, max_ent_cnt, len(label_map.keys()))assert label_mask.shape == (max_ent_cnt, max_ent_cnt)assert len(ent_ner) == max_lengthassert len(ent_pos) == max_lengthassert ent_distance.shape == (max_ent_cnt, max_ent_cnt)assert structure_mask.shape == (5, max_length, max_length)# 打印日志信息if ex_index == 42:logger.info("*** Example ***")logger.info("guid: %s" % example.guid)logger.info("doc: %s" % (' '.join([' '.join(sent) for sent in example.sents])))logger.info("input_ids: %s" % (" ".join([str(x) for x in input_ids])))logger.info("attention_mask: %s" % (" ".join([str(x) for x in attention_mask])))logger.info("token_type_ids: %s" % (" ".join([str(x) for x in token_type_ids])))logger.info("ent_mask for first ent: %s" % (" ".join([str(x) for x in ent_mask[0]])))logger.info("label for ent pair 0-1: %s" % (" ".join([str(x) for x in label_ids[0][1]])))logger.info("label_mask for first ent: %s" % (" ".join([str(x) for x in label_mask[0]])))logger.info("ent_ner: %s" % (" ".join([str(x) for x in ent_ner])))logger.info("ent_pos: %s" % (" ".join([str(x) for x in ent_pos])))logger.info("ent_distance for first ent: %s" % (" ".join([str(x) for x in ent_distance[0]])))# 添加特征到列表中features.append(DocREDInputFeatures(input_ids=input_ids,attention_mask=attention_mask,token_type_ids=token_type_ids,ent_mask=ent_mask,ent_ner=ent_ner,ent_pos=ent_pos,ent_distance=ent_distance,structure_mask=structure_mask,label=label_ids,label_mask=label_mask,))return features  # 返回特征列表

下面是带有详细中文注释的代码说明,包括输入和输出的介绍:

详细介绍每一行代码

  1. 函数定义:
    def docred_convert_examples_to_features(examples,model_type,tokenizer,max_length=512,max_ent_cnt=42,label_map=None,pad_token=0,
    ):
    
    • 功能: 将DocRED样本转换为模型特征。
    • 输入:
      • examples(样本列表)
      • model_type(模型类型)
      • tokenizer(分词器)
      • max_length(最大序列长度,默认为512)
      • max_ent_cnt(最大实体数量,默认为42)
      • label_map(标签映射,默认为None)
      • pad_token(填充标记,默认为0)
    • 输出: 返回特征列表。

DocREDProcessor

下面是带有详细中文注释的代码说明,包括输入和输出的介绍:

class DocREDProcessor(object):"""Processor for the DocRED data set."""# DocRED数据集处理器类def get_example_from_tensor_dict(self, tensor_dict):"""See base class."""# 从tensor字典中创建一个DocREDExample实例return DocREDExample(tensor_dict["guid"].numpy(),  # 样本的唯一标识符tensor_dict["title"].numpy(),  # 文档标题tensor_dict["vertexSet"].numpy(),  # 实体集tensor_dict["sents"].numpy(),  # 句子tensor_dict["labels"].numpy(),  # 标签)def get_train_examples(self, data_dir):"""See base class."""# 从指定目录加载训练集样本with open(os.path.join(data_dir, "train_annotated.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'train')def get_distant_examples(self, data_dir):"""See base class."""# 从指定目录加载远程监督的训练集样本with open(os.path.join(data_dir, "train_distant.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'train')def get_dev_examples(self, data_dir):"""See base class."""# 从指定目录加载开发集样本with open(os.path.join(data_dir, "dev.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'dev')def get_test_examples(self, data_dir):"""See base class."""# 从指定目录加载测试集样本with open(os.path.join(data_dir, "test.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'test')def get_label_map(self, data_dir):"""See base class."""# 从指定目录加载标签映射with open(os.path.join(data_dir, "label_map.json"), 'r') as f:label_map = json.load(f)return label_mapdef _create_examples(self, instances, set_type):"""Creates examples for the training and dev sets."""# 创建训练和开发集的样本examples = []for (i, ins) in enumerate(instances):guid = "%s-%s" % (set_type, i)  # 生成样本的唯一标识符examples.append(DocREDExample(guid=guid,title=ins['title'],vertexSet=ins['vertexSet'],sents=ins['sents'],labels=ins['labels'] if set_type != "test" else None))return examples  # 返回创建的样本列表

详细介绍每一行代码

  1. 类定义:

    class DocREDProcessor(object):
    
    • 功能: 定义一个DocREDProcessor类,用于处理DocRED数据集。
  2. 方法get_example_from_tensor_dict:

    def get_example_from_tensor_dict(self, tensor_dict):"""See base class."""return DocREDExample(tensor_dict["guid"].numpy(),tensor_dict["title"].numpy(),tensor_dict["vertexSet"].numpy(),tensor_dict["sents"].numpy(),tensor_dict["labels"].numpy(),)
    
    • 功能: 从一个包含tensor的字典中创建一个DocREDExample实例。
    • 输入: tensor_dict(包含多个tensor的字典)。
    • 输出: 返回一个DocREDExample实例。
  3. 方法get_train_examples:

    def get_train_examples(self, data_dir):"""See base class."""with open(os.path.join(data_dir, "train_annotated.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'train')
    
    • 功能: 从指定目录加载训练集样本。
    • 输入: data_dir(数据目录)。
    • 输出: 返回训练集样本列表。
  4. 方法get_distant_examples:

    def get_distant_examples(self, data_dir):"""See base class."""with open(os.path.join(data_dir, "train_distant.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'train')
    
    • 功能: 从指定目录加载远程监督的训练集样本。
    • 输入: data_dir(数据目录)。
    • 输出: 返回远程监督的训练集样本列表。
  5. 方法get_dev_examples:

    def get_dev_examples(self, data_dir):"""See base class."""with open(os.path.join(data_dir, "dev.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'dev')
    
    • 功能: 从指定目录加载开发集样本。
    • 输入: data_dir(数据目录)。
    • 输出: 返回开发集样本列表。
  6. 方法get_test_examples:

    def get_test_examples(self, data_dir):"""See base class."""with open(os.path.join(data_dir, "test.json"), 'r') as f:examples = json.load(f)return self._create_examples(examples, 'test')
    
    • 功能: 从指定目录加载测试集样本。
    • 输入: data_dir(数据目录)。
    • 输出: 返回测试集样本列表。
  7. 方法get_label_map:

    def get_label_map(self, data_dir):"""See base class."""with open(os.path.join(data_dir, "label_map.json"), 'r') as f:label_map = json.load(f)return label_map
    
    • 功能: 从指定目录加载标签映射。
    • 输入: data_dir(数据目录)。
    • 输出: 返回标签映射。
  8. 方法_create_examples:

    def _create_examples(self, instances, set_type):"""Creates examples for the training and dev sets."""examples = []for (i, ins) in enumerate(instances):guid = "%s-%s" % (set_type, i)examples.append(DocREDExample(guid=guid,title=ins['title'],vertexSet=ins['vertexSet'],sents=ins['sents'],labels=ins['labels'] if set_type != "test" else None))return examples
    
    • 功能: 创建训练和开发集的样本。
    • 输入:
      • instances(样本实例列表)
      • set_type(数据集类型,‘train’或’dev’或’test’)
    • 输出: 返回创建的样本列表。

输入和输出

  • 方法get_example_from_tensor_dict:

    • 输入: tensor_dict(包含多个tensor的字典)。
    • 输出: 返回一个DocREDExample实例。
  • 方法get_train_examples:

    • 输入: data_dir(数据目录)。
    • 输出: 返回训练集样本列表。
  • 方法get_distant_examples:

    • 输入: data_dir(数据目录)。
    • 输出: 返回远程监督的训练集样本列表。
  • 方法get_dev_examples:

    • 输入: data_dir(数据目录)。
    • 输出: 返回开发集样本列表。
  • 方法get_test_examples:

    • 输入: data_dir(数据目录)。
    • 输出: 返回测试集样本列表。
  • 方法get_label_map:

    • 输入: data_dir(数据目录)。
    • 输出: 返回标签映射。
  • 方法_create_examples:

    • 输入:
      • instances(样本实例列表)
      • set_type(数据集类型,‘train’或’dev’或’test’)
    • 输出: 返回创建的样本列表。

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

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

相关文章

项目打包与运行

前端运行时必须有与后端相同的数据库版本&#xff0c;数据库账号密码 右侧maven -> 展开要打包的项目 -> 生命周期 -> 双击package 打包好之后在target目录下 右键打开 在资源目录下输入cmd&#xff0c;执行以下命令即可运行&#xff08;端口号为yml文件…

Redis实战篇(黑马点评)笔记总结

一、配置前后端项目的初始环境 前端&#xff1a; 对前端项目在cmd中进行start nginx.exe&#xff0c;端口号为8080 后端&#xff1a; 配置mysql数据库的url 和 redis 的url 和 导入数据库数据 二、登录校验 基于Session的实现登录&#xff08;不推荐&#xff09; &#xf…

【iOS】—— retain\release实现原理和属性关键字

【iOS】—— retain\release实现原理和属性关键字 1. retain\reelase实现原理1.1 retain实现原理1.2 release实现原理 2. 属性关键字2.1 属性关键字的分类2.2 内存管理关键字2.2.1 weak2.2.2 assgin2.3.3 strong和copy 2.4 线程安全的关键字2.5 修饰变量的关键字2.5.1常量const…

文件上传总结

一、原理 通过界面上的上传功能上传了一个可执行的脚本文件&#xff0c;而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好&#xff0c;使得恶意用户可以通过文件中上传的一句话木马获得操控权 二、绕过方法 1>前端绕过 1.删除前端校验函数 checkFile() 2.禁用js…

大数据平台之HBase

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;是Apache Hadoop生态系统的重要组成部分。它特别适合大规模结构化和半结构化数据的存储和检索&#xff0c;能够处理实时读写和批处理工作负载。以下是对HBase的详细介绍。 1. 核心概念 1.1 表&#x…

打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南

目录 一、赛前准备 1.1 报名与纪律要求 1.2 MD5码上传 1.3 竞赛准备 1.4 时间分配 二、论文格式规范 2.1 摘要 2.2 参考文献 2.3 排版要求 三、建模过程与方法 3.1 问题分析与模型假设 3.2 模型构建与求解 3.3 结果分析与检验 四、论文撰写技巧 4.1 论文结构 4…

Godot入门 07 世界构建2.0

添加基础节点Node&#xff0c;重命名为Coins&#xff0c;整理场景树&#xff0c;拖动Coin到Coins节点下。 添加基础节点Node&#xff0c;重命名为Platforms&#xff0c;整理场景树&#xff0c;拖动Platform到Platforms节点下。 添加游戏背景 设置当前图层名称为Mid 添加图层元…

一阶系统和二阶系统

一阶系统和二阶系统是动态系统分析中的两个基本概念&#xff0c;它们的主要区别在于系统的响应特性、阶次以及对输入信号的处理方式&#xff1a; 1. **阶数**&#xff1a; - **一阶系统**&#xff1a;这类系统只有一个积分项&#xff0c;如常微分方程中的形式为 dy/dt k*x…

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情

一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接&#xff1a;https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码&#xff1a;Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…

vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。

1、上个图&#xff0c;要实现这样的&#xff1a; Vxe Table v4.6 官方文档 2、使用 row-config.isCurrent 显示高亮行&#xff0c;当前行是唯一的&#xff1b;用户操作点击选项时会触发事件 current-change <template><div><p><vxe-button click"sel…

C++入门基础(超详细) 需:C语言基础

1.C的发展史 大致了解一下 C的起源可以追溯到1979年&#xff0c;当时BjarneStroustrup(本贾尼斯特劳斯特卢普&#xff0c;这个翻译的名字不 同的地方可能有差异)在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开 发任务&#xff0c;特别是模拟和操作系…

Microsoft SEAL迭代器(iterator)分析

安全之安全(security)博客目录导读 目录 par PolyIter, RNSIter 和 CoeffIter par PtrIter 和 StrideIter par IterTuple par 常见的 PtrIter 类型的别名 par 创建 SEAL 迭代器 par 使用 ReverseIter 反转方向 par SEAL_ITERATE par 编码约定 par 常见函数的迭代器重…

动态接口调优:在Mojo模型中调整模型的输入输出接口

动态接口调优&#xff1a;在Mojo模型中调整模型的输入输出接口 在机器学习领域&#xff0c;Mojo模型通常指代一个经过训练、准备部署的模型。模型的输入输出接口&#xff08;I/O&#xff09;是模型与外界交互的桥梁&#xff0c;其设计直接影响到模型的可用性和灵活性。本文将探…

Linux权限维持篇

目录 SSH后门 &#xff08;1&#xff09;软链接sshd &#xff08;2&#xff09;SSH Key 生成公私钥 创建个authorized_keys文件来保存公钥 通过修改文件时间来隐藏authorized_keys &#xff08;3&#xff09;SSH Keylogger&#xff08;记录日志&#xff09; Linux的PA…

【Go系列】Go的UI框架Fyne

前言 总有人说Go语言是一门后端编程语言。 Go虽然能够很好地处理后端开发&#xff0c;但是者不代表它没有UI库&#xff0c;不能做GUI&#xff0c;我们一起来看看Go怎么来画UI吧。 正文 Go语言由于其简洁的语法、高效的性能和跨平台的编译能力&#xff0c;非常适合用于开发GUI…

MICA:面向复杂嵌入式系统的混合关键性部署框架

背景 在嵌入式场景中&#xff0c;虽然 Linux 已经得到了广泛应用&#xff0c;但并不能覆盖所有需求&#xff0c;例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统的用武之地。有些应用场景既需要 Linux 的管理能力、丰富的生态&#xff0c;又需要实时操作系统的高…

vue中scoped详解以及样式穿透>>>、/deep/、::v-deep

1、scoped scoped属性用于限制样式仅应用于当前组件。当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染。 原理&#xff1a;当样式中加了scoped属性时候&#xff0c;编译的…

数据库解析一维和二维简易JSON,

项目还在使用Oracle11&#xff0c;不支持后续官方的json解析方式&#xff0c; 在 前年、去年、今年 接连 遇到json解析问题后&#xff08;其实是公司的轮子效率太慢&#xff0c;太复杂&#xff0c;决定自己造个轮子&#xff0c;看看到底为什么慢&#xff0c;是不是真的很复杂&a…

【最新】cudnn安装教程

最近换了新电脑需要重新安装cuda和cudnn&#xff0c;发现现在cudnn的安装比以前方便多了&#xff0c;直接在官网下载exe安装包一键运行即可。安装的时候注意cuda和cudnn的对应关系即可&#xff1a;【最新】cuda和cudnn和显卡驱动的对应关系-CSDN博客 访问cudnn下载链接cuDNN 9…

Git 基础 GitHub【学习笔记】

一、Git 优势 大部分操作在本地完成&#xff0c;不需要联网完整性保证尽可能添加数据而不是删除或修改数据分支操作非常快捷流畅与 Linux 命令全面兼容 二、Git 程序安装 https://git-scm.com 三、Git 结构 #mermaid-svg-9Go6R1leWXWrDCqn {font-family:"trebuchet ms&quo…