AI - 自然语言处理(NLP) - part 2 - 词向量
目录
- NLP(Natural Language Processing,自然语言处理)
- Word Vector/Word Embedding(词向量/词嵌入)
- 什么是词向量?
- 词向量的核心特性:语义关系
- 词向量技术演进
- Bag-of-Words(词袋)
- Word2Vec(Word to Vector, W2V)
- Word2Vec的局限性。
NLP(Natural Language Processing,自然语言处理)
自然语言处理是人工智能的一个子领域,关注计算机如何理解、解释和生成人类语言。
NLP的核心任务就是为人类的语言编码并解码,是人类与计算机沟通的桥梁。
在上一篇文章中总体回顾了NLP的演进过程,接下来深入了解一下每一个阶段产生了哪些具体的技术。
首先来看NLP的基石:词向量
Word Vector/Word Embedding(词向量/词嵌入)
词向量的出现是现代NLP腾飞的基石,它彻底改变了计算机处理自然语言的方式。
词向量(Word Vector)通常也叫词嵌入(Word Embedding),是一种寻找词和词之间相似性的NLP技术,它把词汇各个维度上的特征用数值向量进行表示,利用这些维度上特征的相似程度,就可以判断出哪些词和哪些词语义更接近。
什么是词?
“Gram”这个词来源于希腊语的词根,意为“字母”或“写作”。在N-Gram模型中,它表示文本中的一个元素,“N-Gram”指长度为N的连续元素序列。
这里的“元素”在英文中可以指单词,也可以指字符,有时还可以指“子词”(Subword);而在中文中,可以指词或者短语,也可以指字。
例如中文语句“我爱学习”可以拆分为“我”,“爱”,“学习”
如何分词?
那么在实际应用中,到底应该把语料库拆分成什么元素呢?是字还是词?
如何分词需要具体情况具体分析。在自然语言处理中,一个非常关键的预处理环节就是按照需要对语料库,也就是自然语言数据集中的句子进行分词,分词之后,文本序列就形成了可以输入语言模型的一个个“元素”(或者称为“单元”),这个元素的英文名叫作“Token”。
Token翻译成中文,常常词不达意。有人叫它“令牌”,有人叫它“子词”或者“分词”。总而言之,当你看到Token,就应该知道,我们已经通过分词工具,把语料,也就是一个个句子,切成了能够被语言模型读取并处理的一个个元素。
语料库
语料库是一个按照特定标准收集和组织的、电子形式的、海量文本或语音数据的集合。您可以把它想象成一个为语言研究或模型训练而专门建立的 “语言数据库” 或 “语言素材仓库”。
语料库的关键特征
- 电子化:必须是计算机可读的格式(如 .txt, .jsonl, .xml 等),便于机器处理。
- 代表性:语料库的构建通常有明确目的,其内容需要代表某一特定语言、领域或文体(如新闻语料库、学术论文语料库、口语对话语料库)。
- 规模性:通常容量巨大,从数百万到数千亿甚至万亿个词汇,为大语言模型提供充足的学习素材。
- 结构化:原始的纯文本只是基础。高质量的语料库通常包含元数据 和标注,使其更具价值。
- 元数据:描述数据本身的数据,如文本来源、作者、出版日期、语言、领域等。
- 标注:对文本内容进行的额外加工,如词性标注、语法结构分析、实体识别等。
语料库的来源与类型
类型 描述 示例 网页内容 最大的来源,通过爬虫获取,内容多样但质量参差不齐。 Common Crawl(一个公开的网页爬虫数据集) 书籍与期刊 质量高,语言规范,逻辑性强,是深层次知识的重要来源。 Google Books, 学术论文库 百科全书 事实准确,结构化程度高。 维基百科 代码仓库 用于训练模型的代码理解和生成能力。 GitHub 上的公开代码 对话与社交数据 帮助模型学习日常、口语化的表达方式。 Reddit, 论坛帖子,客服对话记录(需脱敏) 新闻文章 语言规范,时效性强。 各大新闻网站的存档 语料库是大语言模型的 “教科书” 和 “训练食粮”。没有海量、高质量的语料库,就不可能训练出强大的大语言模型。
语料库 是现代自然语言处理和人工智能的基石。它不仅是大语言模型学习和获取知识的唯一源泉,其规模、质量和多样性也直接决定了模型能力的天花板。我们与AI的每一次对话,背后都是它对浩瀚语料库中学习到的模式和知识的综合运用。
向量
在最简单的层面上,一个向量就是一个既有大小又有方向的量。
几何表示
在几何中,我们用一个有向线段来表示向量。
长度:表示向量的大小(模)。
箭头:表示向量的方向。
我们通常用一个小写字母加上箭头来表示,如 a⃗\vec{a}a。
坐标表示(代数表示)
- 在二维平面:
v⃗=(vx,vy)\vec{v} = (v_x, v_y)v=(vx,vy)- 在三维空间:
v⃗=(vx,vy,vz)\vec{v} = (v_x, v_y, v_z)v=(vx,vy,vz)- 在n维空间:
v⃗=(v1,v2,…,vn)\vec{v} = (v_1, v_2, \dots, v_n)v=(v1,v2,…,vn)
向量的核心要素
- 模(长度)
向量 v⃗=(v1,v2,…,vn)\vec{v} = (v_1, v_2, \dots, v_n)v=(v1,v2,…,vn) 的模:
∥v⃗∥=x2+y2\|\vec{v}\| = \sqrt{x^2 + y^2}∥v∥=x2+y2- 方向
对于二维向量 v⃗=(vx,vy)\vec{v} = (v_x, v_y)v=(vx,vy),其方向角 θ\thetaθ 满足:
tanθ=vyvx\tan\theta = \frac{v_y}{v_x}tanθ=vxvy
什么是词向量?
-
核心思想:将人类语言中的词,映射到计算机能够理解的稠密向量上。
- 传统方法(如One-Hot Encoding):
- 每个词是一个独立的、极其冗长的二进制向量。
- 例如:国王 = [1, 0, 0, 0, …],王后 = [0, 1, 0, 0, …],男人 = [0, 0, 1, 0, …]。
- 缺点:
- 维度灾难:词汇表有多大,向量就有多长,计算效率极低。
- 词汇鸿沟:所有向量两两正交,无法表达任何词与词之间的语义关系。计算机认为“国王”和“王后”的距离,与“国王”和“西瓜”的距离是一样的。
-
词向量方法(如Word2Vec):
- 每个词是一个相对短小的稠密向量(例如50维、300维)。
- 例如:国王 ≈ [0.15, -0.82, …, 0.47],王后 ≈ [0.16, -0.81, …, 0.48],男人 ≈ [0.08, -0.71, …, 0.32]。
- 优点:
- 语义编码:向量中蕴含了词的语义和语法信息。
- 可计算的关系:词与词之间的关系可以通过向量的算术运算来体现。
词向量的核心特性:语义关系
词向量最神奇的地方在于它捕捉到了语言的规律。
经典的“国王 - 男人 + 女人 ≈ 王后”例子:
这个例子说明,词向量空间不仅是一个词表,更是一张语义地图,其中方向和距离都具有实际意义。
Word embedding(词向量)
词向量是一种用来表示单词语义的数学表达方式。通俗地说,它可以将每个单词映射到一个多维空间中的一个向量,使得相似意义的单词在这个向量空间中距离较近,而不相关的单词距离较远。
词向量的生成方式有很多种,其中比较常用的方法是基于Word2Vec算法。这种算法通过分析大量文本数据中的上下文关系来学习得到词向量。具体来说,它根据单词在其上下文中出现的频率和位置来确定单词的向量表示,使得在具有相似上下文的单词之间存在相似的向量关系。
使用词向量可以带来很多好处。首先,它可以将单词从离散的符号表示转换为连续的向量表示,方便计算机进行处理和理解。其次,词向量能够捕捉到单词的语义信息,使得计算机可以更好地理解单词之间的关系和含义。这对于自然语言处理任务如文本分类、信息检索和机器翻译等都非常有帮助。
总的来说,词向量是一种用来表示单词语义的数学模型,通过将单词映射到一个多维向量空间中,使得相似意义的单词在向量空间中距离较近。这种表示方式可以提高自然语言处理任务的效果,并且在实际应用中得到广泛应用。
词向量和词嵌入
-
词向量这个术语通常用于描述具体的向量表示,即一个词对应的实际数值向量。例如,我们可以说“'cat’这个词的词向量是一个300维的向量”。
词向量的内涵是把词转化为向量,从而捕捉词与词之间的语义和句法关系,使得具有相似含义或相关性的词语在向量空间中距离较近。 -
词嵌入这个术语通常用于描述将词映射到向量空间的过程或表示方法。它通常包括训练算法和生成的词向量空间。例如,我们可以说“我们使用Word2Vec算法来生成词嵌入”。
词向量技术演进
- Bag-of-Words
- Distributed Representation
- Word2Vec (2013, Google)
- 核心思想:一个词的含义可以由它周围经常出现的词(上下文)来定义。
- 两种训练方式:
- CBOW:通过上下文词来预测中心词。
- Skip-gram:通过中心词来预测上下文词。
- GloVe (2014, Stanford)
核心思想:结合了全局统计信息(整个语料库的词共现矩阵)和局部上下文窗口的优点。 - FastText (2016, Facebook)
- 核心思想:将词表示为子词(n-gram)的集合。例如,“apple”由 “app”, “ppl”, “ple” 等表示。
- 巨大优势:可以生成未登录词的向量,对于形态丰富的语言(如德语、土耳其语)和拼写错误非常有效。
Bag-of-Words(词袋)
词袋模型是一种简单的文本表示方法,它将文本中的词看做一个个独立的个体,不考虑他们在句子中的顺序,只关心每个词出现的频次。
Bag-of-Words则是一种用于文本表示的技术,它将文本看作由单词构成的无序集合,通过统计单词在文本中出现的频次来表示文本。因此,Bag-of-Words主要用于文本分类、情感分析、信息检索等自然语言处理任务中。
- Bag-of-Words是基于词频将文本表示为一个向量,其中每个维度对应词汇表中的一个单词,其值为该单词在文本中出现的次数。
- Bag-of-Words忽略了文本中的词序信息,只关注词频。这使得词袋模型在某些任务中表现出色,如主题建模和文本分类,但在需要捕捉词序信息的任务中表现较差,如机器翻译和命名实体识别。
- Bag-of-Words可能会导致高维稀疏表示,因为文本向量的长度取决于词汇表的大小。为解决这个问题,可以使用降维技术,如主成分分析(Principal Component Analysis,PCA)或潜在语义分析(Latent Semantic Analysis,LSA)。
Bag-of-Words模型的构建过程如下:
- 构建语料库
例如有下数据集:[“我爱学习”,“我讨厌学习”,“我非常非常爱学习”] - 给句子分词
例如“我爱学习”,分词结果为[“我”,“爱”,“学习”] - 创建词汇表
家所有语句的分词结果合并为一个词汇表:{“我”:3,“爱”:2,“学习”:3,“讨厌”:1,“非常”:2},数字为词频 - 生成词袋表示
为语料库中的每一个语句生成一个向量表示:
[[1,1,1,0,0],
[1,0,1,1,0],
[1,1,1,0,2]]
数字表示词频 - 计算余弦相似度
计算余弦相似度(Cosine Similarity),衡量两个文本向量的相似性。
余弦相似度可用来衡量两个向量的相似程度。
它的值在-1到1之间,值越接近1,表示两个向量越相似;值越接近-1,表示两个向量越不相似;当值接近0时,表示两个向量之间没有明显的相似性。
余弦相似度的计算公式如下:
cosine_similarity(A,B)=A⋅B∥A∥∥B∥cosine\_similarity(A, B) = \frac{A \cdot B}{\|A\| \|B\|}cosine_similarity(A,B)=∥A∥∥B∥A⋅B
其中,A⋅BA \cdot BA⋅B表示向量A和向量B的点积,∥A∥\|A\|∥A∥ 和 ∥B∥\|B\|∥B∥分别表示向量A和向量B的范数(长度)。在文本处理中,我们通常使用余弦相似度来衡量两个文本在语义上的相似程度。对于词袋表示的文本向量,使用余弦相似度计算文本之间的相似程度可以减少句子长度差异带来的影响。
点积
向量点积,也称为数量积或内积,是向量运算中一种非常重要的运算。它的结果是一个标量(一个数字),而不是一个向量。
点积有两种主要的定义方式:代数定义和几何定义 。它们是等价的,但分别从不同角度帮助我们理解点积。
代数定义
对于两个n维向量,它们的点积是各对应分量乘积之和。
二维向量:
a⃗⋅b⃗=a1b1+a2b2\vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2a⋅b=a1b1+a2b2
三维向量:
a⃗⋅b⃗=a1b1+a2b2+a3b3\vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2 + a_3 b_3a⋅b=a1b1+a2b2+a3b3
n维向量
a⃗⋅b⃗=∑i=1naibi=a1b1+a2b2+⋯+anbn\vec{a} \cdot \vec{b} = \sum_{i=1}^{n} a_i b_i = a_1 b_1 + a_2 b_2 + \cdots + a_n b_na⋅b=∑i=1naibi=a1b1+a2b2+⋯+anbn
几何定义
从几何角度看,点积描述了两个向量在方向上的相似程度。
给定两个向量 a⃗\vec{a}a 和 b⃗\vec{b}b,它们的夹角为 θ,则点积定义为:
a⃗⋅b⃗=∣a⃗∣∣b⃗∣cosθ\vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos\thetaa⋅b=∣a∣∣b∣cosθ
Word2Vec(Word to Vector, W2V)
最著名的词向量学习算法叫作Word2Vec(Word to Vector, W2V),它的核心思想是在将词映射到向量空间是,会将这个词和它周围的一些词语一起学习,这就使得具有相似语义的词在向量空间中靠得更近。这样,我们就可以通过向量之间的距离来度量词之间的相似性了。
Word2Vec采用了一种高效的方法来学习词汇的连续向量表示,这种方法将词汇表中的每个词都表示成固定长度的向量,从而使在大规模数据集上进行训练变得可行。
稀疏向量
在稀疏向量中,大部分元素的值为零,只有少数元素的值非零。稀疏向量通常用于表示高维数据,其中许多维度的值为零,词袋模型就是一种稀疏向量表示。在词袋模型中,每个文档用一个向量表示的长度等于词汇表中的词数量,向量的每个元素表示相应问在又档中出现的次物流的由于大部分单词可能不会出现在给定文档中,因此词袋模型中的回重通常是稀的而我们常用的One-Hot编码,当然更是稀疏了,每一个One-Hot编码中,有大量的0,而只有一个1。
稠密向量
稠密向量中的元素大部分为非零值。稠密向量通常具有较低的维度,同时能够捕捉到更丰富的信息。Word2Vec就是一种典型的稠密向量表示。稠密向量能够捕捉词与词之间的语义和语法关系,使得具有相似含义或相关性的词在向量空间中距离较近。
具体来说,Word2Vec有两种主要实现方式
- CBOW(Continuous Bag of Words,有时翻译为“连续词袋”)模型
- Skip-Gram(有时翻译为“跳字”)模型。
CBOW模型通过给定上下文词(也叫“周围词”)来预测目标词(也叫“中心词”);而Skip-Gram模型则相反,通过给定目标词来预测上下文词。这两个模型都是通过训练神经网络来学习词向量的。在训练过程中,我们通过最小化预测词和实际词之间的损失来学习词向量。当训练完成后,词向量可以从神经网络的权重中提取出来。
模型 | 训练目标 | 结构 | 性能 |
---|---|---|---|
Skip-Gram模型 | 给定一个目标词,预测上下文词。因此,它的训练目标是在给定目标词的情况下,使上下文词出现的条件概率最大化 | 模型首先将目标词映射到嵌入向量空间,然后从嵌入向量空间映射回词汇表空间以预测上下文词的概率分布 | 由于其目标是预测多个上下文词,其在捕捉稀有词和更复杂的词语关系方面表现得更好 |
CBOW 模型 | 给定上下文词,预测目标词。因此,它的训练目标是在给定上下文词的情况下,使目标词出现的条件概率最大化 | 模型首先将上下文词映射到嵌入向量空间,然后从嵌入向量空间映射回词汇表空间以预测目标词的概率分布 | 由于其目标是预测一个目标词,其在训练速度和捕捉高频词语关系方面表现得更好 |
Bag-of-Words是一种简单的分布式表示方法,它将文本表示为单词计数或权重的向量。这种表示方法捕获了文本中单词的频率信息,但忽略了单词的顺序和上下文关系。
因此,Bag-of-Words的表达能力较弱,特别是不太善于捕获单词之间的语义关系。
Word2Vec 是一种更先进的分布式表示方法,它通过学习单词在上下文中的共现关系来生成低维、密集的词向量。这种表示方法能够捕获单词之间的语义和语法关系,并在向量空间中体现这些关系。与Bag-of-Words相比,Word2Vec的表达能力更强,计算效率更高。
特点 | Bag-of-Words | Word2Vec |
---|---|---|
稀疏性 vs 密集性 | 高维稀疏向量,计算效率低 | 低维密集向量,计算效率更高 |
上下文无关vs上下文敏感 | 忽略上下文信息 | 能够捕获单词之间的上下文关系 |
语义关系 | 无法捕捉单词之间的语义关系 | 能捕获单词之间的语义和语法关系 |
参数共享 | 每个单词的向量表示都是唯一的 | 参数共享,能够减少参数数量,提高泛化能力 |
我们可以将Bag-of-Words和Word2Vec看作分布式表示的演进过程中的两个重要阶段,其中Word2Vec技术更先进,表达能力更强。从词袋模型到词向量的发展,表明自然语言处理领域在表示单词和处理语义方面取得了重要进展。
Word2Vec对整个自然语言处理领域产生了巨大的影响。后来的许多词嵌入方法,如GloVe和fastText这两种被广泛应用的词向量,都受到了Word2Vec的启发。如今,Word2Vec已经成为词嵌入领域的基石。它的出现使得更复杂的NLP任务,如文本分类、情感分析、命名实体识别、机器翻译等,处理起来更轻松。这主要是因为Word2Vec生成的词向量能够捕捉到单词之间的语义和语法关系。
Word2Vec的局限性。
-
词向量的大小是固定的。Word2Vec这种“在全部语料上一次习得,然后反复使用”的词向量被称为静态词向量。它为每个单词生成一个固定大小的向量,这限制了模型捕捉词义多样性的能力。在自然语言中,许多里问具有多种含义,Word2Vec无法为这些不同的含义生成多个向量表示。
-
无法处理未知词汇。Word2Vec只能为训练过程中出现过的单词生成词向趣对于未知或低频词汇,Word2Vec无法生成合适的向量表示。虽然可以通过拼接词的等方法来解决这个问题,但这并非Word2Vec本身的功能。
值得注意的是,Word2Vec本身并不是一个完善的语言模型,因为语言模型的目标是根据上下文预测单词,而Word2Vec主要关注生成有意义的词向量。尽管CBOW和Skip-Gram 模型在训练过程中学习了单词之间的关系,但它们并未直接对整个句子的概率分布进行建模。而后来的模型,如基于循环神经网络、长短期记忆网络和Transformer的模型,则通过对上下文进行建模,更好地捕捉到了语言结构,从而成为更为强大的语言模型。