NLP

词嵌入模型(Word Embedding Models)

自然语言处理中的词嵌入技术

Posted by 月月鸟 on July 25, 2022

词嵌入模型(Word Embedding Models)是自然语言处理(NLP)中的一种核心技术,旨在将词语映射到高维向量空间中,使得具有相似语义的词语在向量空间中的距离较近。这种向量化表示方式便于计算机理解词语之间的语义关系。


词嵌入模型(Word Embedding Models)详解

1. Word2Vec 详细解析

Word2Vec 是一种将单词转换为向量的模型,通过训练生成能够捕捉单词语义关系的向量表示。其核心思想是,如果两个词经常出现在相同的上下文中,它们在向量空间中的距离会更接近。

架构介绍

Word2Vec 有两种主要的训练架构:

  • CBOW(Continuous Bag of Words):给定上下文预测目标词。
  • Skip-gram:给定目标词预测上下文词。

核心概念

  1. 词向量表示: 每个词被映射为一个向量,这些向量位于高维连续空间中。词向量的维度通常设为 100、200 或 300 维。

  2. 上下文窗口: Word2Vec 使用“窗口”来定义一个词的上下文。窗口大小决定了我们为目标词考虑多少上下文词汇。小窗口适用于短期依赖,大窗口适合捕捉长距离依赖。

  3. 训练方式

    • CBOW:利用上下文词语预测目标词。通过上下文词语的向量加总,预测目标词。
    • Skip-gram:利用目标词预测上下文词。对于稀疏数据,Skip-gram 效果较好,适用于小型数据集。

详细流程解析

Skip-gram 模型

假设有以下句子:

I love playing football

在 Skip-gram 模型中,目标词为 “playing”,我们会预测其上下文词“love”和“football”。该模型通过不断调整词向量,使得常出现于相同上下文中的词向量更接近。

CBOW 模型

同样的句子,CBOW 模型会利用上下文词“love”和“football”来预测目标词“playing”。其目标是整合上下文信息,预测最合适的词。

Word2Vec 的数学原理

Word2Vec 的 Skip-gram 模型通过最小化以下目标函数来进行优化:

[ J(\theta) = - \frac{1}{T} \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j} | w_t) ]

其中:

  • ( T ) 是文本中词的总数。
  • ( c ) 是上下文窗口大小。
  • ( w_t ) 是目标词,( w_{t+j} ) 是上下文词。
  • ( p(w_{t+j} w_t) ) 是给定目标词 ( w_t ) 预测上下文词 ( w_{t+j} ) 的概率。

模型通过最大化上下文词的概率来学习词之间的语义关系。

代码实现

以下代码演示了如何使用 gensim 库训练 Word2Vec 模型:

from gensim.models import Word2Vec

# 示例语料库
sentences = [["I", "love", "playing", "football"],
             ["He", "loves", "playing", "football", "too"],
             ["She", "enjoys", "watching", "football", "games"]]

# 训练 Word2Vec 模型
model = Word2Vec(sentences, vector_size=50, window=2, min_count=1, sg=1)

# 查看词 'football' 的词向量
print(model.wv['football'])

# 找出与 'football' 语义相似的词
print(model.wv.most_similar('football'))

应用场景

Word2Vec 被广泛应用于多个 NLP 任务中,例如:

  1. 语义相似性计算:通过计算词向量的余弦相似度,可以判断两个词的语义相似度。
  2. 情感分析:将词向量作为输入,帮助提升文本分类模型的性能。
  3. 信息检索:通过词向量匹配,可以实现更智能的语义搜索。

2. FastText 详细解析

FastText 是 Facebook 提出的改进版词嵌入模型,在 Word2Vec 的基础上增加了对 字符级 n-gram 的处理,使得模型能够更好地处理未登录词(未见过的词)和拼写错误的问题。

FastText 与 Word2Vec 的区别

  1. Word2Vec
    • 每个词作为单独的单位处理。
    • 无法处理未登录词。
  2. FastText
    • 词被拆分为字符级 n-gram(如“playing”拆解为 pla, lay, ayi, yin, ing)。
    • 支持处理未登录词和拼写错误。

FastText 的优势

  1. 处理未登录词:通过分解为 n-gram 处理新词。
  2. 处理拼写错误:n-gram 使得 FastText 能够处理拼写错误或相似词。
  3. 适用于形态复杂的语言:FastText 对形态丰富的语言(如芬兰语、土耳其语)表现优异。

代码示例

from gensim.models import FastText

# 示例语料库
sentences = [["I", "love", "playing", "football"],
             ["He", "loves", "playing", "football", "too"],
             ["She", "enjoys", "watching", "football", "games"]]

# 训练 FastText 模型
model = FastText(sentences, vector_size=50, window=3, min_count=1)

# 查看词 'football' 的词向量
print(model.wv['football'])

# 找出不存在词 'playful' 的词向量
print(model.wv['playful'])

3. ELMo(Embeddings from Language Models)

ELMo 是 Allen Institute for AI 于 2018 年提出的一种基于双向语言模型(BiLM)的上下文化词嵌入模型。ELMo 能够根据不同的上下文动态生成词向量,捕捉到词语的语境依赖。

ELMo 的创新点

  1. 上下文敏感词向量:ELMo 生成的词向量会根据句子的上下文进行调整。
  2. 多层次嵌入表示:ELMo 为每个词生成多个层次的表示,包括词形信息和语义信息。

架构概述

  1. 字符级嵌入层:通过 CNN 处理词语的字符信息。
  2. 双向 LSTM:通过 BiLSTM 获取词的上下文信息(从左到右和从右到左)。
  3. 词嵌入层:将多层输出加权生成最终词向量。

数学表示

对于每个词 ( w_k ),其 ELMo 嵌入表示 ( E_k ) 可以表示为:

[ E_k = \gamma \sum_{j=1}^L s_j h_{k,j} ]

其中:

  • ( h_{k,j} ) 是第 ( j ) 层对词 ( w_k ) 的嵌入表示。
  • ( s_j ) 是第 ( j ) 层的可学习权重。
  • ( \gamma ) 是可学习的标量,用于调整嵌入幅度。

代码示例

import tensorflow as tf
import tensorflow_hub as hub

# 加载预训练的 ELMo 模型
elmo = hub.load("https://tfhub.dev/google/elmo/3")

# 输入文本
sentences = ["I love programming in Python.", "He enjoys learning about AI."]

# 使用 ELMo 生成词嵌入
embeddings = elmo.signatures["default"](tf.constant(sentences))["elmo"]

# 查看第一个句子的词向量
print(embeddings[0])

ELMo 的优势

  1. 语境化表示:能够生成动态、语境化的词向量。
  2. 多层表示:包含不同层次的词法、语义信息。

总结

  • ELMo 能够根据

上下文生成动态词向量,适用于各种 NLP 任务。

  • 相较于传统静态词嵌入模型(如 Word2Vec 和 GloVe),ELMo 更加灵活,尤其适用于需要深度语境信息的任务。

这篇文章总结了 Word2Vec、FastText 和 ELMo 的详细解析及应用场景。如果你对词嵌入模型有任何问题,欢迎讨论交流!