????????欢迎来到“完整的 NLP 指南。到目前为止,我们已经探索了自然语言处理的基础知识、应用程序和挑战。我们深入研究了标记化、文本清理、停用词、词干提取、词形还原、词性标记和命名实体识别。我们的探索包括文本表示技术,如词袋、TF-IDF 以及词嵌入的介绍。然后,我们将 NLP 与机器学习联系起来,涵盖监督和无监督学习、情感分析以及分类和回归的基础知识。最近,我们涉足深度学习,讨论了神经网络、RNN 和 LSTM。现在,我们准备更深入地研究深度学习领域的词嵌入。
以下是第六篇博客文章中的内容:
这篇博文的目的不仅是让您了解这些先进的嵌入技术,还让您掌握在 NLP 项目中实施这些技术时做出明智决策的知识。
????????Word2Vec 是一种流行的词嵌入技术,旨在将单词表示为高维空间中的连续向量。它引入了两种模型:连续词袋(CBOW)和 Skip-gram,每种模型都有助于向量表示的学习。
CBOW 和 Skip-gram 模型都利用神经网络来学习向量表示。神经网络在大型文本语料库上进行训练,调整连接权重以最小化预测误差。此过程将相似的单词在生成的向量空间中放置得更近。
经过训练后,Word2Vec 会在高维空间中为每个单词分配一个唯一的向量。这些向量捕获单词之间的语义关系。具有相似含义或经常出现在相似上下文中的单词具有彼此接近的向量,表明它们的语义相似性。
优点:
缺点:
????????提供的代码示例演示了在玩具数据集上使用 Gensim 库训练 Word2Vec 模型。展示了句子的标记化、模型训练和词嵌入的访问。
from gensim.models import FastText
from nltk.tokenize import word_tokenize
# Toy dataset
sentences = ["FastText embeddings handle subword information.",
"It is effective for various languages."]
# Tokenize sentences
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]
# Train FastText model
model = FastText(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)
# Access embeddings
word_embeddings = model.wv
print(word_embeddings['subword'])
????????总之,Word2Vec 的机制涉及训练神经网络模型(CBOW 和 Skip-gram)来学习有效捕获单词之间语义关系的向量表示。生成的向量在向量空间中提供有意义且有效的单词表示。
????????单词表示的全局向量 (GloVe) 是一种强大的单词嵌入技术,它通过考虑单词在语料库中的共现概率来捕获单词之间的语义关系。GloVe 有效性的关键在于单词上下文矩阵的构建以及后续的分解过程。
????????GloVe 机制的第一步涉及创建单词上下文矩阵。该矩阵旨在表示整个语料库中给定单词出现在另一个单词附近的可能性。矩阵中的每个单元格保存单词在特定上下文窗口中一起出现的频率的共现计数。
让我们考虑一个简化的例子。假设我们的语料库中有以下句子:
单词上下文矩阵可能如下所示:
????????在这里,每一行和每一列对应于语料库中的一个唯一单词,单元格中的值表示这些单词在某个上下文窗口中一起出现的频率。
????????单词上下文矩阵就位后,GloVe 转向矩阵分解。这里的目标是将这个高维矩阵分解为两个较小的矩阵——一个代表单词,另一个代表上下文。我们将它们表示为W(表示单词)和C(表示上下文)。理想的情况是W和CT的点积(C的转置)近似于原始矩阵:
X ≈?W???CT
通过迭代优化,GloVe 调整W和C ,以最小化X和W???CT之间的差异。这个过程为每个单词生成精细的向量表示,捕捉它们共现模式的细微差别。
????????经过训练后,GloVe 会为每个单词提供一个密集向量,该向量不仅捕获本地上下文,还捕获全局单词使用模式。这些向量对语义和句法信息进行编码,根据单词在语料库中的整体用法揭示单词之间的相似性和差异。
优点:
缺点:
????????以下代码片段演示了在玩具数据集上使用 GloVe Python 包的 GloVe 模型的基本用法。该示例涵盖了共现矩阵的创建、GloVe 模型的训练以及词嵌入的检索。
from glove import Corpus, Glove
from nltk.tokenize import word_tokenize
# Toy dataset
sentences = ["Word embeddings capture semantic meanings.",
"GloVe is an impactful word embedding model."]
# Tokenize sentences
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]
# Creating a corpus object
corpus = Corpus()
# Training the corpus to generate the co-occurrence matrix
corpus.fit(tokenized_sentences, window=10)
# Training the GloVe model
glove = Glove(no_components=100, learning_rate=0.05)
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)
glove.add_dictionary(corpus.dictionary)
# Retrieve and display word embeddings
word = "glove"
embedding = glove.word_vectors[glove.dictionary[word]]
print(f"Embedding for '{word}': {embedding}")
????????总之,GloVe 的词嵌入方法侧重于捕获语料库中的全局词共现模式,提供丰富且有意义的向量表示。这种方法有效地编码了语义和句法关系,根据单词的广泛使用模式提供了单词含义的全面视图。上面的代码示例说明了如何在基本数据集上实现 GloVe 嵌入。
????????FastText 是 Facebook AI Research (FAIR) 开发的一种先进的词嵌入技术,扩展了 Word2Vec 模型。与 Word2Vec 不同,FastText 不仅考虑整个单词,还包含子词信息——单词的一部分,例如 n-gram。这种方法可以处理形态丰富的语言,并更有效地捕获有关单词结构的信息。
????????除了整个单词本身之外,FastText 将每个单词表示为一袋字符 n 元语法。这意味着单词“apple”由单词本身及其组成的 n-gram 表示,如“ap”、“pp”、“pl”、“le”等。这种方法有助于捕获较短单词的含义并提供更好地理解后缀和前缀。
????????与 Word2Vec 类似,FastText 可以使用 CBOW 或 Skip-gram 架构。然而,它在训练期间合并了子字信息。FastText 中的神经网络经过训练,不仅可以基于目标单词,还可以基于这些 n-gram 来预测单词(在 CBOW 中)或上下文(在 Skip-gram 中)。
????????FastText 的一个显着优势是它能够为罕见单词甚至训练期间未见过的单词生成更好的单词表示。通过将单词分解为 n 元语法,FastText 可以根据这些单词的子词单元构建有意义的表示。
优点:
缺点:
以下代码演示了如何在玩具数据集上将 FastText 与 Gensim 库结合使用。它强调了模型训练和访问词嵌入。
from gensim.models import FastText
from nltk.tokenize import word_tokenize
# Toy dataset
sentences = ["FastText embeddings handle subword information.",
"It is effective for various languages."]
# Tokenize sentences
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]
# Train FastText model
model = FastText(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)
# Access embeddings
word_embeddings = model.wv
print(word_embeddings['subword'])
????????总之,FastText 通过合并子词信息丰富了词嵌入景观,使其能够非常有效地捕获语言中的复杂细节并处理罕见或看不见的单词。
# Import necessary libraries
from gensim.models import Word2Vec
from gensim.models import FastText
from glove import Corpus, Glove
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# Toy dataset
toy_data = [
"word embeddings are fascinating",
"word2vec captures semantic relationships",
"GloVe considers global context",
"FastText extends Word2Vec with subword information"
]
# Function to train Word2Vec model
def train_word2vec(data):
model = Word2Vec([sentence.split() for sentence in data], vector_size=100, window=5, min_count=1, workers=4)
return model
# Function to train GloVe model
def train_glove(data):
corpus = Corpus()
corpus.fit(data, window=5)
glove = Glove(no_components=100, learning_rate=0.05)
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)
return glove
# Function to train FastText model
def train_fasttext(data):
model = FastText(sentences=[sentence.split() for sentence in data], vector_size=100, window=5, min_count=1, workers=4)
return model
# Function to plot embeddings
def plot_embeddings(model, title):
labels = model.wv.index_to_key
vectors = [model.wv[word] for word in labels]
tsne_model = TSNE(perplexity=40, n_components=2, init='pca', n_iter=2500, random_state=23)
new_values = tsne_model.fit_transform(vectors)
x, y = [], []
for value in new_values:
x.append(value[0])
y.append(value[1])
plt.figure(figsize=(10, 8))
for i in range(len(x)):
plt.scatter(x[i],y[i])
plt.annotate(labels[i],
xy=(x[i], y[i]),
xytext=(5, 2),
textcoords='offset points',
ha='right',
va='bottom')
plt.title(title)
plt.show()
# Train models
word2vec_model = train_word2vec(toy_data)
glove_model = train_glove(toy_data)
fasttext_model = train_fasttext(toy_data)
# Plot embeddings
plot_embeddings(word2vec_model, 'Word2Vec Embeddings')
plot_embeddings(glove_model, 'GloVe Embeddings')
plot_embeddings(fasttext_model, 'FastText Embeddings')
????????当我们结束对高级词嵌入的探索时,我们 NLP 之旅的下一站将是序列到序列模型、注意力机制和编码器-解码器架构。这些先进技术在机器翻译和摘要等任务中发挥了重要作用,使模型能够专注于输入序列的特定部分。
????????请继续关注下一部分,我们将揭开序列到序列模型的复杂性,揭示注意力机制和编码器-解码器架构的力量。
参考资料:@mervebdurna