环保网站案例,佛山网络建设推广,做网站纸箱关键词,个人开小公司的流程自然语言处理中的词嵌入#xff1a;从基础到应用
在自然语言处理#xff08;NLP#xff09;领域#xff0c;词嵌入是一个极为关键的概念。它本质上是一种将单词转换为连续向量空间中的数值表示#xff08;即向量#xff09;的方法#xff0c;旨在捕捉单词的语义信息从基础到应用
在自然语言处理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-vocabularyOOV时存在困难。对文档长度敏感可能引入偏差。罕见单词可能引入噪声而没有有意义的贡献。频繁单词可能主导特征空间除非进行处理。对所有术语赋予同等重要性缺乏区分能力。对于大型语料库资源密集可能存在可扩展性问题。
2. 词袋模型Bag-of-WordsBoW
词袋模型是一种文本表示技术它将文档表示为单词及其相应频率的无序集合。它丢弃单词顺序并捕捉文档中每个单词的频率从而创建一个向量表示。
这是一种非常灵活、直观且易于使用的特征提取方法。文本或句子被表示为唯一单词的计数列表因此该方法也称为计数向量化。要对文档进行向量化我们只需统计每个单词的出现次数。
由于词袋模型根据单词的出现次数对单词进行加权在实践中最常见的单词如“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 值也可能较高。而且它仅限于线性关系无法捕捉复杂的语言模式是静态的不能适应新的上下文或不断演变的语言。对于非常短或非常长的文档其效果也不太理想并且对单词顺序不敏感。