使用 FastText 实现词嵌入

FastText 嵌入是Facebook 人工智能研究 (FAIR) 实验室开发的一种词嵌入。它们基于子词嵌入的思想,这意味着 FastText 不是将单词表示为单个实体,而是将它们分解为称为字符 n 元语法的更小的组件。通过这样做,FastText 可以捕获形态相关单词的语义,甚至是词汇外单词或罕见单词,这使得它对于处理具有丰富形态的语言或词汇外单词常见的任务特别有用。在本文中,我们将讨论 fastText 嵌入在 NLP 中的含义。

NLP 中需要什么词嵌入?
词嵌入在 NLP 中至关重要,原因如下:

  • 降维:它们表示低维连续向量空间中的单词,使其在计算上高效地处理广泛的词汇表。
  • 语义相似性:词嵌入对语义关系进行编码,使算法能够理解同义词、反义词和相关含义。
  • 上下文信息:通过从周围的单词中捕获上下文,嵌入可以帮助模型理解单词在上下文中的含义,这对于情感分析和命名实体识别等任务至关重要。
  • 泛化:它们可以很好地泛化到未见过的单词,从训练数据中单词的分布属性中学习。
  • 特征表示:词嵌入作为机器学习模型的特征表示,使得各种技术能够应用于 NLP 任务。
  • 高效训练:使用词嵌入训练的模型收敛速度更快,并且通常比使用稀疏表示的模型表现更好。
  • 迁移学习:预训练的嵌入(例如Word2Vec或GloVe)允许模型利用大型语料库中的知识,即使任务特定数据有限。

为什么应该使用 FastText 嵌入?
与 Word2Vec 和 GloVe 等传统词嵌入技术相比,FastText 具有显着优势,尤其是对于形态丰富的语言。以下是 FastText 如何解决传统词嵌入的局限性及其影响的详细说明:

  • 字符级信息的利用:FastText 通过将单词表示为嵌入其字符 n 元组的平均值来利用字符级信息。这种方法允许 FastText 捕获单词的内部结构,包括前缀、后缀和词根,这对于构词遵循特定规则的形态丰富的语言特别有益。
  • Word2Vec模型的扩展: FastText是Word2Vec模型的扩展,这意味着继承了Word2Vec的优点,例如捕获单词之间的语义关系并生成密集的向量表示。
  • 处理词汇外单词:传统单词嵌入的一个显着限制是它们无法处理词汇外(OOV)单词,即训练数据或词汇中不存在的单词。由于 Word2Vec 和 GloVe 仅为训练期间看到的单词提供嵌入,因此在推理过程中遇到 OOV 单词可能会带来挑战。
  • FastText 针对 OOV 单词的解决方案:FastText 通过提供字符 n-gram 嵌入来克服 OOV 单词的限制。如果在推理过程中出现 OOV 单词,FastText 仍然可以根据其组成字符 n 元语法为其生成嵌入。这种能力使 FastText 更加健壮,适合处理经常遇到新词或生僻词的场景,例如社交媒体数据或专业领域。
  • 改进了形态丰富的语言的矢量表示:通过利用字符级信息并提供 OOV 单词的嵌入,FastText 显着改进了形态丰富的语言的矢量表示。它不仅捕获语义,还捕获单词的内部结构和句法关系,从而产生更准确和上下文丰富的嵌入。

FastText 嵌入的工作原理
FastText 嵌入利用字符级信息生成强大的单词表示,彻底改变了自然语言处理。例如,考虑带有字符 n 元语法的单词“basketball”

"<ba, bas, ask, sket, ket, et, etb, tb, tb, bal, all, ll>" and "<basketball>". 

  • FastText 通过对这些字符 n 元语法与单词本身的嵌入进行平均来计算“basketball”的嵌入。这种方法捕获了单词的语义和内部结构,使得 FastText 对于形态丰富的语言特别有效。
  • 在训练过程中,FastText 使用连续词袋 (CBOW) 或 Skip-gram 等模型,这些模型是经过训练的神经网络,用于预测给定目标单词的上下文,反之亦然。这些模型优化神经网络参数以最大程度地减少损失,使 FastText 能够从大型文本语料库中学习有意义的单词表示。

此外,FastText 处理词汇表外单词的能力有助于在现实世界的应用中经常遇到新词或罕见单词。经过训练的 FastText 嵌入可作为各种 NLP 任务的强大功能,促进文本分类、情感分析和机器翻译等任务的准确性和效率的提高。

Skip-gramCBOW
在 FastText 嵌入的背景下,Skip-gram和连续词袋 ( CBOW)都用作生成单词表示的训练方法
以“篮球”这个词为例,让我们比较一下 Skip-gram 和 CBOW 的运作方式:
跳克:

  • 输入:给定目标单词“basketball”,Skip-gram 旨在预测其上下文单词,例如“play”、“court”、“team”等。
  • 训练目标:模型学习根据目标词预测周围的上下文词。
  • 用法示例:给定“basketball”作为输入,Skip-gram 从给定的文本语料库中预测其周围的上下文单词。

连续词袋(CBOW):
  1. 输入:CBOW 采用上下文单词窗口,例如“play”、“on”、“the”、“basketball”、“court”作为输入。
  2. 训练目标:模型学习根据周围上下文预测目标词“basketball”。
  3. 用法示例:使用上下文单词“play”、“on”、“the”、“court”作为输入,CBOW 预测目标单词“basketball”。本质上,Skip-gram 和 CBOW 的不同之处在于输入和输出配置:

  • Skip-gram 预测给定目标单词的上下文单词。
  • CBOW 根据上下文预测目标单词。

这两种方法都有助于训练 FastText 嵌入,使模型能够有效地捕获语义关系和句法结构。 Skip-gram 和 CBOW 之间的选择取决于 NLP 任务的具体要求以及所使用的文本语料库的特征。

FastText 嵌入的代码实现

  • 此代码演示了使用 Gensim 训练 FastText 模型并使用它来查找单词嵌入和相似单词
  • 首先导入必要的库并定义语料库,然后使用指定参数训练 FastText 模型。
  • 然后从训练后的模型中获得特定单词(在本例中为“computer”)的单词嵌入,并根据其嵌入找到与“computer”最相似的单词。
  • 最后,打印“computer”的单词嵌入和最相似单词的列表。

from gensim.models import FastText
from gensim.test.utils import common_texts

# Example corpus (replace with your own corpus)
corpus = common_texts

# Training FastText model
model = FastText(sentences=corpus, vector_size=100, window=5, min_count=1, workers=4, sg=1)

# Example usage: getting embeddings for a word
word_embedding = model.wv['computer']

# Most similar words to a given word
similar_words = model.wv.most_similar('computer')

print("Most similar words to 'computer':", similar_words)

输出:
Most similar words to 'computer': [('user', 0.15659411251544952), ('response', 0.12383826076984406), 
('eps', 0.030704911798238754), ('system', 0.025573883205652237), ('interface', 0.0058587524108588696), 
('survey', -0.03156976401805878), ('minors', -0.0545564740896225), ('human', -0.0668589174747467), 
('time', -0.06855931878089905), ('trees', -0.10636083036661148)]


输出列出了单词及其与单词“computer”相应的相似度分数。这些分数表明模型学习的向量空间中每个单词在语义上与“computer”的接近程度。

FastText VS Word2vec:哪个更好?
FastText 和 Word2Vec 都是自然语言处理中用于生成词嵌入的流行工具,但它们满足的需求和用例略有不同:

  • Word2Vec由 Google 开发,以其在捕获语义和句法单词关系方面的效率和效果而闻名。它使用两种架构(CBOW 和 Skip-gram)来学习表示,并且在一般语言建模任务中表现出色。
  • FastText 由 Facebook 的 AI 研究实验室开发,它扩展了 Word2Vec 的想法,不仅学习单词的嵌入,还学习单词中字符的 n 元语法。这种方法允许 FastText 通过利用子词信息为罕见词或拼写错误的词生成更好的嵌入。

在 FastText 和 Word2Vec 之间进行选择取决于具体要求:

  • Word2Vec 通常更适合具有精心策划的大型数据集和常见词汇的任务,
  • 而 FastText 则擅长处理稀有单词和形态复杂的语言。对于需要对单词变化和拼写错误具有鲁棒性的应用程序,FastText 可能是更好的选择。


FastText 嵌入 - 常见问题解答
1、FastText 嵌入如何处理未知单词?
FastText 的独特之处在于它能够为训练期间未见过的单词生成嵌入。它通过将单词分解为更小的子词单元(n-gram)并在训练期间学习这些 n-gram 的表示来实现这一点。对于未知单词,FastText 聚合其组成 n 元语法的向量。

2、FastText 和 word2vec 有什么区别?
虽然 FastText 和 word2vec 都提供词嵌入,但主要区别在于它们对词汇的处理。 Word2vec 仅学习训练期间见过的单词的向量,忽略未知单词。另一方面,FastText 通过对子词 n-gram 的嵌入求和来动态构建嵌入,这使得它能够处理训练期间未见过的单词。

3、FastText 可以用于英语以外的语言吗?
是的,FastText 对于形态丰富的语言(如土耳其语或芬兰语)特别有用,其中相同的词根可以有多种不同的形式。与仅考虑整个单词的模型相比,它的子词方法使其能够更有效地捕获此类语言的细微差别。