几种主流词嵌入技术详解
NLP 中的词嵌入概述
自然语言处理(NLP)中的**词嵌入(Word Embedding)**是一个核心术语,用于以实值向量的形式表示文本分析中的单词。这是 NLP 领域的一项重大进步,显著提高了计算机理解基于文本内容的能力。它被认为是深度学习在解决具有挑战性的自然语言处理问题方面最重要的突破之一。
自然语言处理中常用的词嵌入技术,包括 TF-IDF、词袋模型(BOW)、Word2Vec、GloVe 以及 BERT。文章详细阐述了各技术的原理、优缺点及适用场景,并通过代码示例展示了如何实现词向量化。词嵌入将单词转换为低维实值向量,有效捕捉语义信息,是深度学习在 NLP 任务的基础。重点对比了传统统计方法与基于神经网络的深度学习方法,并提供了 Python 实现代码。

自然语言处理(NLP)中的**词嵌入(Word Embedding)**是一个核心术语,用于以实值向量的形式表示文本分析中的单词。这是 NLP 领域的一项重大进步,显著提高了计算机理解基于文本内容的能力。它被认为是深度学习在解决具有挑战性的自然语言处理问题方面最重要的突破之一。
在这种方法中,单词和文档被转换为数字向量,使得语义相似的单词拥有相似的向量表示。提取的特征被输入到机器学习模型中,以便处理文本数据并保留语义和句法信息。这些信息一旦以转换后的形式接收,就会被 NLP 算法使用,这些算法可以轻松消化这些学习到的表示并处理文本信息。
由于这项技术带来的巨大优势,ML NLP 的受欢迎程度正在飙升,使其成为最受开发人员欢迎的技术之一。
现在您已经对该主题有了基本的了解,让我们从头开始向您介绍词嵌入、其技术和应用。
词嵌入或词向量是我们用来表示文档和单词的一种方法。它被定义为一个数字向量输入,允许具有相似含义的单词具有相同的表示。它可以近似含义并在较低维空间中表示单词。这些可以比使用 WordNet 等图形嵌入的手工构建模型训练得更快。
例如,具有 50 个值的词嵌入可以表示 50 个独特特征。许多人选择预先训练的词嵌入模型,如 Flair、fastText、SpaCy 等。
假设我们有一个监督学习任务,需要预测哪些推文与真实灾难有关,哪些不是(分类任务)。这里的独立变量是推文(文本),目标变量是二进制值(1:真实灾难,0:非真实灾难)。
机器学习和深度学习算法只接受数字输入。那么,我们如何将推文转换为数值呢?我们将深入研究解决此类问题的技术,但首先让我们看看词嵌入提供的解决方案。
NLP 中的词向量是一种将单个单词表示为低维空间中的实值向量并捕获单词间语义的技术。每个单词都由具有数十或数百维的实值向量表示。
词频 - 逆文档频率(TF-IDF)是用于文本词向量化的经典机器学习算法,包含两个指标,即词频(TF)和逆文档频率(IDF)。
该算法采用统计测量来查找文本中的词语相关性,文本可以是单个文档的形式,也可以是称为语料库的各种文档的形式。
TF-IDF 算法可用于解决信息检索、停用词删除、关键词提取和基本文本分析等较简单的自然语言处理和机器学习问题。然而,它无法有效地捕捉序列中单词的语义关系。
为了创建 TF-IDF 向量,我们通常使用 Scikit-learn 的 TfidfVectorizer。将其应用于示例推文后,我们会得到一个矩阵,其中行表示每篇文档,列表示词汇表。
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
# 示例推文列表
texts = [
"真可惜",
"发誓果酱让世界燃烧",
"发誓真正的车祸",
"不幸的是,汽车着火了"
]
# 初始化向量器
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
# 输出稀疏矩阵
print(X.toarray())
print(vectorizer.get_feature_names_out())
得到的这个矩阵可以和目标变量一起用来训练机器学习/深度学习模型。
词袋(Bag of Words, BOW)是一种流行的文本词嵌入技术,其中向量中的每个值代表文档/句子中的单词数。换句话说,它从文本中提取特征。我们也称之为矢量化。
为了帮助您入门,下面介绍了如何创建 BOW 的步骤:
下面我们将在连续词选择袋中用适当的例子来讨论 BOW。
from sklearn.feature_extraction.text import CountVectorizer
# 示例推文
sentences = [
"真可惜",
"发誓果酱让世界燃烧",
"发誓真正的车祸",
"不幸的是,汽车着火了"
]
# 创建词袋模型
bow = CountVectorizer()
bow_matrix = bow.fit_transform(sentences)
# 查看结果
print(bow_matrix.toarray())
print(bow.get_feature_names_out())
这里的行代表每个文档(在我们的例子中为 4 个),列代表词汇表(所有文档中唯一的单词),值代表相应行的单词数。
同样,我们可以将 CountVectorizer 应用于完整的训练数据推文,并获得一个矩阵,该矩阵可与目标变量一起用于训练机器学习/深度学习模型。
Word2Vec 方法由 Google 于 2013 年开发。目前,我们将该技术用于所有高级 NLP 问题。它是为了训练词嵌入而发明的,基于分布假设。
在这个假设中,它使用 skip-gram 或连续词袋(CBOW)。这些基本上是浅层神经网络,具有输入层、输出层和投影层。它通过考虑单词在历史和未来的顺序来重建单词的语言上下文。
该方法涉及对文本语料库进行迭代以学习单词之间的关联。它依赖于一个假设,即文本中的相邻单词彼此具有语义相似性。它有助于将语义相似的单词映射到几何上接近的嵌入向量。
它使用余弦相似度度量来测量语义相似度。余弦相似度等于 Cos(角度),其中角度是在两个单词/文档的向量表示之间测量的。
总而言之,我们可以说这个度量标准为相同的板分配了相似的向量表示。
Word2Vec 有两种基于神经网络的变体:连续词袋(CBOW)和 Skip-gram。
连续词袋变体包括所采用的各种输入。由此,它可以预测与作为输入的不同单词的上下文密切相关的目标单词。它是一种快速且很好的方法,可以为经常出现的单词找到更好的数字表示。
在 CBOW 中,我们定义一个窗口大小。中间的单词是当前单词,周围的单词(过去和未来的单词)是上下文。CBOW 利用上下文来预测当前单词。每个单词都使用定义的词汇表中的 One Hot Encoding 进行编码,然后发送到 CBOW 神经网络。
隐藏层是标准的全连接密集层。输出层根据词汇表生成目标词的概率。
Skip-gram 是一种与 CBOW 略有不同的词嵌入技术,因为它不根据上下文预测当前单词。相反,每个当前单词与连续投影层一起用作对数线性分类器的输入。这样,它可以预测当前单词前后一定范围内的单词。
这个变体只接受一个单词作为输入,然后预测与之密切相关的上下文单词。这就是它能够有效表示稀有词的原因。
Word2Vec(两种变体)的最终目标是学习隐藏层的权重。隐藏的结果将用作我们的词嵌入!
from gensim.models import Word2Vec
import nltk
import re
from nltk.corpus import stopwords
# 导入库
# from gensim.models import Word2Vec
# import nltk
# import re
# from nltk.corpus import stopwords
# 预处理文本
# Word2Vec inputs a corpus of documents split into constituent words.
corpus = []
for i in range(0, len(X)):
tweet = re.sub("[^a-zA-Z]", " ", X[i])
tweet = tweet.lower()
tweet = tweet.split()
corpus.append(tweet)
# 训练模型
model = Word2Vec(corpus, vector_size=100, window=5, min_count=1, workers=4)
# 查找最相似的词
similar_words = model.wv.most_similar('disaster')
print(similar_words)
# 获取嵌入向量
disaster_vector = model.wv['disaster']
print(disaster_vector)
现在让我们讨论一下迄今为止讨论过的两种文本矢量化技术所面临的挑战。
在 BOW 中,向量的大小等于词汇表中元素的数量。如果向量中的大多数值为零,则词袋将是一个稀疏矩阵。稀疏表示更难建模,这既出于计算原因,也出于信息原因。
此外,BOW 缺乏有意义的关系,也没有考虑单词的顺序。以下是此词嵌入技术的更多挑战:
TF-IDF 模型虽然包含了比较重要的词语和不太重要的词语的信息,但是它并没有解决高维性和稀疏性的难题,而且与 BOW 不同,它也没有利用词语之间的语义相似性。
NLP 中的 GloVe 词嵌入方法由斯坦福大学的 Pennington 等人开发。它被称为全局向量,因为模型直接捕获了全局语料库统计数据。它在世界类比和命名实体识别问题中表现出色。
该技术降低了训练模型的计算成本,因为最小二乘成本或误差函数更简单,从而进一步产生了不同的、改进的词嵌入。它利用局部上下文窗口方法(如 Mikolov 的 skip-gram 模型)和全局矩阵分解方法来生成低维词表示。
潜在语义分析 (LSA) 是一种全局矩阵分解方法,它在世界类比方面表现不佳,但利用了指示次优向量空间结构的统计信息。
相反,Skip-gram 方法在类比任务上表现更好。然而,由于没有对全局共现计数进行训练,它没有充分利用语料库的统计数据。
因此,与使用局部上下文创建词向量的 Word2Vec 不同,GloVe 专注于全局上下文来创建词向量,这使其比 Word2Vec 更具优势。在 GloVe 中,单词之间的语义关系是使用共现矩阵获得的。
考虑两句话:
对于上面的句子,GloVe 中涉及的共现矩阵如下所示。该矩阵中的每个值代表与行/列中相应单词共现的次数。请注意,该共现矩阵是使用全局单词共现计数(单词连续出现的次数;窗口大小=1)创建的。如果文本语料库有 1m 个唯一单词,则共现矩阵的形状为 1m x 1m。GloVe 背后的核心思想是,单词共现是模型'学习'单词表示的最重要统计信息。
现在让我们看一个斯坦福大学 GloVe 论文中的例子,了解共现概率比率在 GloVe 中的工作原理。例如,考虑目标词 ice 和 steam 与词汇表中各种探测词的共现概率。
这里,假设 k = solid,即与 ice 相关但与 steam 无关的单词。预期的 Pik /Pjk 比率将很大。同样,对于与 steam 相关但与 ice 无关的单词 k,例如 k = gas,比率将很小。对于 water 或 fashion 等与 ice 和 steam 都相关或与两者都不相关的单词,比率应该约为 1。
与原始概率相比,概率比能够更好地区分相关词(固体和气体)和不相关词(时尚和水)。它还能够更好地区分两个相关词。因此,在 GloVe 中,词向量学习的起点是共现概率的比率,而不是概率本身。
import nltk
import re
from nltk.corpus import stopwords
from glove import Corpus, Glove
# 导入库
# import nltk
# import re
# from nltk.corpus import stopwords
# from glove import Corpus, Glove
# 文本预处理
# GloVe 输入一个文档语料库,将其拆分成组成单词
corpus = []
for i in range(0, len(X)):
tweet = re.sub("[^a-zA-Z]", " ", X[i])
tweet = tweet.lower()
tweet = tweet.split()
corpus.append(tweet)
# 训练词向量
corpus_obj = Corpus()
corpus_obj.fit(corpus, window=5)
glove_model = Glove(no_components=100, learning_rate=0.05)
# no_components = 词嵌入的维数 = 100
glove_model.fit(corpus.matrix, epochs=100, no_threads=4, verbose=True)
glove_model.add_dictionary(corpus.dictionary)
# 查找最相似的
top_words = glove_model.most_similar("storm", num=10)
print(top_words)
BERT(Bidirectional Encoder Representations from Transformers)是一种基于自然语言处理 (NLP) 的语言算法,属于 Transformer 类。它有两种变体,即包含 1.1 亿个参数的 BERT-Base 和具有 3.4 亿个参数的 BERT-Large。
它依靠注意力机制来生成具有语境的高质量词嵌入。因此,当嵌入经过训练过程时,它们会通过每个 BERT 层,以便其注意力机制能够根据左侧单词和右侧单词捕捉单词关联。与传统的单向语言模型不同,BERT 同时考虑了左右两侧的上下文信息,这使得它能够更好地理解多义词和复杂的句法结构。
与上面讨论的相比,这是一种先进的技术,因为它可以创建更好的词嵌入。这要归功于维基百科数据集和海量词库上的预训练模型。通过微调嵌入,可以针对特定任务的数据集进一步改进此技术。
它在语言翻译任务、问答系统、情感分析等方面有着广泛的应用。BERT 的核心创新在于掩码语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)任务,这使得模型能够学习到深度的双向上下文表示。
词嵌入可以训练 GRU、LSTM 和 Transformers 等深度学习模型,这些模型在情绪分类、名称实体识别、语音识别等 NLP 任务中取得了成功。
这是一份最终回顾清单:
在这篇文章中,我们讨论了 NLP 中的多种向量化技术:词袋和 TF-IDF,它们的缺点,以及 GloVe 和 Word2Vec 等词嵌入技术如何通过降维和上下文相似性克服其缺点。BERT 的出现更是将词嵌入推向了动态上下文表示的新高度。通过以上所述,您将更好地理解词嵌入如何使您的日常生活受益,并为后续深入学习大模型打下基础。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online