几种Word Embedding技术详解
几种Word Embedding技术详解
词嵌入(Word Embedding)是自然语言处理(NLP)中的一个重要概念,它将单词映射为实值向量,使得计算机能够更好地理解和处理文本数据。本文将详细介绍几种常见的词嵌入技术,包括TF-IDF、词袋模型(BOW)、Word2Vec、GloVe和BERT,帮助读者全面了解这些技术的原理、应用场景和优缺点。
什么是词嵌入?
词嵌入或词向量是一种表示文档和单词的方法。它被定义为一个数字向量输入,允许具有相似含义的单词具有相同的表示。它可以近似含义并在较低维空间中表示单词。这些可以比使用WordNet等图形嵌入的手工构建模型训练得更快。
例如,具有50个值的词嵌入可以表示50个独特特征。许多人选择预先训练的词嵌入模型,如Flair、fastText、SpaCy等。
词频-逆文档频率 (TF-IDF)
词频-逆文档频率是用于文本词向量化的机器学习算法,包含两个指标,即词频(TF)和逆文档频率(IDF)。
该算法采用统计测量来查找文本中的词语相关性,文本可以是单个文档的形式,也可以是称为语料库的各种文档的形式。
词频 (TF) 分数衡量的是特定文档中单词出现的频率。简单来说,就是统计文档中单词出现的次数。
逆文档频率或 IDF 分数衡量文本中单词的稀有性。它比词频分数更重要,因为尽管 TF 分数赋予频繁出现的单词更多权重,但 IDF 分数关注的是语料库中可能包含重要信息的罕见单词。
TF-IDF 算法可用于解决信息检索、停用词删除、关键词提取和基本文本分析等较简单的自然语言处理和机器学习问题。然而,它无法有效地捕捉序列中单词的语义。
词袋模型(BOW)
词袋是一种流行的文本词嵌入技术,其中向量中的每个值代表文档/句子中的单词数。换句话说,它从文本中提取特征。我们也称之为矢量化。
为了帮助您入门,下面介绍了如何创建 BOW:
- 首先将文本标记成句子。
- 将第一步标记化的句子进一步标记化为单词。
- 删除所有停用词或标点符号。
- 将所有单词转换为小写。
- 创建单词的频率分布图。
Word2Vec
Word2Vec 方法由 Google 于 2013 年开发。目前,我们将该技术用于所有高级自然语言处理(NLP) 问题。它是为了训练词嵌入而发明的,基于分布假设。
在这个假设中,它使用 skip-gram 或连续词袋(CBOW)。这些基本上是浅层神经网络,具有输入层、输出层和投影层。它通过考虑单词在历史和未来的顺序来重建单词的语言上下文。
该方法涉及对文本语料库进行迭代以学习单词之间的关联。它依赖于一个假设,即文本中的相邻单词彼此具有语义相似性。它有助于将语义相似的单词映射到几何上接近的嵌入向量。
它使用余弦相似度度量来测量语义相似度。余弦相似度等于 Cos(角度),其中角度是在两个单词/文档的向量表示之间测量的。
- 如果余弦角为 1,则表示单词重叠。
- 如果余弦角是直角或者90°,则表示单词之间没有上下文相似性,是相互独立的。
总而言之,我们可以说这个度量标准为相同的板分配了相似的向量表示。
Word2Vec 的两种变体
Word2Vec 有两种基于神经网络的变体:连续词袋(CBOW)和 Skip-gram。
1. CBOW- 连续词袋变体包括神经网络模型所采用的各种输入。由此,它可以预测与作为输入的不同单词的上下文密切相关的目标单词。它是一种快速且很好的方法,可以为经常出现的单词找到更好的数字表示。让我们了解 CBOW 的上下文和当前单词的概念。
在 CBOW 中,我们定义一个窗口大小。中间的单词是当前单词,周围的单词(过去和未来的单词)是上下文。CBOW 利用上下文来预测当前单词。每个单词都使用定义的词汇表中的 One Hot Encoding 进行编码,然后发送到 CBOW 神经网络。
隐藏层是标准的全连接密集层。输出层根据词汇表生成目标词的概率。
正如我们之前讨论过的词袋(BOW)以及它也被称为矢量化器,我们将在这里举一个例子来进一步阐明它。
让我们从灾难推文中选取一小部分(4 条推文)来了解 BOW 的工作原理:
“真可惜”,
“发誓果酱让世界燃烧”,
“发誓真正的车祸”,
“不幸的是,汽车着火了”
为了创建 BOW,我们使用 Scikit-learn 的 CountVectorizer,它可以对文本文档集合进行标记,构建已知单词的词汇表,并使用该词汇表对新文档进行编码。
CountVectorizer 的输出
这里的行代表每个文档(在我们的例子中为 4 个),列代表词汇表(所有文档中唯一的单词),值代表相应行的单词数。
同样,我们可以将 CountVectorizer 应用于完整的训练数据推文(11,370 篇文档),并获得一个矩阵,该矩阵可与目标变量一起用于训练机器学习/深度学习模型。
2. Skip-gram— Skip-gram 是一种与 CBOW 略有不同的词嵌入技术,因为它不根据上下文预测当前单词。相反,每个当前单词与连续投影层一起用作对数线性分类器的输入。这样,它可以预测当前单词前后一定范围内的单词。
这个变体只接受一个单词作为输入,然后预测与之密切相关的上下文单词。这就是它能够有效表示稀有词的原因。
Word2Vec(两种变体)的最终目标是学习隐藏层的权重。隐藏的结果将用作我们的词嵌入!
现在让我们看看使用 Word2Vec 创建自定义词嵌入的代码:
# 导入必要的库
from gensim.models import Word2Vec
import nltk
import re
from nltk.corpus import stopwords
# 预处理文本
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.wv.most_similar('disaster')
词袋模型和 TF-IDF 面临的挑战
现在让我们讨论一下迄今为止讨论过的两种文本矢量化技术所面临的挑战。
在 BOW 中,向量的大小等于词汇表中元素的数量。如果向量中的大多数值为零,则词袋将是一个稀疏矩阵。稀疏表示更难建模,这既出于计算原因,也出于信息原因。
此外,BOW 缺乏有意义的关系,也没有考虑单词的顺序。以下是此词嵌入技术的更多挑战。
- 大量权重:大量输入向量会为神经网络带来大量权重。
- 没有有意义的关系或对词序的考虑:词袋不考虑单词在句子或文本中出现的顺序。
- 计算密集型:重量越大,需要更多的计算来训练和预测。
TF-IDF模型虽然包含了比较重要的词语和不太重要的词语的信息,但是它并没有解决高维性和稀疏性的难题,而且与BOW不同,它也没有利用词语之间的语义相似性。
GloVe:用于词语表示的全局向量
NLP 中的 GloVe 词嵌入方法由斯坦福大学的 Pennington 等人开发。它被称为全局向量,因为模型直接捕获了全局语料库统计数据。它在世界类比和命名实体识别问题中表现出色。
该技术降低了训练模型的计算成本,因为最小二乘成本或误差函数更简单,从而进一步产生了不同的、改进的词嵌入。它利用局部上下文窗口方法(如 Mikolov 的 skip-gram 模型)和全局矩阵分解方法来生成低维词表示。
潜在语义分析 (LSA) 是一种全局矩阵分解方法,它在世界类比方面表现不佳,但利用了指示次优向量空间结构的统计信息。
相反,Skip-gram 方法在类比任务上表现更好。然而,由于没有对全局共现计数进行训练,它没有充分利用语料库的统计数据。
因此,与使用局部上下文创建词向量的 Word2Vec 不同,GloVe 专注于全局上下文来创建词向量,这使其比 Word2Vec 更具优势。在 GloVe 中,单词之间的语义关系是使用共现矩阵获得的。
考虑两句话:
- 我是一名数据科学爱好者
- 我正在寻找数据科学工作
对于上面的句子,GloVe 中涉及的共现矩阵如下所示:
窗口大小 = 1
该矩阵中的每个值代表与行/列中相应单词共现的次数。请注意 - 该共现矩阵是使用全局单词共现计数(单词连续出现的次数;窗口大小=1)创建的。如果文本语料库有 1m 个唯一单词,则共现矩阵的形状为 1m x 1m。GloVe 背后的核心思想是,单词共现是模型“学习”单词表示的最重要统计信息。
现在让我们看一个斯坦福大学 GloVe 论文中的例子,了解共现概率比率在 GloVe 中的工作原理。“例如,考虑目标词 ice 和 steam 与词汇表中各种探测词的共现概率。以下是来自 60 亿词语料库的一些实际概率:”
这里,
- 相关但与 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
# 文本预处理
# 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 = Corpus()
corpus.fit(text_corpus, window=5)
glove = Glove(no_components=100, learning_rate=0.05)
# no_components = 词嵌入的维数 = 100
glove.fit(corpus.matrix, epochs=100, no_threads=4, verbose=True)
glove.add_dictionary(corpus.dictionary)
# 查找最相似的 -
glove.most_similar("storm", number=10)
输出 - 单词元组列表及其预测概率
BERT(来自 transformer 的双向编码器表示)
这种基于自然语言处理 (NLP) 的语言算法属于称为transformers的类。它有两种变体,即包含 1.1 亿个参数的 BERT-Base 和具有 3.4 亿个参数的 BERT-Large。
它依靠注意力机制来生成具有语境的高质量世界嵌入。因此,当嵌入经过训练过程时,它们会通过每个 BERT 层,以便其注意力机制能够根据左侧单词和右侧单词捕捉单词关联。
与上面讨论的相比,这是一种先进的技术,因为它可以创建更好的词嵌入。这要归功于维基百科数据集和海量词库上的预趋势模型。通过微调嵌入,可以针对特定任务的数据集进一步改进此技术。
它在语言翻译任务中有着广泛的应用。
结论
词嵌入可以训练 GRU、LSTM 和 Transformers 等深度学习模型,这些模型在情绪分类、名称实体识别、语音识别等 NLP 任务中取得了成功。
这是一份最终回顾清单。
- 词袋模型:从文本中提取特征
- TF-IDF:信息检索,关键词提取
- Word2Vec:语义分析任务
- GloVe:词语类比、命名实体识别任务
- BERT:语言翻译、问答系统
在这篇博客中,我们讨论了 NLP 中的两种向量化技术:词袋和 TF-IDF,它们的缺点,以及GloVe 和 Word2Vec 等词嵌入技术如何通过降维和上下文相似性克服其缺点。通过以上所述,您将更好地理解词嵌入如何使您的日常生活受益。