深度学习-----------------机器翻译与数据集

news2024/10/4 9:40:18

目录

  • 机器翻译与数据集
    • 下载和预处理数据集
    • 预处理步骤
    • 词元化
    • 词汇表
      • 该部分总代码
    • 固定长度阶段或填充
      • 该部分总代码
    • 转换成小批量数据集用于训练
    • 训练模型
    • 总代码

机器翻译与数据集

import os
import torch
from d2l import torch as d2l



下载和预处理数据集

#@save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')

#@save
def read_data_nmt():
    """载入“英语-法语”数据集"""
    data_dir = d2l.download_extract('fra-eng')
    with open(os.path.join(data_dir, 'fra.txt'), 'r',
             encoding='utf-8') as f:
        return f.read()

raw_text = read_data_nmt()
print(raw_text[:75])

在这里插入图片描述




预处理步骤

import os
import torch
from d2l import torch as d2l

# 下载和预处理数据集
# 将数据集的下载链接和校验码与'fra-eng'标识关联起来
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


def read_data_nmt():
    """载入 “英语-法语” 数据集 """
    # 下载并解压数据集
    data_dir = d2l.download_extract('fra-eng')
    # 读取数据并返回
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()


# 几个预处理步骤
def preprocess_nmt(text):
    """预处理 “英语-法语” 数据集"""

    # 判断字符是否是特定标点符号并且前一个字符不是空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 替换特殊字符为空格,转换为小写
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    out = [
        # 对于每个字符,如果它的索引大于0(即不是第一个字符),并且满足 no_space 函数的条件,则在该字符前添加一个空格,否则,直接使用该字符。
        ' ' + char if i > 0 and no_space(char, text[i - 1]) else char
        # (enumerate 函数将字符串 text 中的每个字符及其索引打包成元组i为下标、char为字符)
        for i, char in enumerate(text)
    ]
    return ''.join(out)  # 将处理后的字符列表转换为字符串


# 调用函数读取数据集
raw_text = read_data_nmt()
# 调用预处理函数处理原始文本
text = preprocess_nmt(raw_text)
# 打印处理后的文本的前80个字符
print(text[:75])

在这里插入图片描述




词元化

import os
from d2l import torch as d2l

# 下载和预处理数据集
# 将数据集的下载链接和校验码与'fra-eng'标识关联起来
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


def read_data_nmt():
    """载入 “英语-法语” 数据集 """
    # 下载并解压数据集
    data_dir = d2l.download_extract('fra-eng')
    # 读取数据并返回
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()


# 几个预处理步骤
def preprocess_nmt(text):
    """预处理 “英语-法语” 数据集"""

    # 判断字符是否是特定标点符号并且前一个字符不是空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 替换特殊字符为空格,转换为小写
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    out = [
        # 对于每个字符,如果它的索引大于0(即不是第一个字符),并且满足 no_space 函数的条件,则在该字符前添加一个空格,否则,直接使用该字符。
        ' ' + char if i > 0 and no_space(char, text[i - 1]) else char
        # (enumerate 函数将字符串 text 中的每个字符及其索引打包成元组i为下标、char为字符)
        for i, char in enumerate(text)
    ]
    return ''.join(out)  # 将处理后的字符列表转换为字符串


# 指定处理的示例数量。如果为 None,则处理所有行。
def tokenize_nmt(text, num_examples=None):
    """词元化 “英语-法语” 数据数据集 """
    # 存储英语和法语的词元序列
    source, target = [], []
    # 将每一行及其索引打包成元组 (i, line)
    for i, line in enumerate(text.split('\n')):
        # 如果指定了num_examples且当前行索引i大于num_examples,则结束循环
        if num_examples and i > num_examples:
            break
        # 按制表符分割行
        parts = line.split('\t')
        # 如果行中包含了两个部分
        if len(parts) == 2:
            # 将英语部分按空格分割为词元,并添加到source列表
            source.append(parts[0].split(' '))  # 英语
            # 将法语部分按空格分割为词元,并添加到target列表
            target.append(parts[1].split(' '))  # 法语
    return source, target


# 调用函数读取数据集
raw_text = read_data_nmt()
# 调用预处理函数处理原始文本
text = preprocess_nmt(raw_text)

# 调用函数词元化文本
source, target = tokenize_nmt(text)
# 打印source和target的前6个词元序列
print(source[:6])
print(target[:6])

在这里插入图片描述




绘制每个文本序列所包含的标记数量的直方图。

import os
import torch
from d2l import torch as d2l

# 下载和预处理数据集
# 将数据集的下载链接和校验码与'fra-eng'标识关联起来
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


def read_data_nmt():
    """载入 “英语-法语” 数据集 """
    # 下载并解压数据集
    data_dir = d2l.download_extract('fra-eng')
    # 读取数据并返回
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()


# 几个预处理步骤
def preprocess_nmt(text):
    """预处理 “英语-法语” 数据集"""

    # 判断字符是否是特定标点符号并且前一个字符不是空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 替换特殊字符为空格,转换为小写
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    out = [
        # 对于每个字符,如果它的索引大于0(即不是第一个字符),并且满足 no_space 函数的条件,则在该字符前添加一个空格,否则,直接使用该字符。
        ' ' + char if i > 0 and no_space(char, text[i - 1]) else char
        # (enumerate 函数将字符串 text 中的每个字符及其索引打包成元组i为下标、char为字符)
        for i, char in enumerate(text)
    ]
    return ''.join(out)  # 将处理后的字符列表转换为字符串


# 指定处理的示例数量。如果为 None,则处理所有行。
def tokenize_nmt(text, num_examples=None):
    """词元化 “英语-法语” 数据数据集 """
    # 存储英语和法语的词元序列
    source, target = [], []
    # 将每一行及其索引打包成元组 (i, line)
    for i, line in enumerate(text.split('\n')):
        # 如果指定了num_examples且当前行索引i大于num_examples,则结束循环
        if num_examples and i > num_examples:
            break
        # 按制表符分割行
        parts = line.split('\t')
        # 如果行中包含了两个部分
        if len(parts) == 2:
            # 将英语部分按空格分割为词元,并添加到source列表
            source.append(parts[0].split(' '))  # 英语
            # 将法语部分按空格分割为词元,并添加到target列表
            target.append(parts[1].split(' '))  # 法语
    return source, target


# 调用函数读取数据集
raw_text = read_data_nmt()
# 调用预处理函数处理原始文本
text = preprocess_nmt(raw_text)

# 调用函数词元化文本
source, target = tokenize_nmt(text)
# 设置图形大小
d2l.set_figsize()
# 绘制每个文本序列所包含的标记数量的直方图,根据句子长度做的直方图
_, _, patches = d2l.plt.hist([[len(l)
                              for l in source], [len(l) for l in target]],
                            label = ['source','target']) # 添加标签
# 遍历第二个直方图的每个矩形
for patch in patches[1].patches:
    # 设置矩形的填充样式为斜线
    patch.set_hatch('/')
# 添加图例,位于右上角
d2l.plt.legend(loc='upper right')
d2l.plt.show()


在这里插入图片描述




词汇表

# 创建源语言的词汇表对象
src_vocab = d2l.Vocab(source, min_freq=2,
                      reserved_tokens=['<pad>', '<bos>', '<eos>'])  # pad表示句子的填充,bos 表示句子开始,eos表示句子结束,min_freq=2表示句子长度小于2个就不要了
# 计算词汇表的大小
print(len(src_vocab))

在这里插入图片描述


该部分总代码

import os
import torch
from d2l import torch as d2l

# 下载和预处理数据集
# 将数据集的下载链接和校验码与'fra-eng'标识关联起来
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


def read_data_nmt():
    """载入 “英语-法语” 数据集 """
    # 下载并解压数据集
    data_dir = d2l.download_extract('fra-eng')
    # 读取数据并返回
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()


# 几个预处理步骤
def preprocess_nmt(text):
    """预处理 “英语-法语” 数据集"""

    # 判断字符是否是特定标点符号并且前一个字符不是空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 替换特殊字符为空格,转换为小写
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    out = [
        # 对于每个字符,如果它的索引大于0(即不是第一个字符),并且满足 no_space 函数的条件,则在该字符前添加一个空格,否则,直接使用该字符。
        ' ' + char if i > 0 and no_space(char, text[i - 1]) else char
        # (enumerate 函数将字符串 text 中的每个字符及其索引打包成元组i为下标、char为字符)
        for i, char in enumerate(text)
    ]
    return ''.join(out)  # 将处理后的字符列表转换为字符串


# 指定处理的示例数量。如果为 None,则处理所有行。
def tokenize_nmt(text, num_examples=None):
    """词元化 “英语-法语” 数据数据集 """
    # 存储英语和法语的词元序列
    source, target = [], []
    # 将每一行及其索引打包成元组 (i, line)
    for i, line in enumerate(text.split('\n')):
        # 如果指定了num_examples且当前行索引i大于num_examples,则结束循环
        if num_examples and i > num_examples:
            break
        # 按制表符分割行
        parts = line.split('\t')
        # 如果行中包含了两个部分
        if len(parts) == 2:
            # 将英语部分按空格分割为词元,并添加到source列表
            source.append(parts[0].split(' '))  # 英语
            # 将法语部分按空格分割为词元,并添加到target列表
            target.append(parts[1].split(' '))  # 法语
    return source, target


# 调用函数读取数据集
raw_text = read_data_nmt()
# 调用预处理函数处理原始文本
text = preprocess_nmt(raw_text)

# 调用函数词元化文本
source, target = tokenize_nmt(text)
# 创建源语言的词汇表对象
src_vocab = d2l.Vocab(source, min_freq=2,
                      reserved_tokens=['<pad>', '<bos>', '<eos>'])  # pad表示句子的填充,bos 表示句子开始,eos表示句子结束,min_freq=2表示句子长度小于2个就不要了
# 计算词汇表的大小
print(len(src_vocab))



固定长度阶段或填充

序列样本都有一个固定的长度截断填充文本序列

# 序列样本都有一个固定长度截断或填充文本序列
def truncate_pad(line, num_steps, padding_token):
    """截断或填充文本序列"""
    # 如果文本序列长度超过了指定的长度
    if len(line) > num_steps:
        # 截断文本序列,取前num_steps个词元
        return line[:num_steps]
    # 填充文本序列,添加padding_token直到长度达到num_steps
    return line + [padding_token] * (num_steps - len(line))
# 对源语言的第一个文本序列进行截断或填充
print(truncate_pad(src_vocab[source[0]], 10, src_vocab['<pad>']))



该部分总代码

import os
import torch
from d2l import torch as d2l

# 下载和预处理数据集
# 将数据集的下载链接和校验码与'fra-eng'标识关联起来
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


def read_data_nmt():
    """载入 “英语-法语” 数据集 """
    # 下载并解压数据集
    data_dir = d2l.download_extract('fra-eng')
    # 读取数据并返回
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()


# 几个预处理步骤
def preprocess_nmt(text):
    """预处理 “英语-法语” 数据集"""

    # 判断字符是否是特定标点符号并且前一个字符不是空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 替换特殊字符为空格,转换为小写
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    out = [
        # 对于每个字符,如果它的索引大于0(即不是第一个字符),并且满足 no_space 函数的条件,则在该字符前添加一个空格,否则,直接使用该字符。
        ' ' + char if i > 0 and no_space(char, text[i - 1]) else char
        # (enumerate 函数将字符串 text 中的每个字符及其索引打包成元组i为下标、char为字符)
        for i, char in enumerate(text)
    ]
    return ''.join(out)  # 将处理后的字符列表转换为字符串


# 指定处理的示例数量。如果为 None,则处理所有行。
def tokenize_nmt(text, num_examples=None):
    """词元化 “英语-法语” 数据数据集 """
    # 存储英语和法语的词元序列
    source, target = [], []
    # 将每一行及其索引打包成元组 (i, line)
    for i, line in enumerate(text.split('\n')):
        # 如果指定了num_examples且当前行索引i大于num_examples,则结束循环
        if num_examples and i > num_examples:
            break
        # 按制表符分割行
        parts = line.split('\t')
        # 如果行中包含了两个部分
        if len(parts) == 2:
            # 将英语部分按空格分割为词元,并添加到source列表
            source.append(parts[0].split(' '))  # 英语
            # 将法语部分按空格分割为词元,并添加到target列表
            target.append(parts[1].split(' '))  # 法语
    return source, target

# 序列样本都有一个固定长度截断或填充文本序列
def truncate_pad(line, num_steps, padding_token):
    """截断或填充文本序列"""
    # 如果文本序列长度超过了指定的长度
    if len(line) > num_steps:
        # 截断文本序列,取前num_steps个词元
        return line[:num_steps]
    # 填充文本序列,添加padding_token直到长度达到num_steps
    return line + [padding_token] * (num_steps - len(line))


# 调用函数读取数据集
raw_text = read_data_nmt()
# 调用预处理函数处理原始文本
text = preprocess_nmt(raw_text)

# 调用函数词元化文本
source, target = tokenize_nmt(text)
# 创建源语言的词汇表对象
src_vocab = d2l.Vocab(source, min_freq=2,
                      reserved_tokens=['<pad>', '<bos>', '<eos>'])  # pad表示句子的填充,bos 表示句子开始,eos表示句子结束,min_freq=2表示句子长度小于2个就不要了
# 对源语言的第一个文本序列进行截断或填充
print(truncate_pad(src_vocab[source[0]], 10, src_vocab['<pad>']))



转换成小批量数据集用于训练

def build_array_nmt(lines, vocab, num_steps):
    """将机器翻译的文本序列转换成小批量"""
    # 遍历lines中的每个句子(每个句子是一个词元列表),并将每个词元通过vocab字典转换成对应的索引值,从而得到一个由索引列表组成的列表。
    lines = [vocab[l] for l in lines]
    print(lines)
    print('<eos>')
    # 每个句子后面加一个截止符'<eos>'
    lines = [l + [vocab['<eos>']] for l in lines]
    # 构建小批量数据集的张量表示,将索引列表转换成为PyTorch张量array
    array = torch.tensor([truncate_pad(l, num_steps, vocab['<pad>']) for l in lines])
    # sum(1)沿着第一个维度(即每个句子的长度方向)求和,得到每个句子的实际长度
    valid_len = (array != vocab['<pad>']).type(torch.int32).sum(1)
    # 返回小批量数据集的张量表示和实际长度
    return array, valid_len  # valid_len 为原始句子的实际长度v

示例:

在这里插入图片描述

# 使用列表推导式更新 lines
lines = [[vocab[l] for l in sentence] for sentence in lines]

print(lines)  # 输出: [[1, 2], [3, 4, 5]]

在这里插入图片描述


训练模型

def load_data_nmt(batch_size, num_steps, num_examples=600):
    """返回翻译数据集的迭代器和词汇表"""
    # 预处理原始数据集
    text = preprocess_nmt(read_data_nmt())
    # 对预处理后的文本进行词元化
    source, target = tokenize_nmt(text, num_examples)
    # 创建源语言词汇表对象
    src_vocab = d2l.Vocab(source, min_freq=2,
                          reserved_tokens=['<pad>', '<bos>', '<eos>'])
    # 创建目标语言词汇表对象
    tgt_vocab = d2l.Vocab(target, min_freq=2,
                          reserved_tokens=['<pad>', '<bos>', '<eos>'])
    # 将源语言文本序列转换为小批量数据集的张量表示和实际长度
    src_array, src_valid_len = build_array_nmt(source, src_vocab, num_steps)
    # 将目标语言文本序列转换为小批量数据集的张量表示和实际长度
    tgt_array, tgt_valid_len = build_array_nmt(target, tgt_vocab, num_steps)
    # 构建数据集的张量表示和实际长度的元组
    data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)
    # 加载数据集并创建迭代器
    data_iter = d2l.load_array(data_arrays, batch_size)
    # 返回数据迭代器和源语言、目标语言的词汇表对象
    return data_iter, src_vocab, tgt_vocab

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



总代码

import os
import torch
from d2l import torch as d2l

# 下载和预处理数据集
# 将数据集的下载链接和校验码与'fra-eng'标识关联起来
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


def read_data_nmt():
    """载入 “英语-法语” 数据集 """
    # 下载并解压数据集
    data_dir = d2l.download_extract('fra-eng')
    # 读取数据并返回
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()


# 几个预处理步骤
def preprocess_nmt(text):
    """预处理 “英语-法语” 数据集"""

    # 判断字符是否是特定标点符号并且前一个字符不是空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 替换特殊字符为空格,转换为小写
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    out = [
        # 对于每个字符,如果它的索引大于0(即不是第一个字符),并且满足 no_space 函数的条件,则在该字符前添加一个空格,否则,直接使用该字符。
        ' ' + char if i > 0 and no_space(char, text[i - 1]) else char
        # (enumerate 函数将字符串 text 中的每个字符及其索引打包成元组i为下标、char为字符)
        for i, char in enumerate(text)
    ]
    return ''.join(out)  # 将处理后的字符列表转换为字符串


# 指定处理的示例数量。如果为 None,则处理所有行。
def tokenize_nmt(text, num_examples=None):
    """词元化 “英语-法语” 数据数据集 """
    # 存储英语和法语的词元序列
    source, target = [], []
    # 将每一行及其索引打包成元组 (i, line)
    for i, line in enumerate(text.split('\n')):
        # 如果指定了num_examples且当前行索引i大于num_examples,则结束循环
        if num_examples and i > num_examples:
            break
        # 按制表符分割行
        parts = line.split('\t')
        # 如果行中包含了两个部分
        if len(parts) == 2:
            # 将英语部分按空格分割为词元,并添加到source列表
            source.append(parts[0].split(' '))  # 英语
            # 将法语部分按空格分割为词元,并添加到target列表
            target.append(parts[1].split(' '))  # 法语
    return source, target


# 序列样本都有一个固定长度截断或填充文本序列
def truncate_pad(line, num_steps, padding_token):
    """截断或填充文本序列"""
    # 如果文本序列长度超过了指定的长度
    if len(line) > num_steps:
        # 截断文本序列,取前num_steps个词元
        return line[:num_steps]
    # 填充文本序列,添加padding_token直到长度达到num_steps
    return line + [padding_token] * (num_steps - len(line))


# 转换成小批量数据集用于训练
def build_array_nmt(lines, vocab, num_steps):
    """将机器翻译的文本序列转换成小批量"""
    # 遍历lines中的每个句子(每个句子是一个词元列表),并将每个词元通过vocab字典转换成对应的索引值,从而得到一个由索引列表组成的列表。
    lines = [vocab[l] for l in lines]
    # 每个句子后面加一个截止符'<eos>'
    lines = [l + [vocab['<eos>']] for l in lines]
    # 构建小批量数据集的张量表示,将索引列表转换成为PyTorch张量array
    array = torch.tensor([truncate_pad(l, num_steps, vocab['<pad>']) for l in lines])
    # sum(1)沿着第一个维度(即每个句子的长度方向)求和,得到每个句子的实际长度
    valid_len = (array != vocab['<pad>']).type(torch.int32).sum(1)
    # 返回小批量数据集的张量表示和实际长度
    return array, valid_len  # valid_len 为原始句子的实际长度


# 训练模型
def load_data_nmt(batch_size, num_steps, num_examples=600):
    """返回翻译数据集的迭代器和词汇表"""
    # 预处理原始数据集
    text = preprocess_nmt(read_data_nmt())
    # 对预处理后的文本进行词元化
    source, target = tokenize_nmt(text, num_examples)
    # 创建源语言词汇表对象
    src_vocab = d2l.Vocab(source, min_freq=2,
                          reserved_tokens=['<pad>', '<bos>', '<eos>'])
    # 创建目标语言词汇表对象
    tgt_vocab = d2l.Vocab(target, min_freq=2,
                          reserved_tokens=['<pad>', '<bos>', '<eos>'])
    # 将源语言文本序列转换为小批量数据集的张量表示和实际长度
    src_array, src_valid_len = build_array_nmt(source, src_vocab, num_steps)
    # 将目标语言文本序列转换为小批量数据集的张量表示和实际长度
    tgt_array, tgt_valid_len = build_array_nmt(target, tgt_vocab, num_steps)
    # 构建数据集的张量表示和实际长度的元组
    data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)
    # 加载数据集并创建迭代器
    data_iter = d2l.load_array(data_arrays, batch_size)
    # 返回数据迭代器和源语言、目标语言的词汇表对象
    return data_iter, src_vocab, tgt_vocab


# 读出 “英语-法语” 数据集中第一个小批量数据
# 加载翻译数据集的迭代器和词汇表,设置每个小批量的大小和序列长度
train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
# 遍历数据迭代器,获取每个小批量的数据和有效长度
# X是英语、Y是法语
for X, X_valid_len, Y, Y_valid_len in train_iter:
    # 打印源语言序列的张量表示(整数类型)
    print('X:', X.type(torch.int32))
    # 打印源语言序列的有效长度
    print('valid lengths for X:', X_valid_len)
    # 打印目标语言序列的张量表示(整数类型)
    print('Y:', Y.type(torch.int32))
    # 打印目标语言序列的有效长度
    print('valid lengths for Y:', Y_valid_len)
    # 跳出循环,只打印第一个小批量数据
    break

在这里插入图片描述

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

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

相关文章

被字节恶心到了

字节 日常逛 xhs 看到一篇吐槽贴&#xff0c;表示被公司恶心到了&#xff1a; 这位网友表示&#xff0c;最近是公司举办了 Q2 和 H1 的优秀员工表彰&#xff0c;自己的 1&#xff08;直属领导&#xff09;评上了&#xff0c;但仔细一看&#xff0c;1 获奖的所有产出都是自己的&…

sql注入第7关(学习记录)

看到这里好像和前面的不一样了&#xff0c;多了个use outfile 先输入个符号&#xff0c;看报错&#xff0c;还是得看别人的教程&#xff0c;通过查找&#xff0c;好像要通过图片来进行注入&#xff0c;ok呀&#xff0c;又是新的方式&#xff0c; 首先我们需要知道他的闭合方式…

uniapp+Android智慧居家养老服务平台 0fjae微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 老年人 登…

算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测

&#x1f525; 内容介绍 近年来&#xff0c;随着大数据时代的到来和计算能力的飞速提升&#xff0c;对复杂系统进行精确预测的需求日益增长。多变量时间序列预测作为一项关键技术&#xff0c;广泛应用于金融、能源、交通等诸多领域。传统的预测方法&#xff0c;例如ARIMA和多元…

Prometheus Metrics和PromQL的使用

Metrics 官方解释是 Metrics are numerical measurements in layperson terms. (通俗地讲&#xff0c;Metrics就是数字测量) Prometheus fundamentally stores all data as time series &#xff08;Prometheus把所有数据都存储为时间序列&#xff09; Every time series is u…

《PMI-PBA认证与商业分析实战精析》第6章 跟踪与监督

第6章 跟踪与监督 本章主要内容包括&#xff1a; 跟踪 关系与依赖性 批准需求 基线化已批准需求 使用跟踪矩阵来监督需求 需求生命周期 管理需求变更 本章涵盖的考试重点&#xff1a; 跟踪与监督的六项活动 跟踪与监督六项活动的可交付成果及活动间的关系 跟踪的定义…

指南:Linux常用的操作命令!!!

引言: 操作系统是软件的一类。 主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁。 尽管图形化是大多数人使用计算机的第一选择&#xff0c;但是在Linux操作系统上多数都是使用的&#xff1a;命令行在开发中&#xff0c;使用命令行形式&#xff0c…

【有啥问啥】联邦学习(Federated Learning, FL):保护隐私的分布式机器学习

联邦学习&#xff08;Federated Learning, FL&#xff09;&#xff1a;保护隐私的分布式机器学习 联邦学习&#xff08;Federated Learning, FL&#xff09;作为一种前沿的分布式机器学习技术&#xff0c;正逐步成为解决数据隐私保护与模型性能提升之间矛盾的关键方案。以下是…

HTTP Cookie与Session

目录 一. 引入Cookie 1.1 定义 1.2 工作原理 1.3 分类 二. 认识Cookie 三. 测试Cookie 五. 引入Session 六. 测试Session 这篇博客&#xff0c;我们来看看Cookie与Session&#xff0c;内容干货满满。 一. 引入Cookie 1.1 定义 HTTP Cookie&…

幂等性及技术解决方案

目录 定义幂等性 为什么需要幂等性幂等性设计注意事项幂等性的范围分布式锁解决幂等性 设计 延伸阅读 定义幂等性 简单地说&#xff0c;我们可以多次执行幂等运算而不改变结果或者使用相同的输入参数中被调用多次&#xff0c;则不具有额外效果的操作&#xff0c;也就是多次执…

使用pytdx获取历史股票行情

使用pytdx获取历史股票行情 先看效果pytdx基础获取历史股票行情将历史数据存入数据库 先看效果 获取从2010年01月01日-2024年09月30日的股票数据 pytdx基础 https://blog.csdn.net/firexiaHouse/article/details/142687052?spm1001.2014.3001.5501 获取历史股票行情 def …

C++11--智能指针

引入 为什么需要智能指针&#xff1f; 在介绍异常时&#xff0c;遇到以下场景&#xff0c;处理异常就会比较棘手&#xff1a; void Func() {int* arr1 new int[10];int* arr2 new int[20];int* arr3 new int[30];// ...delete[] arr1;delete[] arr2;delete[] arr3; }这里…

一文吃透 SpringBoot (从入门到精通)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作&#xff0c;从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

【IPv6】IPv6地址格式及地址分类(组播、单播、任播)整理

IPv6地址格式 IPv6 地址从 IPv4 地址的 32 bits 扩展到 128 bits&#xff0c;IPv6 地址的表示、书写方式也从 IPv4 的点分十进制&#xff0c;修改16进制的冒号分割 IPv4 点分格式(.) 192.168.11.11 IPv6 冒号分割(:) 2408:8459:3032:0000:0000:0000:0001:a9fd IPv6 的规范…

平面电磁波的电场能量磁场能量密度相等,注意电场能量公式也没有复数形式(和坡印廷类似)

1、电场能量密度和磁场能量密度相等(实数场算的) 下面是电场能量密度和磁场能量密度的公式&#xff0c;注意这可不是坡印廷定理。且电场能量密度没有复数表达式&#xff0c;即不是把E和D换成复数形式就行的。注意&#xff0c;一个矢量可以转化为复数形式&#xff0c;两个矢量做…

6.4 数据处理架构模式和实践

6.4 数据处理架构模式和实践 目录概述需求&#xff1a; 设计思路实现思路分析1.批处理架构2.实时处理架构3.流处理架构4.微服务架构&#xff08;重点&#xff09;5.数据湖架构6.数据仓库架构 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , s…

Java | Leetcode Java题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution {public int findMinArrowShots(int[][] points) {if (points.length 0) {return 0;}Arrays.sort(points, new Comparator<int[]>() {public int compare(int[] point1, int[] point2) {if (point1[1] > point2[1…

微软官网列出了 Windows 11 LTSC 2024 中的全部新功能

今天早些时候&#xff0c;微软发布了有关受托管PC的Windows 11 24H2 升级和兼容性的详细信息。 该帖子针对的是负责在各自办公室和组织中处理系统的 IT 系统管理员。与此同时&#xff0c;微软也发布了有关 Windows 11 LTSC 或长期服务渠道的信息。 该公司已于四月早些时候证实…

yolov10+strongsort的目标跟踪实现

此次yolov10deepsort不论是准确率还是稳定性&#xff0c;再次超越了之前的yolodeepsort系列。 yolov10介绍——实时端到端物体检测 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上&#xff0c;引入了一种新的实时目标检测…