NLP从零开始------8文本进阶处理之文本向量化
1. 文本向量化概述
随着计算机计算能力的大幅度提升,机器学习和深度学习都取得了长足的发展。NLP越来越多的通过应用机器学习和深度学习工具解决问题,例如通过深度学习模型从网络新闻报道中分析出关键词汇与舆论主题并构建关系图谱。在这种背景下,文本向量化成为NLP一个非常重要的工具,因为文本向量化可将文本空间映射到一个向量空间,从而使得文本可计算。文本分类和聚类是NLP得得基础内容。这几节主要介绍文本进阶处理的文本向量化得常用方法、文本相速度的计算方法及常见的文本分类和聚类算法。
本节先学习文本向量化。文本向量化是将文本表示成一系列能够表达文本语义的机读向量。在nlp中,文本向量化是一个重要环节,其产出的的向量质量将直接影响后续模型的表现。例如:在一个文本相似度比较的任务,可以去文本向量的余弦值作为文本相似度,也可以将文本向量输入神经网络中进行计算得到相似度,但是无论后续模型是怎样的,前期的文本向量表示都会影响整个相似度比较的准确性。
例如,图像领域天然有着高维度和局部相关性等特性,nlp领域也有着自身的特征。一是计算机任何计算的前提都是提前向量化,而文本难以直接被向量化;二是文本向量化应当尽可能的包含语言本身的信息,但是文本中存在多种语法规则及其他种类的特性,导致向量化比较困难;三是自然语言处理本身可以体现人类社会的深层次关系(如讽刺等词语),这种关系未向量化带来了挑战。
文本向量化按照向量化的粒度的不同可以将其分为以字节为单位、以句子为单位向量表达,根据不同的情景选择不同的向量表达方法和处理方式。目前对文本向量化的大部分研究都是通过以词为单位的向量化。随着深度学习技术的广泛应用,基于神经网络的文本向量化已经成为NLP领域的研究热点,尤其是以词为单位的向量化。 Word2Vec是目前以词为单位中最典型的生成词向量的工具,其特点是将所有的词向量化,这样词与词之间即可度量它们之间的关系、挖掘词之间的联系。也有一部分研究将句子作为文本处理的基本单元,于是就产生了Doc2Vec和Str2Vec等技术。
2. 文本离散表示
文本向量化主要分为文本离散表示和文本分布式表示。离散表示是一种基于规则和统计的向量化方法,常用的方法有词集模型和词袋(BOW)模型,两类模型都是基于词之间保持独立性、没有关联为前提,将所有文本中的词形成一个字典,然后根据字典统计词出现频数。但是两者中间也有不同,例如: 词集模型中的独热表示,只要单个文本中单词出现在字典中,就将其置为1,不管出现多少次。 BOW模型只要文本中一个词出现在字典中,就将其向量值加1,出现多少次就加多少次。 文本离散表示的特点是忽略文本信息中的语序信息和语境信息,仅将其反映为若干维度的独立概念。这类模型由于本身原因存在无法解决的问题,如主语和宾语的顺序问题,会导致无法理解诸如“我为你鼓掌”和“你为我鼓掌”两个语句之间的区别。
2.1 独热表示
独热表示是指用一个长的向量表示一个词,向量长度为词典的大小,每个向量只有一个维度为1,其余维度全部为0,为1的位置表示该词语在词典的位置。例如:有两句话‘小张喜欢看电影,小王也喜欢’和‘小张也喜欢看足球比赛’。首先对这两句话分词构成一个词典,词典的键是词语。值是ID,即{’小张’:1,‘喜欢’:2,‘也’:3,‘看’:4,’电影‘:5,‘足球’:6,’比赛‘:7,‘小王’:8},然后根据ID值对于每个词语进行向量化,用0和1代表这个词是否出现,如‘小张’和‘小王’的独热表示分别为[1,0,0,0,0,0,0,0]和[0,0,0,0,0,0,0,1]。
独热表示词向量构造起来简单,但通常不是一个好的选择,他有明显的缺点,具体如下:
1. 维数过高:随着语料的增加,维数会越来越大,导致维数灾难。
2. 矩阵稀疏:one-hot表示的每一个词向量只有1维是有数值的,其他维度上的数值都为0。
3. 不能保留语义: one-hot表示的结果不能保留词语在句子中的位置信息。
2.2 BOW模型
BOW模型就是用一个向量表示一句话或一个文档。 BOW模型忽略文档的词语顺序、语法、句法等要素,将文档看作是若干个词汇的集合,文档中每个词都是独立的。
BOW模型每个维度上的数值代表ID对应的词在句子里出现的频次。上例中两句话的BOW模型向量化向量化分别表示为[1,2,1,1,1,0,0,1]和[0,1,1,1,0,1,1,0].
BOW模型与one-hot表示相比存在的缺点如下。
1. 维数高和稀疏性:不能保留词语在句子中的位置信息,如“我为你鼓掌”和“你为我鼓掌”向量化结果依然没有区别。
2. 不能保留语义:当语料增加时,维数也会增大,一个文本里不出现的词就会增多,导致矩阵稀疏。
2.3 TF-IDF表示
TF-IDF表示是用一个向量表示一个句话或一个文档,它的表示过程如下。 首先TF-IDF是在BOW的基础上对词出现的频次赋予TF-IDF权值。 其次对BOW模型进行修正,进而表示该词在文档集合中的重要程度。
3 文本分布式表示
文本分布式表示将每个词个根据上下文从高维空间映射到一个低纬度、稠密的向量上。分布式表示的思想是词的语义是通过上下文信息确定的,即相同语境出现的词,其语义也相近。 分布式表示的优点是考虑到了词之间存在的相似关系,减小了词向量的维度。常用的方法有基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。
分布式表示与one-hot表示对比,在形式上,one-hot表示的词向量是一种稀疏词向量,其长度就是字典长度,而分布式表示是一种固定长度的稠密词向量;在功能上,分布式的最大特点是相关或相似的词在语义上距离更近。
3.1 WordVec模型
Word2Vec模型是简单化的神经网络模型。随着深度学习技术的广泛应用,基于神经网络的文本向量化成为了nlp领域的研究热点。Word2Vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;该工具得到的训练结果可以很好地度量词与词之间的相似性。
WordVec模型的输入是独热向量,根据输入和输出的模式不同,分为连续词袋模型(Continuous Bag-of-Words,CBOW)和跳字模型(Skip-Gram)。CBOW模型的训练输入是模一个特定词上下文对应的独热向量,而输出是这个特定词的概率分布。跳字模型和CBOW模型的思路相反。输入是特定词的独热向量,而输出是这个特定词的上下文的概率分布。CBOW对小模型语料库比较合适,而跳字模型在大型语料库中表现更好。
WordVec模型特点是,当模型训练好后,并不会使用训练好的模型处理新的任务,真正需要的是模型通过训练数据所学得的参数,如隐藏层的权重矩阵。
3.1.1 CBOW模型
CBOW模型根据上下文的词语预测目标词出现的概率。CBOW模型的神经网络包含输入层、隐藏层和输入层。输入层的输入的是某一个特定词上下文的one-hot向量。 输出层的输出是在给定上下文的条件下特定词的概率分布。 其模型结构如图所示。
3.1.1.1 CBOW模型的网络结构
假设某个特定词的上下文含C个词,词汇表中词汇量的大小为V,每个词都用one-hot向量表示,神经网络相邻层的神经元是全连接的。其网络结构如下。
输入层的含有C个单元,每个单元含V个神经元,用于输入V维one-hot向量。 隐藏层的神经元个数为 N ,在输入层中,每个单元到隐藏层连接权重值共享一个维的权重矩阵 W。输出层含有V个神经元,隐藏层到输出层连接权重为
维权重矩阵
。 输出层神经元的输出值表示词汇表中每个词的概率分布,通过softmax函数计算每个词出现的概率。
3.1.1.2 CBOW模型的数字形式
CBOW模型的简单形式:
假定预测目标值只有一个词,模型是在只有一个上下文的情况下预测一个目标词。 此时CBOW模型的结构如下图所示。
模型的输入为一个V维one-hot词向量,输出也是一个V维向量。 它包含了V个词的概率,每一个概率代表输入一个词的条件下输出词的概率。
CBOW模型的一般形式:
假设给定了一个输入x(one-hot向量),则隐藏层输出表达式可表示为。输出层每个神经元的输入表达式为
。其中
是矩阵
的第j列向量。 词汇表中的词用字母w表示,
表示实际输入的词,
表示目标词,词汇表中第j个词用
表示,条件概率p(
=
|
)表示输入词为
,目标词为
的概率。 当输入词为
,词汇表中每个词为目标词的概率式如下。
3.1.1.3 CBOW模型的损失函数
CBOW模型输出的真实目标词的概率记为p( |
,
,⋯,
),训练的目的就是使这个概率最大,其表达式如下。
其中表示真实目标词在词汇表中的下标。在求解过程中,要求目标函数的最小值,因此,损失函数的表达式定义如下。
3.1.1.4 CBOW模型学习步骤
假设词向量空间维度为V,上下文词的个数为C,词汇表中的所有词都转化为one-hot向量,CBOW模型的学习步骤如下。
初始化权重矩阵W(V×N矩阵,N为人为设定的隐藏层单元的数量),输入层的所有one-hot向量分别乘以共享的权重矩阵W,得到隐藏层的输入向量。
隐藏层的输入向量求平均作为隐藏层的输出。
隐藏层的输出向量乘以权重矩阵(N×V矩阵),得到输出层的输入向量。
输入向量通过激活函数处理得到输出层的概率分布。
计算损失函数。
更新权重矩阵。
3.1.2 Skip-Gram模型
Skip-Gram模型与CBOW模型相反,是根据目标词预测其上下文。其结构图如图所示。
3.1.2.1 Skip-Gram模型的结构
假设词汇表中词汇量的大小为V,隐藏层的大小为N,相邻层的神经元是全连接的,Skip-Gram模型的结构组成如下。
输入层含有V个神经元,输入是一个V维one-hot向量。 输入层到隐藏层连接权重是一个V×N维的权重矩阵W。 输出层含有C个单元,每个单元含有V个神经元,隐藏层到输出层每个单元连接权重共享一个N×V维权重矩阵W^。 输出层每个单元使用softmax函数计算得到上下文的概率分布。
3.1.2.2 Skip-Gram模型的数字形式
假设给定一个输入x,则隐藏层的输出为一个N维向量,表达式为ℎ=W。 输出层有C×V个输出神经元,每个神经元节点的净输入则表示为
,其中
为输出层第c个单元的第j个神经元的净输入,
是矩阵
的第j列向量。 由于每个输出单元共享相同的
,所以每个单元的第j个神经元的净输入相同,即
=
. 最终可得输出层第c个单元,第j个神经元的输出表达式如下。
3.1.2.3 Skip-Gram模型的损失函数
模型训练的目标是,给定一个特定词,使得输出的C个单元为实际的C个上下文的概率最大,即最大化条件概率,其表达式如下。
Skip-Gram模型的损失函数定义式如下。其中,是第c个单元上的词在词汇表中的索引。
3.2 Doc2Vec模型
Word2Vec模型获取一段文本的向量,是先对文本分词,提取文本的关键词,用Word2Vec获取这些关键词的词向量,然后计算这些关键词向量的平均值,然而,这种方法只保留了句子或文本中词的信息,缺丢失了文本中的主题信息。为此,有研究者在Word2vec的基础上提出了文本向量化Doc2Vec模型。
Doc2Vec模型与Word2Vec模型类似,只是在Word2Vec模型输入层增添了一个与词向量同维度的段落向量,可以将这个段落向量看作是另一个词向量。 Doc2Vec存在如下两种模型。 分布式记忆模型(Distributed Memory,DM),对应Word2Vec模型里的CBOW。 分布式词袋模型(Distributed Bag of Words,DBOW),对应Word2Vec模型中的Skip-gram模型。
3.2.1 DM模型
DM模型与CBOW模型类似,在给定上下文的前提下,试图预测目标词出现的概率,只不过DM模型的输入不仅包括上下文而且还包括相应的段落。假设词汇表中词汇量的大小为 VV,每个词都用one-hot向量表示,神经网络相邻层的神经元是全连接的
DM模型的网络结构如下。
- 输入层含1个段落单元, C个上下文单元,每个单元有 d 个神经元,用于输入 d 维one-hot向量。
- 隐藏层的神经元个数为 h,段落单元到隐藏层链接权重为
维矩阵 V×h,每个上下文单元到隐藏层连接权重值共享一个 C×h 维的权重矩阵
。
- 输出层含有 V 个神经元,隐藏层到输出层连接权重为
维权矩阵 h×V。
- 通过softmax函数计算输出层的神经元输出值。
DM模型增加了一个与词向量长度相等的段落向量即Paragraph ID,从输入到输出的计算过程如下,结构如图所示。
Paragraph ID通过矩阵 Wp 映射成段落向量。段落向量和词向量的维数虽然一样,但是代表了两个不同的向量空间。每个段落或句子被映射到向量空间中,可以用矩阵 Wp 的一列表示。上下文通过矩阵 Wc 映射到向量空间,用矩阵 Wc的一列表示。将段落向量和词向量求平均或按顺序拼接后输入Softmax层。
3.2.2 DBOW模型
与Skip-gram模型只给定一个词语预测上下文概率分布类似,DBOW模型输入只有段落向量,DBOW模型通过一个段落向量预测段落中随机词的概率分布。其结构如图所示。
DBOW模型的训练方法忽略输入的上下文,让模型去预测段落中的随机一个词,在每次迭代的时候,从文本中采样得到一个窗口,再从这个窗口中随机采样一个词作为预测任务并让模型去预测,输入就是段落向量。
Doc2Vec模型主要包括以下两个步骤。 训练模型。在已知的训练数据中得到词向量 、各参数项和段落向量或句子向量 。 推断过程。对于新的段落,需要得到它的向量表达。 DM模型与CBOW模型相对应,可以根据上下文词向量和段落向量预测目标词的概率分布。DBOW模型与Skip-gram模型对应,只输入段落向量,预测从段落中随机抽取的词组概率分布。总而言之,Doc2vec是Word2Vec的升级,Doc2vec不仅提取文本的语义信息,而且提取了文本的语序信息。
4. Word2Vec词向量的训练
4.1 中文语料预处理
训练词向量需要有一个大量的语料库,本节使用维基百科的中文网页数据做为训练语料库。 预处理主要包含以下三个步骤。 将维基百科提供的xml格式的语料文件读入后存储为txt格式。 将繁体字转化为简体字。 利用jieba库对语料库中的句子进行分词。
4.2 词向量训练
当中文语料预处理完成后,使用gensim库训练词向量。 由于维基百科的语料数据较多,所以对它进行数据预处理和训练时需要等待较长的时间。在代码中设置判断语句,如果训练好的模型存在则不需要再训练。
4.3 代码实现
import re
import pandas as pd
import jieba
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence# 读取CSV文件
data = pd.read_csv('news.txt', header=None)
data.columns = [ 'contents']# 数据预处理
data_dup = data.drop_duplicates(subset='contents')# 分词
data_cut = data_dup['contents'].astype('str').apply(lambda x: list(jieba.cut(x)))# 去停用词
stopword = pd.read_csv('stopword.txt', header=None, encoding='utf-8', engine='python', on_bad_lines='skip')
stopword_set = set(stopword[0] + ['']) # 直接使用集合提高查找效率# 去除停用词和空白字符
data_qustop = data_cut.apply(lambda x: [i for i in x if i not in stopword_set and i not in ['\u3000', '\xa0']])# 保存处理后的数据到CSV
data_qustop.to_csv('data_qustop.csv', index=False)def get_word2vec_trainwords(data_qustop):with open('word2vec_train_words.txt', 'w', encoding='utf-8') as f:for text in data_qustop:f.write(' '.join(text) + '\n')print(f'已处理 {text.count(" ") + 1} 条数据')# 调用函数生成训练数据
get_word2vec_trainwords(data_qustop)# 使用word2vec模型训练词向量
with open('word2vec_train_words.txt', 'r', encoding='utf-8') as news:model = Word2Vec(LineSentence(news), sg=0, vector_size=192, window=5, min_count=5, workers=9)# 打印特定词的词向量
print(model.wv['中国'])
代码随需文件在顶部,注意将代码和文件放在同一目录下。
代码结果如下:
D:\ana\envs\nlp\python.exe D:\pythoncode\nlp\word.py
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\86130\AppData\Local\Temp\jieba.cache
Loading model cost 0.379 seconds.
Prefix dict has been built successfully.
已处理 1 条数据
已处理 1 条数据
已处理 1 条数据
已处理 1 条数据
已处理 2 条数据
已处理 1 条数据
已处理 1 条数据
已处理 1 条数据
[-7.0224394e-04 -3.1521432e-03 1.5586118e-03 -2.3781818e-042.4512981e-03 -1.1890735e-03 -2.1551263e-03 1.1864057e-034.3512415e-03 -2.6018780e-03 1.3899369e-03 -4.1617472e-03-3.5277847e-03 -2.4357748e-04 -4.5665246e-03 1.4528321e-038.3260174e-04 -1.2081731e-03 2.6061411e-03 5.0774929e-034.4032647e-03 -9.7928382e-04 1.0719541e-03 -2.0852548e-03-4.2923987e-03 3.2697686e-03 -1.0151988e-03 -3.4698160e-04-9.2256878e-04 -2.3623258e-03 2.1154738e-03 -2.2240523e-03-4.9888263e-03 4.6578725e-03 2.1693066e-03 4.8097577e-033.4601577e-03 1.5233004e-03 5.1062605e-03 -2.3045007e-03-3.5433911e-03 2.2017609e-03 1.9421875e-03 -2.9503182e-035.0545628e-03 -1.8532848e-03 4.9736495e-03 4.3475316e-04-3.3012796e-03 -1.0297485e-03 -3.8422160e-03 -1.5518349e-035.4255064e-04 4.9389000e-03 4.8728376e-03 -3.4353528e-031.8099746e-03 1.1851931e-03 -1.2965376e-03 -4.8068608e-035.3496164e-04 -4.2529721e-03 3.2917652e-03 -3.0208752e-032.8830413e-03 5.1217307e-03 -8.3333500e-05 2.3585900e-03-9.4239600e-04 3.8337298e-03 2.0521339e-03 -4.6928772e-03-1.2492208e-03 1.8899838e-03 -5.1858526e-05 -6.2566187e-04-5.4970756e-04 -8.7062578e-04 3.1507947e-04 2.1693204e-03-2.2149954e-03 -1.9966781e-03 -2.7508786e-05 1.4028947e-04-8.7919958e-05 -2.4924513e-03 2.2465636e-03 -1.1312080e-031.0955936e-03 3.4714738e-04 3.1092067e-03 -3.5637401e-03-3.5498489e-03 -2.3313842e-03 4.9144942e-03 -8.2910556e-04-4.9110637e-03 -2.8387582e-04 -2.3171473e-03 3.1250410e-03-4.9915030e-03 1.4890631e-03 -4.8191831e-03 6.5093796e-043.1245823e-03 3.8527853e-03 -3.9695124e-03 -3.1526163e-03-3.5616879e-03 -4.1241352e-03 -4.9474374e-03 -1.1070296e-03-4.3538152e-04 -3.7792716e-03 3.5349149e-03 5.8313523e-043.0358683e-03 7.6711801e-04 4.1112801e-04 -3.8375675e-03-1.1336760e-03 2.2505622e-03 -2.6486013e-03 5.8895285e-041.5017521e-03 -8.0018799e-04 5.1730704e-03 4.3487679e-031.2581596e-03 3.7074194e-03 3.0684571e-03 -2.9065714e-03-2.6855431e-03 -3.4730926e-03 -4.0504350e-03 4.3285042e-03-1.0324698e-03 -3.5702933e-03 -2.1637443e-03 2.6792325e-03-1.4943419e-03 -1.9529480e-03 8.4449229e-04 -1.4459863e-03-8.2518783e-04 5.5963109e-04 -1.5510129e-03 4.4371262e-032.0369452e-03 -5.1869079e-03 3.2602083e-03 -3.5178408e-034.0074624e-04 2.2938724e-03 -2.6580077e-03 -1.0993071e-034.2163953e-03 -2.2103086e-03 -3.9772191e-03 4.8218295e-03-1.1226548e-03 -2.4580378e-03 4.4639581e-03 2.2309057e-032.2525191e-03 4.8356839e-03 -4.4026463e-03 2.7371459e-031.0621622e-03 2.1813959e-03 8.8432309e-04 2.3250699e-032.3366094e-03 3.1794384e-03 -1.6677590e-03 -2.3831918e-03-2.2214402e-04 1.3196530e-03 -1.6995663e-03 3.1550613e-032.1636095e-03 4.0440583e-03 1.3381628e-03 4.2274389e-03-7.2250515e-04 4.2072539e-03 1.9359458e-03 -4.1913148e-03-2.0487576e-03 -1.2874367e-03 2.5484606e-03 -4.5424947e-04]进程已结束,退出代码为 0
5 Doc2Vec段落向量的训练
1. 数据预处理
定义一个类包含繁体字和简体字的转换操作和利用jieba库进行分词操作。 gensim库里的Doc2vec提供的LabeledSentence函数可以将文档标签(如类别)加入到文档向量的训练中,因此Doc2vec在训练时能够采用tags信息更好地辅助训练,相对于Word2Vec模型,这里的多了一个tags属性。
2.段落向量训练
当数据预处理完成后,使用gensim库训练段落向量。 Doc2Vec函数训练段落向量,第一个参数documents表示预处理后用于训练的语料;dm=0表示使用DBOW模型训练段落向量,dm=1则表示使用DM模型训练段落向量;参数size表示段落向量的维度,参数window、min_count、workers的含义与Word2Vec函数相同。
相关文章:

NLP从零开始------8文本进阶处理之文本向量化
1. 文本向量化概述 随着计算机计算能力的大幅度提升,机器学习和深度学习都取得了长足的发展。NLP越来越多的通过应用机器学习和深度学习工具解决问题,例如通过深度学习模型从网络新闻报道中分析出关键词汇与舆论主题并构建关系图谱。在这种背景下&#x…...

【网络编程】字节序,IP地址、点分十进制、TCP与UDP的异同
记录学习,思维导图绘制 目录 1、字节序编辑 2、IP地址 3、点分十进制 4、TCP与UDP的异同 1、字节序 2、IP地址 3、点分十进制 4、TCP与UDP的异同...

关于k8s的pvc存储卷
目录 1.PVC 和 PV 1.1 PV 1.2 PVC 1.3 StorageClass 1.4 PV和PVC的生命周期 2.实战演练 2.1 创建静态pv 2.2 创建动态pv 3.总结 1.PVC 和 PV 1.1 PV PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,…...
【物联网设备端开发】ESP开发工具:QEMU的使用方法
概要 本文提供了一些运行QEMU的ESP特定说明。有关QEMU的一般使用问题,请参阅官方文档:https://www.qemu.org/documentation/. 编译 QEMU 准备工作 在此之前,请查看有关构建先决条件的QEMU文档。如果你在Linux主机上构建QEMU,你…...
c++中std::endl 和“\n“ 这两个换行符有什么区别
std::endl 和 "\n" 都用于在C中生成换行符,但它们之间有一些重要的区别 std::endl: 功能:输出一个换行符,并刷新输出流(即缓冲区)。作用:确保所有数据立即输出到目的地,例…...

http中get和post怎么选
5.4.2.怎么选择1.如果你是想从服务器上获取资源,建议使用GET请求,如果你这个请求是为了向服务器提交数据,建议使用POST请求。2.大部分的form表单提交,都是post方式,因为form表单中要填写大量的数据,这些数据…...

数据分析及应用:快手直播间人员在线分析
目录 0 需求描述 1、进入直播间的高峰期为?(以进入用户数衡量) 2、晚上 11 点,哪个直播间的进入人数最多? 3、20:00-23:00,娱乐类、搞笑类,进入人数最多直播间分别是? 4、娱乐类、搞笑类,人均在线时长(退出时间-进入时间)最长的直播间分别是? 5、同时在线人数…...

【Python】nn.nn.CircularPad1、2、3d函数和nn.ConstantPad1、2、3d函数详解和示例
前言 在深度学习中,尤其是在处理图像、音频或其他多维数据时,数据填充(Padding)是一个常见的操作。填充不仅可以保持数据的空间维度,还能在卷积操作中避免信息丢失。PyTorch提供了多种填充方式,其中nn.Cir…...

LearnOpenGL——混合、面剔除
LearnOpenGL——混合、面剔除 混合 Blending一、丢弃片段 Alpha Test二、混合 Alpha Blending渲染顺序 面剔除一、环绕顺序二、面剔除 混合 Blending OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明的物体可以是完全透明的࿰…...
视频网站为何热衷于SCDN
视频网站为何热衷于SCDN?随着互联网技术的飞速发展,视频网站已成为人们日常生活中不可或缺的一部分。无论是观看高清电影、热门剧集,还是直播体育赛事、游戏竞技,视频网站都以其丰富的内容和便捷的访问方式吸引了无数用户。然而&a…...

Redis与DataBase保持数据一致性
文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…...

解决 MacOS 连接公司 VPN 成功但是不能网络的问题
目录 解决办法2024 Mac mini 爆料 解决办法 操作比较简单,修改配置文件即可(如果没有则需要手动创建)。 sudo vim /etc/ppp/options在此文件下,加入 plugin L2TP.ppp: plugin L2TP.ppp如果文件里有l2tpnoipsec&…...

【Kubernetes】k8s集群之Pod容器资源限制和三种探针
目录 一、Pod容器的资源限制 1.资源限制 2.Pod 和容器的资源请求与限制 3.CPU 资源单位 4.内存资源单位 二、Pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法: 一、Pod容器的资源限制 1.资源限制 当定义 Pod 时可以选择性地为每个容器设定所…...

从古代驿站体系看软件安全管控@安全历史04
在古代,车、马都很慢,信息传递很不顺畅,中央的政令又是如何传达至地方的呢?实际上,很多朝代都有专门的驿站制度,可以保障全国各地的信息传递,对于维护统治和稳定有着关键作用。 若将国家比作一个…...

8.8 哈希表简单 1 Two Sum 141 Linked List Cycle
1 Two Sum class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {//给的target是目标sum 要返回vector<int> res(2,0);是在num中找加数//首先假设每个输入都是由唯一的结果,而且不适用相同的元素两次一共有n*(n-1)种…...

动态规划之——背包DP(完结篇)
文章目录 概要说明分组背包模板例题1思路code模板例题2思路code 有依赖的背包问题模板例题思路code 背包问题求方案数模板例题思路code 背包问题求具体方案模板例题思路code 概要说明 本文讲分组背包、有依赖的背包、 背包问题求方案数以及背包问题求具体方案 入门篇(01背包和…...

Advanced IP Scanner - 网络扫描工具介绍
Advanced IP Scanner 是一款免费、快速且用户友好的网络扫描工具。它能够帮助用户扫描局域网(LAN)中的所有设备,提供详细的设备信息,包括IP地址、MAC地址、设备名称和厂商信息。该工具对IT管理员和普通用户都非常有用,…...

数据库事务的四大特性ACID
数据库事务的四大特性ACID 数据库事务(Transaction)是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个或多个SQL语句组成,这些语句作为一个整体一起向系统提交,要么全部执行,…...

ELK架构介绍
一、ELK简介 ELK 是由三个开源软件组成的,分别是:Elasticsearch、Logstash和Kibana,这三个软件各自在日志管理和数据分析领域发挥着重要作用。Elasticsearch提供分布式存储和搜索能力;Logstash负责数据收集和处理,而K…...

Vscode下ESP32工程函数定义无法跳转
1.删除.vscode 2.按下 ctrlshiftp,搜索 ESP-IDF:Add vscode Configuration Folder...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...