LLM架构从基础到精通之词向量1
自然语言处理中的词嵌入:从基础到应用
在自然语言处理(NLP)领域,词嵌入是一个极为关键的概念。它本质上是一种将单词转换为连续向量空间中的数值表示(即向量)的方法,旨在捕捉单词的语义信息,使得语义相似的单词具有相似的向量表示。本文将深入探讨词嵌入的各个方面,从基础原理到高级应用,确保读者能全面理解这一主题及其在 NLP 和大型语言模型(LLM)中的发展演变。
一、引言
词嵌入是自然语言处理中的一个基本概念。其主要目的是将单词转化为连续向量空间中的数值表示(向量),从而捕捉单词的语义含义,让具有相似语义的单词拥有相似的向量表示。

本文涵盖了词嵌入从基础到高级的各个重要方面,确保读者能够透彻理解该主题及其在自然语言处理和大型语言模型背景下的演变历程。
二、词嵌入基础
(一)理解向量和向量空间
在自然语言处理和词嵌入的情境下,理解向量和向量空间是至关重要的,因为它们构成了表示单词及其关系的数学基石。

向量是一个具有大小(长度)和方向的数学对象。简单来说,向量可以被视为表示空间中一个点的有序数字列表。例如,在二维空间中,向量可表示为(\begin{bmatrix}v_1\v_2\end{bmatrix}),其中(v_1)和(v_2)分别是向量在两个维度(如(x)轴和(y)轴)上的分量。在自然语言处理中,单词被表示为多维空间中的向量,其中每个维度都捕捉了单词意义的不同方面或特征。

向量空间是由一组向量组成的数学结构,这些向量可以进行相加以及与标量(数字)相乘的运算,从而在同一空间中生成另一个向量。向量空间由其维度(如 2D、3D 等)来定义,维度指的是确定该空间内任意一点所需的坐标数量。在词嵌入的场景中,我们所处理的是高维向量空间,通常具有数百甚至数千个维度。每个单词都被映射到这个空间中的一个独特向量。
当我们将单词表示为向量空间中的向量时,目标是捕捉单词的语义含义。在相似语境中出现或具有相似语义的单词在向量空间中应该彼此接近。词嵌入的训练过程基于单词在大规模文本语料库中的出现上下文来学习这些向量表示。例如,“king”(国王)和“queen”(女王)可能在向量空间中由相近的向量表示,因为它们共享相似的上下文(如皇室、领导等)。
向量空间允许我们执行在自然语言处理中非常有用的各种操作:
- 加法和减法:通过对向量进行相加或相减的操作,我们能够探究单词之间的关系。例如,著名的类比:(v_{queen} \approx v_{king} - v_{man} + v_{woman}),这个操作展示了如何通过调整“king”的向量与“man”和“woman”的差异来得到“queen”的向量。
- 点积:两个向量的点积提供了它们之间相似性的度量。如果两个单词向量的点积较高,这意味着它们相似且共享上下文。
- 余弦相似度:余弦相似度是一种常用的衡量两个向量之间相似性的方法,计算为它们之间夹角的余弦值。在比较单词向量时,这特别有用,因为它有助于归一化向量的大小,仅关注它们的方向。
虽然自然语言处理中使用的向量空间通常是高维的(远远超出我们直接可视化的能力),但通常会使用主成分分析(PCA)或 t - 分布随机邻域嵌入(t - SNE)等技术将其降维到 2D 或 3D。这种降维操作使我们能够可视化单词之间的相对位置,揭示出语义相关单词的簇。
(二)向量嵌入的类型
向量嵌入是一种将单词、句子和其他数据转换为能够捕捉其意义和关系的数字的方法。它们将不同的数据类型表示为多维空间中的点,其中相似的数据点会聚集得更近。这些数值表示有助于机器更有效地理解和处理数据。
单词和句子嵌入是向量嵌入的两种最常见的子类型,但还有其他类型。一些向量嵌入可以表示整个文档,以及用于匹配视觉内容的图像向量、用于确定用户偏好的用户配置文件向量、有助于识别相似产品的产品向量等等。向量嵌入帮助机器学习算法在数据中寻找模式,并执行诸如情感分析、语言翻译、推荐系统等任务。
在各种应用中,有几种常用的向量嵌入类型:
- 单词嵌入:将单个单词表示为向量。像 Word2Vec、GloVe 和 FastText 等技术通过从大规模文本语料库中捕捉语义关系和上下文信息来学习单词嵌入。


- 句子嵌入:将整个句子表示为向量。像通用句子编码器(USE)和 SkipThought 等模型生成的嵌入能够捕捉句子的整体含义和上下文。
- 文档嵌入:将文档(从报纸文章、学术论文到书籍等)表示为向量。它们捕捉整个文档的语义信息和上下文。像 Doc2Vec 和段落向量等技术旨在学习文档嵌入。
- 图像嵌入:通过捕捉不同的视觉特征将图像表示为向量。像卷积神经网络(CNNs)以及 ResNet 和 VGG 等预训练模型为图像分类、目标检测和图像相似性等任务生成图像嵌入。
- 用户嵌入:将系统或平台中的用户表示为向量。它们捕捉用户的偏好、行为和特征。用户嵌入可用于从推荐系统到个性化营销以及用户细分等各个方面。
- 产品嵌入:将电子商务或推荐系统中的产品表示为向量。它们捕捉产品的属性、特征和任何其他可用的语义信息。算法然后可以使用这些嵌入基于向量表示来比较、推荐和分析产品。
在向量嵌入的背景下,嵌入和向量在某种程度上是相同的事物。两者都指数据的数值表示,其中每个数据点由高维空间中的向量表示。“向量”一词仅指具有特定维度的数字数组。在向量嵌入的情况下,这些向量在连续空间中表示上述任何数据点。相反,“嵌入”专门指以一种能够捕捉有意义的信息、语义关系或上下文特征的方式将数据表示为向量的技术。嵌入旨在捕捉数据的底层结构或属性,通常通过训练算法或模型来学习。
虽然在向量嵌入的上下文中,嵌入和向量可以互换使用,但“嵌入”强调以有意义和结构化的方式表示数据的概念,而“向量”则指的是数值表示本身。在本文中,我们主要关注单词嵌入,下面将详细讨论。
(三)词嵌入如何表示意义
词嵌入是自然语言处理中的强大工具,因为它们允许以一种能够捕捉单词语义含义及其与其他单词关系的方式来表示单词。与传统方法(如独热编码)不同,独热编码将单词视为独立且不相关的实体,而词嵌入以紧凑、密集的向量形式编码关于单词上下文和用法的丰富信息。
词嵌入背后的核心思想是,在相似上下文中出现的单词往往具有相似的含义。这基于语言学中的分布假设,即出现在相同上下文中的单词往往具有相似的含义。例如,考虑“cat”(猫)和“dog”(狗)这两个单词。它们经常出现在相似的上下文中(如“The cat/dog is playing with a ball.”)。因此,它们的嵌入在向量空间中应该彼此接近,反映出它们的相似含义。
词嵌入通常通过分析单词在大型文本语料库中的出现上下文来学习。学习过程涉及将每个单词映射到高维空间中的向量,使得该空间的几何结构能够捕捉单词之间的语义关系。
- 共现统计:词嵌入通常源自共现统计,其中每个单词的向量是基于在文本中附近频繁出现的单词学习的。例如,在 Word2Vec 模型中,嵌入被训练为使得具有相似共现模式的单词具有相似的向量表示。
- 上下文相似性:在相似上下文中出现的单词(即被相同的一组单词包围)被赋予相似的向量表示。例如,“king”和“queen”可能经常出现在相似的上下文中(如“The _ ruled the kingdom.”),导致它们的嵌入在向量空间中接近。
(四)嵌入中的几何关系
词嵌入的真正强大之处在于嵌入空间中向量之间的几何关系。这些关系编码了不同类型的意义和语义信息。
- 同义词和相似性:具有相似含义的单词在向量空间中的嵌入彼此接近。例如,“happy”(快乐)和“joyful”(喜悦)可能由接近的向量表示,表明它们的语义相似性。
- 类比和语义关系:词嵌入的一个迷人特性是它们能够通过向量算术捕捉类比关系。一个著名的例子是类比:((King - Man) \approx (Queen - Woman)),这意味着“king”和“man”之间的向量差类似于“queen”和“woman”之间的向量差。这种算术表明嵌入捕捉了复杂的语义关系,如性别、皇室,甚至地理关系(如“Paris - France + Italy \approx Rome”)。

- 层次关系:一些嵌入也捕捉层次关系。例如,在一个训练良好的嵌入空间中,“dog”可能接近“animal”(动物)和“cat”,反映了“dog”和“cat”都是“animals”的一种的层次结构。
- 多义词和上下文意义:虽然传统的词嵌入在处理多义词(具有多个含义的单词)方面存在困难,但像上下文嵌入(如 BERT、ELMo)等较新的模型已经推进了这一概念。在这些模型中,单词的嵌入根据其出现的上下文而变化,使得模型能够捕捉像“bank”(如河岸与银行)这样的单词的不同含义。
(五)密集表示
词嵌入被称为密集表示,因为它们将单词的含义浓缩到相对较少的维度(例如 100 - 300)中,其中每个维度捕捉单词含义或上下文的不同方面。这与稀疏表示(如独热编码)形成对比,在独热编码中,每个单词由一个大部分为零的长向量表示。例如,考虑在三维空间中“cat”和“dog”的以下词嵌入:
假设“cat”的向量为(\begin{bmatrix}0.2\0.3\0.4\end{bmatrix}),“dog”的向量为(\begin{bmatrix}0.3\0.4\0.5\end{bmatrix}),这些向量彼此接近,反映了“cat”和“dog”的相似含义。
(六)词嵌入中意义的应用
词嵌入捕捉意义的能力在 NLP 中有广泛的应用:
- 相似性和相关性:嵌入用于衡量两个单词的相似程度,这在信息检索、聚类和推荐系统等任务中很有用。
- 语义搜索:词嵌入使搜索引擎能够更智能地理解同义词和相关术语。
- 机器翻译:嵌入有助于跨语言对齐单词,促进更准确的翻译。
- 情感分析:通过理解上下文中单词的含义,嵌入提高了情感分类的准确性。
(七)词嵌入中的上下文概念
词嵌入通过分析在大型文本语料库中与目标单词紧邻出现的单词来利用上下文捕捉单词的含义。其思想是,在相似上下文中出现的单词往往具有相似的含义。
- 上下文窗口:在训练词嵌入时,通常使用上下文窗口来定义目标单词周围被视为其上下文的单词跨度。例如,在句子“The cat sat on the mat.”中,如果目标单词是“cat”且上下文窗口大小为 2,则上下文单词将是“The”和“sat”。上下文窗口的大小会影响嵌入的质量。较小的窗口专注于更近的单词,捕捉更具体的关系,而较大的窗口可能捕捉更一般的语义关系。
- 上下文相似性:训练过程会调整单词向量,使得具有相似上下文的单词最终具有相似的向量。例如,“cat”和“dog”可能有相似的上下文,如“pets”(宠物)、“animals”(动物)等,因此它们的向量在嵌入空间中会彼此接近。
- 上下文嵌入:传统的词嵌入如 Word2Vec 和 GloVe 为每个单词生成一个单一的向量,而不考虑其上下文。然而,像 ELMo 和 BERT 等较新的模型产生上下文嵌入,其中单词的向量根据其出现的上下文而变化。例如,在 BERT 中,“bank”在“river bank”和“financial bank”中的向量会不同,反映了它们在这些上下文中的不同含义。这使得对单词及其含义的理解更加细致入微。
为什么上下文很重要呢?因为如果没有上下文,单词的含义往往是模糊的。同一个单词可能根据其周围的单词而有不同的含义,理解这一点是自然语言理解的关键。
- 消歧:上下文有助于消除具有多个含义的单词(多义词)的歧义。例如,“bark”这个词可能表示狗叫的声音,也可能表示树的外皮。上下文(如“The dog barked loudly”与“The tree’s bark was rough”)有助于确定正确的含义。
- 同义词和相关单词:具有相似含义或在相似上下文中使用的单词将具有相似的嵌入。例如,“happy”和“joyful”可能出现在相似的上下文中,如“feeling”(感觉)或“emotion”(情感),从而导致它们具有相似的嵌入。
- 捕捉细微差别:通过利用上下文,嵌入可以捕捉含义上的细微差异。例如,“big”和“large”可能有相似的嵌入,但上下文可能揭示它们在使用上的细微差别,如“big opportunity”(大机会)与“large amount”(大量)。
三、词嵌入技术
在自然语言处理(NLP)中,词嵌入的生成是理解语言语义的核心。这些嵌入,即单词的密集数值表示,捕捉语义关系并使机器能够有效地处理文本数据。已经开发了几种技术来生成词嵌入,每种技术都为语言的语义结构提供了独特的见解。
让我们来探讨一些主要的方法:
(一)基于频率的方法
1. 计数向量化器(Count Vectorizer)
在收集用于分布式单词表示的单词数据时,可以从简单地统计一系列文档中每个单词的出现次数开始。每个单词在每个文档中出现的次数之和就是一个计数向量。CountVectorizer 通过统计每个单词的出现次数将文本转换为固定长度的向量。此时,标记被存储为词袋(bag-of-words)。

以下是使用 Python 的 sklearn 库的示例代码:
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?'
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print("Count Vectorized Matrix:\n", X.toarray())
print("Feature Names:\n", vectorizer.get_feature_names_out())
输出结果如下:
Count Vectorized Matrix:[[0 1 1 1 0 0 1 0 1][0 2 0 1 0 1 1 0 1][1 0 0 1 1 0 1 1 1][0 1 1 1 0 0 1 0 1]]
Feature Names:['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
这种方法存在一些局限性:
- 由于词汇量较大,会导致高维度。
- 忽略单词的语义含义和上下文。
- 不考虑单词顺序。
- 产生稀疏特征矩阵。
- 在捕捉长距离单词关系方面有限。
- 无法处理同义词,将每个单词视为不同的。
- 在处理新文档中的未登录词(out-of-vocabulary,OOV)时存在困难。
- 对文档长度敏感,可能引入偏差。
- 罕见单词可能引入噪声而没有有意义的贡献。
- 频繁单词可能主导特征空间,除非进行处理。
- 对所有术语赋予同等重要性,缺乏区分能力。
- 对于大型语料库资源密集,可能存在可扩展性问题。
2. 词袋模型(Bag-of-Words,BoW)
词袋模型是一种文本表示技术,它将文档表示为单词及其相应频率的无序集合。它丢弃单词顺序并捕捉文档中每个单词的频率,从而创建一个向量表示。
这是一种非常灵活、直观且易于使用的特征提取方法。文本或句子被表示为唯一单词的计数列表,因此该方法也称为计数向量化。要对文档进行向量化,我们只需统计每个单词的出现次数。
由于词袋模型根据单词的出现次数对单词进行加权,在实践中,最常见的单词如“is”、“the”、“and”通常没有价值。在计数向量化之前,通常会去除停用词(在本系列博客中介绍过)。
例如,假设有以下文档的词汇表:[‘dog’,‘a’,‘live’,‘in’,‘home’,‘hut’,‘the’,‘is’]
词袋模型的局限性如下:
- 忽略单词顺序和上下文,丢失语义含义。
- 高维、稀疏向量可能导致计算效率低下。
- 无法捕捉单词之间的语义相似性。
- 在处理多义词(具有多个含义的单词)和同义词(具有相同含义的单词)方面存在困难。
- 对词汇量和词汇选择敏感。
- 无法捕捉多词短语或表达式
词频 - 逆向文档频率 (TF-IDF)
TF-IDF(词频 - 逆文档频率)是一种用于评估单词在文档集合(或语料库)中相对于特定文档的重要性的数值统计方法。其基本思想是,如果一个单词在某一文档中频繁出现,但在其他许多文档中出现次数较少,那么它应被赋予更高的重要性权重。
对于语料库(D)中的文档(d)里的术语(t),其 TF-IDF 分数是由两个指标的乘积计算得出:词频(TF)和逆文档频率(IDF)。
首先,词频(TF)衡量的是一个术语在文档中出现的频繁程度。通常会将其除以文档中的总词数进行归一化处理,以避免对较长文档产生偏差。例如,在一个包含(100)个单词的文档中,如果单词“apple”出现了(5)次,那么其 TF 值为(5 / 100 = 0.05)。
其次,逆文档频率(IDF)用于衡量一个术语在整个语料库中的重要性。它会降低在许多文档中都出现的术语的权重,而增加在较少文档中出现的术语的权重。计算公式为(IDF = \log\frac{|D|}{|{d:t\in d}| + 1}),其中(|D|)是语料库中的文档总数,(|{d:t\in d}|)是包含术语(t)的文档数量。分母中加(1)是为了防止在术语未在任何文档中出现时出现除零错误。
最后,将词频(TF)值与逆文档频率(IDF)值相乘,即可得到术语(t)在文档(d)中的 TF-IDF 分数:(TF - IDF = TF\times IDF)。
TF-IDF 的重要性在于它有助于识别文档中的重要单词,在信息检索和文本挖掘等领域有着广泛的应用。例如,在搜索引擎中,通过计算查询词与文档中单词的 TF-IDF 值,可以找到与查询最相关的文档。
以下是使用 Python 的 sklearn.feature_extraction.text 模块中的 TfidfVectorizer 进行 TF-IDF 计算的示例代码:
from sklearn.feature_extraction.text import TfidfVectorizer
documents = ["The cat sat on the mat.","The cat sat on the bed.","The dog barked."
]
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)
feature_names = vectorizer.get_feature_names_out()
tfidf_array = tfidf_matrix.toarray()
print("Feature Names (Words):", feature_names)
print("\nTF-IDF Matrix:")
print(tfidf_array)
输出结果如下:
Feature Names (Words): ['barked', 'bed', 'cat', 'dog', 'mat', 'on', 'sat', 'the']
TF-IDF Matrix:
[[0. 0. 0.37420726 0. 0.49203758 0.374207260.37420726 0.58121064][0. 0.49203758 0.37420726 0. 0. 0.374207260.37420726 0.58121064][0.65249088 0. 0. 0.65249088 0. 0.0. 0.38537163]]
在这个示例中,我们可以看到,在不同的文档中,每个单词都有其对应的 TF-IDF 值。例如,在第一个文档中,“mat”的 TF-IDF 值相对较高,说明它在该文档中具有一定的重要性,且在其他文档中出现频率相对较低。
然而,TF-IDF 也存在一些局限性。它并没有真正捕捉到单词的上下文或语义含义,只是基于词频和文档频率进行计算。对于大规模的词汇表,会产生高维和稀疏的向量,这可能会导致计算效率低下和存储问题。同时,它在处理同义词和多义词方面效果不佳,不能区分具有相同语义但形式不同的单词,也难以处理一个单词在不同上下文中具有不同含义的情况。此外,TF-IDF 可能会对较长的文档过度惩罚,因为长文档中的单词数量较多,即使某些单词并非真正重要,其 TF 值也可能较高。而且它仅限于线性关系,无法捕捉复杂的语言模式,是静态的,不能适应新的上下文或不断演变的语言。对于非常短或非常长的文档,其效果也不太理想,并且对单词顺序不敏感。
相关文章:
LLM架构从基础到精通之词向量1
自然语言处理中的词嵌入:从基础到应用 在自然语言处理(NLP)领域,词嵌入是一个极为关键的概念。它本质上是一种将单词转换为连续向量空间中的数值表示(即向量)的方法,旨在捕捉单词的语义信息&am…...
【SQL】Delete使用
目录 语法 需求 示例 分析 代码 语法 DELETE删除表中所需内容 删除表中满足特点条件的行:DELETE FROM 表名 WHERE 条件; 删除表中所有行:DELETE FROM 表名; WHERE子句 WHERE子句用于指定从表中选取记录的条件。允许筛选数据,只返回满足…...
KBQA前沿技术
文章目录 KBQA面临的挑战基于模板的方法基于语义解析的方法基于深度学习的传统问答基于深度学习的端到端问答模型KBQA面临的挑战 目前还存在两个很大的困难阻碍着KBQA系统被广泛应用。一个困难是现有的自然语言理解技术在处理自然语言的歧义性和复杂性方面还显得比较薄弱。例如…...
跨年烟花C++代码
嘿,朋友们!今天来给大家讲讲一段挺有意思的C代码呀,这段代码主要是用来实现一个烟花效果展示的程序哦,下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…...
centos服务器 /1ib64/libm.so.6: version “GLIBc 2.27’ not found 异常
centos服务器 /1ib64/libm.so.6: version “GLIBc 2.27’ not found 异常 问题 在服务器使用open3d时,报错缺失GLIBC_2.27,因为后续操作出问题会导致服务器挂,所以最好先备份一下。 解决 查询glibc版本 输入指令查询系统glibc版本&#x…...
职场:如何快速适应职场新环境?
快速适应职场新环境是每个新员工都需要面对的重要挑战。为了能够顺利过渡并尽快融入新团队,以下是一些实用的策略: 1. 保持积极心态 开放心态:进入新环境时,保持开放的心态对于适应变化至关重要。要愿意接受新的挑战,…...
axios的替代方案onion-middleware
onion-middleware的由来 嗯。。。闲来无事瞎搞的!!!!主要用来实现请求/相应拦截,当然队列性的数据操作都是可以的 直接上使用教程 安装 npm install onion-middleware使用 import { OnionMiddleware } from onion…...
设计模式——泛型单例类
游戏中很多管理类都需要写成单例类,每次重复把管理类设置为单例类很繁琐, 这里直接写一个泛型单例类作为模板父类,方便其他需要写成单例类的类直接继承设置为单例类; using UnityEngine;public class Singleton<T> : Mono…...
三维卷积( 3D CNN)
三维卷积( 3D CNN) 1.什么是三维卷积 1.1 三维卷积简介 二维卷积是在单通道的一帧图像上进行滑窗操作,输入是高度H宽度W的二维矩阵。 三维卷积输入多了深度C这个维度,输入是高度H宽度W深度C的三维矩阵。在卷积神经网络中&…...
【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
分享3个国内使用正版GPT的网站【亲测有效!2025最新】
1. molica 传送入口:https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口:https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口:https://ai-to.cn/url/?ulihaimao...
CSDN Markdown编辑器设置视频居中完美解决方案
表格做中间容器,把视频放在表格里面,利用表格居中语法实现表格内元素居中对齐,从而完美实现视频居中。 【三角符文】jevil战无伤通关 这玩意整了我两个星期,焦头烂额都找不到解决方案。今天偶然想到可以用表格试试,没想…...
Java到底是值传递还是引用传递????
在搞懂这个问题之前, 我们要首先了解什么是值传递, 什么是引用传递? 值传递: 传递的是数据的副本,修改副本不会影响原始数据。引用传递: 传递的是数据的引用(地址),修改引用会直接影响原始数据. 也就是说,值传递和引…...
初学stm32 --- 电源监控
目录 STM32 电源监控介绍 上电/掉电复位POR/PDR(F1) 可编程电压检测器(PVD)(F1) PVD相关寄存器介绍(F1) 电源控制寄存器 PWR_CR 电源控制/状态寄存器 PWR_CSR PVD相关HAL库驱动介绍 PVD的使用步骤 …...
Win10本地部署大语言模型ChatGLM2-6B
鸣谢《ChatGLM2-6B|开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行,在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…...
[ LeetCode 75 ] 1768. 交替合并字符串
题目描述:(相关标签:双指针、字符串) 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返…...
(三)通过WebGL绘制一个简单的三角形来理解渲染管线
理解 WebGL 绘图原理的关键是了解它的渲染管线。WebGL 渲染管线实际上是由多个阶段组成的,每个阶段都有特定的任务,最终输出的是屏幕上的图像。为了让你能轻松理解这些原理,我将通过一个简单的例子来详细解释。 绘制一个简单的三角形 我们将…...
医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件
3D Slicer 是一款功能全面的开源医学影像分析软件,广泛应用于影像处理、三维建模、影像配准和手术规划等领域。它支持多种医学影像格式(如 DICOM、NIfTI)和丰富的插件扩展,是神经科学、放射学和生物医学研究中不可或缺的工具。 在…...
Ollama VS LocalAI:本地大语言模型的深度对比与选择指南
随着人工智能技术的快速发展,大语言模型逐渐成为多个行业的重要工具。从生成内容到智能问答,大模型展现了强大的应用潜力。然而,云端模型的隐私性、使用成本和网络依赖等问题也促使更多用户关注本地化解决方案。Ollama 和 LocalAI 是近年来备…...
虚表 —— 隐藏行(简单版)
因为隐藏行改变了listview内部行号处理机制,需要处理大量细节,如listview内部用于传递行号的各种消息、通知等、封装的各种读取行号的函数等。 所以在工作量很大,一处纰漏可能导致重大bug的情况下,仅对隐藏行功能进行了简单封装&…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
