当前位置: 首页 > news >正文

NLP基础1

NLP基础1

深度学习中的NLP的特征输入

1.稠密编码(特征嵌入)

稠密编码(Dense Encoding):指将离散或者高纬的稀疏数据转化为低纬度的连续、密集向量表示

特征嵌入(Feature Embedding)

​ 也称为词嵌入,是稠密编码的一种表现形式,单词映射到一个低维的连续向量空间来表示单词,这些向量通常具有较低的维度,并且每个维度上的值是连续的浮点数。这种表示方法能够捕捉单词之间的语义和句法关系,并且在计算上更高效。

稠密编码的主要特点:

  1. 低维表示
    • 稠密编码将高维的稀疏向量(如 one-hot 编码)映射到低维的密集向量。这样可以减少计算复杂度,并且更好地捕捉词与词之间的关系。
  2. 语义信息
    • 稠密编码能够捕捉单词之间的语义关系。例如,“king” 和 “queen” 在向量空间中可能会非常接近(欧氏距离或余弦相似度),因为它们有相似的语义角色。
  3. 上下文依赖
    • 稠密编码通常是基于上下文生成的。不同的上下文可能会导致同一个单词有不同的向量表示。例如,“bank” 在金融上下文中和在河流上下文中会有不同的向量表示。
  4. 可微学习
    • 嵌入表示通常通过神经网络进行学习,并且通过反向传播算法进行优化。

2.词嵌入算法

2.1 Embedding Layer

嵌入层(Embedding Layer)是深度学习中用于将离散的、高维的稀疏表示(如 one-hot 编码)转换为低维的密集向量表示的一种神经网络层。这种转换能够捕捉到输入数据中的语义信息,并且在计算上更加高效。嵌入层通常用于处理文本数据,例如单词或字符。

嵌入层的主要特点

  1. 低维表示
    • 将高维的稀疏向量(如 one-hot 编码)映射到低维的密集向量空间。例如,一个词汇表大小为 10,000 的 one-hot 编码可以被映射到 100 维的密集向量。
  2. 参数学习
    • 嵌入层的权重是通过训练过程自动学习的。这些权重矩阵存储了每个输入项(如单词)的向量表示。
  3. 语义信息
    • 通过训练,嵌入层能够捕捉到输入项之间的语义关系。例如,在词嵌入中,相似的单词在向量空间中会非常接近。
  4. 灵活性
    • 嵌入层可以应用于多种类型的输入,包括单词、字符、用户 ID 等。

词嵌入层的使用:

nn.Embedding(num_embeddings=10, embedding_dim=4)

参数:

  1. num_embeddings 表示词的数量
  2. embedding_dim 表示用多少维的向量来表示每个词

尝试搭建NNLM语言模型

import torch
import torch.nn as nn
import torch.optim as optim
import jieba
import recorpus = ["床前明月光,疑是地上霜。举头望明月,低头思故乡。","春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。","千山鸟飞绝,万径人踪灭。孤舟蓑笠翁,独钓寒江雪。","白日依山尽,黄河入海流。欲穷千里目,更上一层楼。","茫茫烟水上,日暮阴云飞。孤坐正愁绪,湖南谁捣衣。","国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。","烽火连三月,家书抵万金。白头搔更短,浑欲不胜簪。","人闲桂花落,夜静春山空。月出惊山鸟,时鸣春涧中。"
]def remove_punctuation(tokens):return [token for token in tokens if not re.match(r'[,。!?、;:“”‘’()《》〈〉【】〔〕…—~·]', token)]sentences = [jieba.lcut(sen) for sen in corpus]
# print(sentences)sentences = [remove_punctuation(sentence) for sentence in sentences]# 创建词表和对应的映射关系
word_list = [word for sentence in sentences for word in sentence]
# 去重
word_list = list(set(word_list))
# print(word_list)
word_dict = {w: i for i, w in enumerate(word_list)}
number_dict = {i: w for i, w in enumerate(word_list)}
# 词表大小
n_class = len(word_dict)
# print(n_class)# 设置超参数
m_dim = 2  # 嵌入向量的维度
n_hidden = 10  # 神经元数量
n_step = 1  # 输入步长数
max_lens = 1  # 最大长度# 创建输入的样本和目标值
def make_batch(sentences, max_lens, word_dict):input_batch = []target_batch = []for sentence in sentences:if len(sentence) < n_step + 1:continuefor i in range(len(sentence) - n_step):input = [word_dict[word] for word in sentence[i:i+n_step]]target = word_dict[sentence[i+n_step]]# 填充或者裁剪确保长度等于max_lensinput += [0] * (max_lens - len(input))input = input[:max_lens]input_batch.append(input)target_batch.append(target)return torch.LongTensor(input_batch), torch.LongTensor(target_batch)class NNLM(nn.Module):def __init__(self, n_step, n_class, m_dim, n_hidden):super(NNLM, self).__init__()# 定义嵌入层,单词索引映射为嵌入向量self.embed = nn.Embedding(n_class, m_dim)  # 产出为每一个词的向量,为1 x m_dim的# 隐藏层,输入为两个词,所以采用m_dim*n_stepself.linear1 = nn.Linear(m_dim*n_step, n_hidden)# 分类类别就是词表大小self.linear2 = nn.Linear(n_hidden, n_class)def forward(self, x):x = self.embed(x)  # 通过嵌入层得到的形状(batch_size, n_step, m_dim)->(batch_size, n_step*m_dim)x = x.view(-1, x.size(1) * x.size(2))x = self.linear1(x)x = torch.tanh(x)output = self.linear2(x)return outputmodel = NNLM(n_step, n_class, m_dim, n_hidden)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)input_batch, target_batch = make_batch(sentences, max_lens, word_dict)for epoch in range(10000):optimizer.zero_grad()output = model(input_batch)loss = criterion(output, target_batch)loss.backward()optimizer.step()if (epoch + 1) % 1000 == 0:print(f"Epoch:{epoch+1}, Loss:{loss:.4f}")# 预测
with torch.no_grad():predict = model(input_batch).max(1, keepdim=True)[1]predictions = [number_dict[n.item()] for n in predict.squeeze()]# print([sen.split()[:2] for sentence in sentences for sen in sentence], '->', [number_dict[n.item()] for n in predict.squeeze()])
print("输入序列 -> 预测结果")
new_sentences = "床前"
count = 5
flog = True
for i in range(0, len(input_batch)):input_seq = []x = i + 1if x < len(input_batch):input_seq = [number_dict[idx.item()] for idx in input_batch[x]]input_seq1 = [ number_dict[ idx.item() ] for idx in input_batch[ i ] ]# 按词预测下一个词,并组装诗歌new_sentences += predictions[i]# 判断诗歌后是否接符号if len(new_sentences) % count == 0 and flog:new_sentences += ","count += 6flog = Falseif len(new_sentences) % count == 0 and not flog:new_sentences += "。"count += 6flog = Trueif len(new_sentences) % 24 == 0:new_sentences += input_seq[0]print(f"{input_seq1} -> {predictions[i]}")
print(new_sentences)# 计算准确率
correct = (predict.squeeze() == target_batch).sum().item()
accuracy = correct / len(target_batch) * 100
print(f"Accuracy: {accuracy:.2f}%")
2.2 word2vec

Word2Vec 是一种用于生成词嵌入(word embeddings)的流行算法,由 Google 在 2013 年提出。它通过在大规模文本数据上训练神经网络模型来学习单词的向量表示。这些向量能够捕捉到单词之间的语义和句法关系,使得相似的单词在向量空间中具有相近的表示。

Word2Vec 的主要特点

  1. 低维表示
    • 将高维的稀疏向量(如 one-hot 编码)映射到低维的密集向量空间。例如,一个词汇表大小为 10,000 的 one-hot 编码可以被映射到 100 维的密集向量。
  2. 语义信息
    • 通过训练,Word2Vec 能够捕捉到输入项之间的语义关系。例如,“king” 和 “queen” 在向量空间中会非常接近,因为它们有相似的语义角色。
  3. 上下文依赖
    • Word2Vec 通常是基于上下文生成的。不同的上下文可能会导致同一个单词有不同的向量表示。例如,“bank” 在金融上下文中和在河流上下文中会有不同的向量表示。

Word2Vec 包含两种主要的模型:CBOW (Continuous Bag of Words) 和 Skip-gram。

CBOW (Continuous Bag of Words)

  • 目标:给定一个单词的上下文,预测该单词。
  • 结构:输入是上下文单词的平均向量,输出是中心单词的概率分布。
  • 优点:计算效率较高,适合处理小规模的数据集。
  • 缺点:对于罕见词的处理不如 Skip-gram 好。
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt# 定义数据类型
dtype = torch.FloatTensor# 语料库,包含训练模型的句子
sentences = ["i like dog", "i like cat", "i like animal","dog cat animal", "apple cat dog like", "cat like fish","dog like meat", "i like apple", "i hate apple","i like movie book music apple", "dog like bark", "dog friend cat"]# 构建词表
word_sentences = " ".join(sentences).split()
# 去重
word_list = list(set(word_sentences))
word_dict = {w: i for i, w in enumerate(word_list)}# 创建CBOW训练数据
cbow_data = []
for i in range(1, len(word_sentences) - 1):context = [word_dict[word_sentences[i-1]], word_dict[word_sentences[i+1]]]target = word_dict[word_sentences[i]]cbow_data.append([context, target])# 模型参数
voc_size = len(word_dict)
# 词向量维度
embedding_size = 2
# 批次
batch_size = 2# 定义CBOW模型
class CBOW(nn.Module):def __init__(self):super().__init__()# 映射维度self.embed = nn.Embedding(voc_size, embedding_size)# 输出矩阵self.linear = nn.Linear(embedding_size, voc_size)def forward(self, x):embeds = self.embed(x)  # 映射矩阵, 通过嵌入层得到的形状是(batch_size, n_step, m_dim)avg_embeds = torch.mean(embeds, dim=1)  # 在n_step维度上平均output = self.linear(avg_embeds)return outputmodel = CBOW()criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)def random_batch(data, size):random_labels = []random_inputs = []# 从数据中随机选择size个索引random_index = np.random.choice(range(len(data)), size, replace=False)# 根据随机索引生成输入和标签批次for i in random_index:# 目标词one-hot编码random_inputs.append(data[i][0])# 上下文的词的索引作为标签random_labels.append(data[i][1])return random_inputs, random_labelsfor epoch in range(10000):inputs, labels = random_batch(cbow_data, batch_size)inputs = np.array(inputs)input_batch = torch.LongTensor(inputs)label_batch = torch.LongTensor(labels)optimizer.zero_grad()output = model(input_batch)loss = criterion(output, label_batch)if (epoch + 1) % 1000 == 0:print(f"Epoch:{epoch+1}, Loss:{loss:.4f}")loss.backward()optimizer.step()# 可视化词嵌入
for i, label in enumerate(word_list):# 获取模型参数W = model.embed.weight.data.numpy()x, y = float(W[i][0]), float(W[i][1])# 绘制散点图plt.scatter(x, y)plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords="offset points", ha="right", va="bottom")
plt.show()

Skip-gram

  • 目标:给定一个中心单词,预测其上下文中的单词。
  • 结构:输入是中心单词的向量,输出是上下文单词的概率分布。
  • 优点:能够更好地处理罕见词,生成的词向量质量较高。
  • 缺点:计算成本较高,特别是在大规模数据集上。
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt# 定义数据类型
dtype = torch.FloatTensor# 语料库,包含训练模型的句子
sentences = ["i like dog", "i like cat", "i like animal","dog cat animal", "apple cat dog like", "cat like fish","dog like meat", "i like apple", "i hate apple","i like movie book music apple", "dog like bark", "dog friend cat"]# 构建词表
word_sentences = " ".join(sentences).split()
word_list = list(set(word_sentences))
word_index = {w: i for i, w in enumerate(word_list)}
index_word = {i: w for i, w in enumerate(word_list)}
vocab_size = len(word_list)# 创建skip的训练数据集
skip_grams = []
for i in range(1, len(word_sentences) - 1):# 当前词对应的idcenter = word_index[word_sentences[i]]# 获取当前词的前后两个上下文对应的词的idcontext = [word_index[word_sentences[i-1]], word_index[word_sentences[i+1]]]# 将当前词和上下文词组合成skip-gram数据集for w in context:skip_grams.append([center, w])# 定义超参数
# 词汇表维度
embed_dim = 2
# 训练批次
batch_size = 5# 定义skip模型
class Word2Vec(nn.Module):def __init__(self, dtype):super(Word2Vec, self).__init__()# 定义词嵌入矩阵,随机初始化,大小为(词汇表大小,词嵌入维度)self.W = nn.Parameter(torch.rand(vocab_size, embed_dim)).type(dtype)print(self.W.type())# 定义输出层矩阵W2, 随机初始化, 大小为(词嵌入维度, 词汇表大小)self.W2 = nn.Parameter(torch.rand(embed_dim, vocab_size)).type(dtype)self.log_softmax = nn.LogSoftmax(dim=1)def forward(self, x):# 映射层weights = torch.matmul(x, self.W)# 输出层out_put = torch.matmul(weights, self.W2)return out_putmodel = Word2Vec(dtype)criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)def random_batch(data, size):random_labels = []random_inputs = []# 从数据中随机选择size个索引random_index = np.random.choice(range(len(data)), size, replace=False)# 根据随机索引生成输入和标签批次for i in random_index:# 目标词one-hot编码random_inputs.append(np.eye(vocab_size)[data[i][0]])# 上下文的词的索引作为标签random_labels.append(data[i][1])return random_inputs, random_labelsfor epoch in range(10000):inputs, labels = random_batch(skip_grams, batch_size)inputs = np.array(inputs)input_batch = torch.from_numpy(inputs).float()label_batch = torch.LongTensor(labels)optimizer.zero_grad()output = model(input_batch)loss = criterion(output, label_batch)if (epoch + 1) % 1000 == 0:print(f"Epoch:{epoch+1}, Loss:{loss:.4f}")loss.backward()optimizer.step()# 可视化词嵌入
for i, label in enumerate(word_list):# 获取模型参数W, W2 = model.parameters()x, y = float(W[i][0]), float(W[i][1])# 绘制散点图plt.scatter(x, y)plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords="offset points", ha="right", va="bottom")
plt.show()

gensim API调用

参数说明
sentences可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
vector_sizeword向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好。推荐值为几十到几百。
alpha学习率
window表示当前词与预测词在一个句子中的最大距离是多少。
min_count可以对字典做截断。词频少于min_count次数的单词会被丢弃掉,默认值为5。
max_vocab_size设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
sample高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
seed用于随机数发生器。与初始化词向量有关。
workers参数控制训练的并行数。
sg用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
hs如果为1则会采用hierarchica·softmax技巧。如果设置为0(default),则negative sampling会被使用。
negative如果>0,则会采用negative samping,用于设置多少个noise words。
cbow_mean如果为0,则采用上下文词向量的和,如果为1(default)则采用均值。只有使用CBOW的时候才起作用。
hashfxnhash函数来初始化权重。默认使用python的hash函数。
epochs迭代次数,默认为5。
trim_rule用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RULE_DISCARD,utils。RULE_KEEP或者utils。RULE_DEFAULT的函数。
sorted_vocab如果为1(default),则在分配word index 的时候会先对单词基于频率降序排序。
batch_words每一批的传递给线程的单词的数量,默认为10000
min_alpha随着训练的进行,学习率线性下降到min_alpha
import numpy as np
from gensim.models import Word2Vec
import matplotlib.pyplot as plt# 语料库,包含训练模型的句子
sentences = ["i like dog", "i like cat", "i like animal","dog cat animal", "apple cat dog like", "cat like fish","dog like meat", "i like apple", "i hate apple","i like movie book music apple", "dog like bark", "dog friend cat"]# 每个句子分成单词表(word2vec api要求输入格式为二维列表: 每一个句子是一个单词列表
token_list = [sentence.split() for sentence in sentences]# 定义word2vec模型
model = Word2Vec(token_list, vector_size=2, window=1, min_count=0, sg=1)# 获取词汇表
word_list = list(model.wv.index_to_key)# 可视化词嵌入
for i, word in enumerate(word_list):# 获取模型参数W = model.wv[word]x, y = float(W[0]), float(W[1])# 绘制散点图plt.scatter(x, y)plt.annotate(word, xy=(x, y), xytext=(5, 2), textcoords="offset points", ha="right", va="bottom")
plt.show()print(model.wv.most_similar("dog"))
# 打印两个词的相似度
print(model.wv.similarity("dog", "cat"))

相关文章:

NLP基础1

NLP基础1 深度学习中的NLP的特征输入 1.稠密编码&#xff08;特征嵌入&#xff09; 稠密编码&#xff08;Dense Encoding&#xff09;&#xff1a;指将离散或者高纬的稀疏数据转化为低纬度的连续、密集向量表示 特征嵌入&#xff08;Feature Embedding&#xff09; ​ 也称…...

001.docker30分钟速通版

docker简介 docker就是一个用于构建&#xff08;build&#xff09;&#xff0c;运行&#xff08;run&#xff09;&#xff0c;传送&#xff08;share&#xff09;应用程序的平台做一个不恰当的类比&#xff0c;就是外卖平台&#xff0c;如果你自己做华莱士不一定好吃&#xff0…...

Kafka 在 Linux 下的集群配置和安装

Kafka 在 Linux 下的集群配置和安装 Apache Kafka 是一个流行的分布式流处理平台&#xff0c;广泛用于实时数据管道和流处理应用。本文将详细讲解如何在 Linux 环境中配置和安装 Kafka 集群&#xff0c;并包括通过 Docker 安装和配置 Kafka 的步骤。每个步骤都将提供详细的解释…...

Python--操作列表

1.for循环 1.1 for循环的基本语法 for variable in iterable: # 执行循环体 # 这里可以是任何有效的Python代码块这里的variable是一个变量名&#xff0c;用于在每次循环迭代时临时存储iterable中的下一个元素。 iterable是一个可迭代对象&#xff0c;比如列表&#xff08;…...

JMeter(需要补充请在留言区发给我,谢谢)

一、学习工具 1、CinfigElement(HTTP Request Defaults、HTTP Header Manager、HTTP Authorization、CSV Data Set Config、User Defined Variables、JDBC Connection Configuration、HTTP Cookie Manager、Random Variable) 二、协议 1、HTTP协议&#xff08;消息体数据&am…...

线程池的执行流程和配置参数总结

一、线程池的执行流程总结 提交线程任务&#xff1b;如果线程池中存在空闲线程&#xff0c;则分配一个空闲线程给任务&#xff0c;执行线程任务&#xff1b;线程池中不存在空闲线程&#xff0c;则线程池会判断当前线程数是否超过核心线程数&#xff08;corePoolSize&#xff09…...

node-red-L3-重启指定端口的 node-red

重启指定端口 目的步骤查找正在运行的Node.js服务的进程ID&#xff08;PID&#xff09;&#xff1a;停止Node.js服务&#xff1a;启动Node.js服务&#xff1a; 目的 重启指定端口的 node-red 步骤 在Linux系统中&#xff0c;如果你想要重启一个正在运行的Node.js服务&#x…...

(done) 使用泰勒展开证明欧拉公式

问问神奇的 GPT&#xff0c;how to prove euler formula? 一个答案如下&#xff1a;...

红队apt--邮件钓鱼

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 免责声明: 本文仅供了解攻击方手法使用&#xff0c;切勿用于非授权情节 初步了解邮件基础 用途方面 这个我们应该比较熟悉&#xff0c;最常用于验证码接收&#xff0c;也有一些厂商会用这个来打广告&#xff0c;…...

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后&#xff1a; MyBatis 的官方文档&#xff1a;https://mybatis.p2hp.com/ 关于 MyBa…...

DNS协议解析

DNS协议解析 什么是DNS协议 IP地址&#xff1a;一长串唯一标识网络上的计算机的数字 域名&#xff1a;一串由点分割的字符串名字 网址包含了域名 DNS&#xff1a;域名解析协议 IP>域名 --反向解析 域名>IP --正向解析 域名 由ICANN管理&#xff0c;有级别&#xf…...

每日一题——第一百零八题

题目&#xff1a; 写几个函数&#xff0c; ①输入10个职工的姓名和职工号 ②按照职工号由小到大排列&#xff0c; 姓名顺序也随之调整 ③要求输入一个职工号&#xff0c; 用折半查找找出该职工的姓名 #include<stdio.h> #include<string.h> #define MAX_EMPOLYEES…...

使用Python免费将pdf转为docx

刚刚想将pdf转换为docx文档时&#xff0c;居然要收费 还好我学过编程&#xff0c;这不得露两手 将pdf 转换为 docx 文档 的操作步骤 我这里使用的是Python语言 &#xff08;1&#xff09;在终端上安装 pdf2docx 是一个 Python 库&#xff0c;它可以将 PDF 文件转换为 Word (…...

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…...

C#实现指南:将文件夹与exe合并为一个exe

在软件开发过程中&#xff0c;有时需要将多个文件&#xff08;如资源文件、配置文件等&#xff09;与可执行文件&#xff08;exe&#xff09;打包在一起&#xff0c;以便于分发和部署。在C#中&#xff0c;我们可以利用ILMerge或Costura.Fody等工具来实现这一目标。本文将介绍如…...

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言&#xff1a;本节内容是信号&#xff0c; 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识&#xff08;没有学过的友友可以查看我的前一篇文章&#xff09;。 以及我们还没有学习信号的第三个阶段——信…...

C++ 刷题 使用到的一些有用的容器和函数

优先队列 c优先队列priority_queue&#xff08;自定义比较函数&#xff09;_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestP…...

【Kubernetes】常见面试题汇总(三十四)

目录 86. K8s 每个 Pod 中有一个特殊的 Pause 容器能否去除&#xff0c;简述原因。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kuberne…...

C++标准库双向链表 list 中的insert函数实现。

CPrimer中文版&#xff08;第五版&#xff09;&#xff1a; //运行时错误&#xff1a;迭代器表示要拷贝的范围&#xff0c;不能指向与目的位置相同的容器 slist.insert(slist.begin(),slist.begin(),slist.end()); 如果我们传递给insert一对迭代器&#xff0c;它们不能…...

华为机考练习(golang)

输入 第一行输入一个正整数N&#xff0c;表示整数个数。&#xff08;0<N<100000&#xff09; 第二行输入N个整数&#xff0c;整数的取值范围为[-100,100]。 第三行输入一个正整数M&#xff0c;M代表窗口的大小&#xff0c;M<100000&#xff0c;且M<N。 输出 窗口…...

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…...

数据库 - MySQL的事务

目录 前言 一、事务的特性 &#xff08;一&#xff09;原子性 &#xff08;二&#xff09;一致性 &#xff08;三&#xff09;隔离性 &#xff08;四&#xff09;持久性 二、事务的控制语句 三、事务隔离级别 &#xff08;一&#xff09;读未提交 &#xff08;二&…...

【Python机器学习】NLP信息提取——提取人物/事物关系

目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性&#xff08;POS&#xff09;标注可以使用语言模型来完成&#xff0c;这个语言模型包含词及其所有可能词性组成的字典。然后&#xff0c;该…...

vector类

一、STL库 vector 1.1 vector的介绍 vector英文意思为向量&#xff1a;向量是表示大小可以改变的数组的序列容器。 指向其元素的常规指针上的偏移量来访问其元素&#xff0c;并且与数组中的效率一样高。但与数组不同&#xff0c;它们的大小可以动态变化&#xff0c;其存储由容…...

python常见的魔术方法

什么是魔术方法 Python类的内置方法&#xff0c;各自有各自的特殊功能&#xff0c;被称之为魔术方法 常见的魔术方法有以下&#xff1a; __init__:构造方法 __str__:字符串方法 __lt__:小于、大于符号比较 __le__:小于等于、大于等于符合比较 __eq__:等于符合比较__init__ c…...

自动化测试常用函数:弹窗、等待、导航、上传与参数设置

目录 一、弹窗 1. 警告弹窗确认弹窗 2. 提示弹窗 二、等待 1. 强制等待 2. 隐式等待 3. 显示等待 三、浏览器导航 1. 打开网站 2. 浏览器的前进、后退、刷新 四、文件上传 五、浏览器参数设置 1. 设置无头模式 2. 页面加载策略 一、弹窗 弹窗是在页面是找不到任何…...

【必看】2024国赛选题分布情况分析及数模国赛答辩指南~答辩不走弯路

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 紧张刺激的数模国赛已经过去一段时间&#xff0c;各赛区的成绩发布也在陆续进…...

微服务注册中⼼1

1. 微服务的注册中⼼ 注册中⼼可以说是微服务架构中的”通讯录“ &#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c; 服务会注册到这⾥&#xff0c;当服务需要调⽤其它服务时&#xff0c;就这⾥找到服务的地址&#xff0c;进⾏调⽤。 1.1 注册中⼼的…...

我设置了路由器自动切换ip,这会让我的账号登录地址经常改变吗

是的&#xff0c;路由器设置自动切换IP可能会导致你的账号登录地址经常改变。 这是因为当路由器切换IP时&#xff0c;外部网络所看到的你的设备IP地址也会随之改变。对于很多跨境电商、社交媒体或者银行账户等需要较高安全性的系统来说&#xff0c;经常变动的IP地址可能会被视…...

Nginx 限流实战教程和技巧

Nginx限流是一种重要的技术手段&#xff0c;用于保护服务器资源&#xff0c;防止因过度请求而导致的服务不可用。以下是一个详细的Nginx限流教程&#xff0c;包括限流原理、常用模块和配置示例。 一、Nginx限流原理 Nginx限流主要基于两种算法&#xff1a;漏桶算法和令牌桶算…...