NLP自然语言处理之GloVe与fastText


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要记录了Glove嵌入的学习笔记,如有错误还请不吝赐教!


提示:以下是本篇文章正文内容,下面案例可供参考

一、Glove 词嵌入

上下文窗口内的词共现可以携带丰富的语义信息。可以预先计算此类共现的全局语料库统计数据:这可以提高训练效率。

让我们先回顾之前的跳元Skip-Gram模型,但考虑使用全局语料库统计来解释它。

1.1 带全局语料统计的跳元模型

我们用 q i j qij qij 来表示词Wj的条件概率:
P(wj | wi)
在跳元模型中,给定词wi,有
在这里插入图片描述
vi,ui 分别表示词wi作为中心词和上下文词。
考虑wi可能在语料中出现多次,于是我们考虑使用重数。
举例说明:假设词 wi 在语料库中出现两次,并且在两个上下文窗口中以 wi 为其中心词的上下文词索引是 k,j,m,k 和 k,l,k,j 。因此,多重集 Ci={j,j,k,k,k,k,l,m} ,其中元素 j,k,l,m 的重数分别为2、4、1、1。

我们将全局语料统计加入到跳元模型中:
在这里插入图片描述
我们用 xi 表示上下文窗口中的所有上下文词的数量,其中 wi 作为它们的中心词出现。设 pij 为用于生成上下文词 wj 的条件概率 xij/xi :
在这里插入图片描述

虽然我们一般使用交叉熵损失函数通常用于测量概率分布之间的距离,但在这里可能不是一个好的选择。
首先:正如之前所提到的,规范化qij的代价在于整个词表求和。其次,来自大型语料库的大量罕见事件往往被交叉熵损失建模,从而赋予过多的权重。

1.2 GloVe 模型

由上述,GloVe模型基于平方损失对跳元模型进行了三个修改。

1.使用变量p′ij=xij 和q′ij=exp(u⊤j vi) 而非概率分布,并取两者的对数。所以平方损失项是
在这里插入图片描述2. 为每个词wi 添加两个标量模型参数:中心词偏置bi和上下文偏置ci
3.用权重函数 h(xij) 替换每个损失项的权重,其中 h(x) 在 [0,1] 的间隔内递增
由此得到相应的损失函数:
在这里插入图片描述

应该强调的是,当词 wi 出现在词 wj 的上下文窗口时,词 wj 也出现在词 wi 的上下文窗口。因此, xij=xji 。与拟合非对称条件概率 pij 的word2vec不同,GloVe拟合对称概率 logxij 。因此,在GloVe模型中,任意词的中心词向量和上下文词向量在数学上是等价的。但在实际应用中,由于初始值不同,同一个词经过训练后,在这两个向量中可能得到不同的值:GloVe将它们相加作为输出向量。

二、fastText

在不同语言中,每个词都有其对应的变形形式。比如“helps”、“helped”和“helping”等单词都是同一个词“help”的变形形式。在上述的word2vec和GloVe都没有对词的内部结构进行探讨。

2.1 fastText 模型

考虑word2vec中的跳元模型和连续词袋模型,我们发现同一个词的不同变形形式直接由不同的向量表示,不需要共享参数。
而为了使用单词的形态信息,fastText模型提出了一种子词嵌入方法,其中子词是一个字符 n -gram,每个中心词都由其子词级向量之和表示。

举例说明:
在这里我们以where单词为例:
首先,在词的开头和末尾添加特殊字符“<”和“>”,以将前缀和后缀与其他子词区分开来。 然后,从词中提取字符 n -gram。 例如,值 n=3 时,我们将获得长度为3的所有子词: “<wh”、“whe”、“her”、“ere”、“re>”和特殊子词“”。

在fastText中,对于任意词 w ,用 Gw 表示其长度在3和6之间的所有子词与其特殊子词的并集。词表是所有词的子词的集合。假设 zg 是词典中的子词 g 的向量,则跳元模型中作为中心词的词 w 的向量 vw 是其子词向量的和:
在这里插入图片描述
fastText的其余部分与跳元模型相同。与跳元模型相比,fastText的词量更大,模型参数也更多。此外,为了计算一个词的表示,它的所有子词向量都必须求和,这导致了更高的计算复杂度。然而,由于具有相似结构的词之间共享来自子词的参数,罕见词甚至词表外的词在fastText中可能获得更好的向量表示。(也就是说由相似结构的单词之间参数共享)

2.2 字节对编码(Byte Pair Encoding)

在fastText中,所有提取的子词都必须是指定的长度,例如3到6,因此词表的大小不能预定义。为了在固定大小的词表中允许可变长度的子词,我们可以应用一种称为字节对编码(BPE)的压缩算法来提取子词。

字节对编码执行训练数据集的统计分析,以发现单词内的公共符号,诸如任意长度的连续字符。从长度为1的符号开始,字节对编码迭代地合并最频繁的连续符号对以产生新的更长的符号。(字节对编码及其变体已经应用于GPT-2和RoBERTa等自然语言处理预训练模型中的输入表征)

举例的示例如下:
我们给定初始的符号词表,其包含了所有英文的小写字符、特殊的词尾符号‘_’以及特殊的未知符号‘[UNK]’

symbols = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
           'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
           '_', '[UNK]']

我们对词典token_freqs的键迭代地执行字节对编码算法。在第一次迭代中,最频繁的连续符号对是’t’和’a’,因此字节对编码将它们合并以产生新符号’ta’。在第二次迭代中,字节对编码继续合并’ta’和’l’以产生另一个新符号’tal’。将迭代生成的新的词汇放入到symbol中。

对于上述,我们可以直观的理解为它贪心的对词语进行相应的子词分割。找到频率最高的公共子词,而不是每个词都进行相应的n-gram的分割。

总结:
1.fastText模型提出了一种子词嵌入方法:基于word2vec中的跳元模型,它将中心词表示为其子词向量之和。

2.字节对编码执行训练数据集的统计分析,以发现词内的公共符号。作为一种贪心方法,字节对编码迭代地合并最频繁的连续符号对。

3.子词嵌入可以提高稀有词和词典外词的表示质量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到了一些关于自然语言处理中特征提取的问题,其中包括如何构建一个系统来从非结构化文本中提取结构化数据,如何识别文本描述中的实体和关系,以及如何使用语料库来训练和评估模型。对于Python自然语言处理中的特征提取,可以采用以下方法和步骤: 1. 词袋模型(Bag of Words):将文本中的每个单词作为一个特征,并统计其出现的频次。可以使用Python中的CountVectorizer或TfidfVectorizer来实现。 2. n-gram模型:将连续的n个单词作为一个特征,可以捕捉到更多的上下文信息。可以使用Python中的CountVectorizer或TfidfVectorizer中设置ngram_range参数来实现。 3. 词嵌入(Word Embedding):将每个单词映射到一个低维向量空间中,可以捕捉到单词之间的语义关系。可以使用Python中的Word2Vec、GloVeFastText等库来进行词嵌入。 4. 句法分析特征:通过分析句子的句法结构,提取特定的句法规则或模式作为特征。可以使用Python中的NLTK或Spacy等库来进行句法分析。 5. 实体识别特征:识别文本中的人名、地名、组织机构等实体,并将其作为特征。可以使用Python中的NLTK或Spacy等库来进行实体识别。 6. 主题模型特征:通过对文本进行主题建模,提取文本的主题分布作为特征。可以使用Python中的LDA或LSA等库来进行主题建模。 以上是一些常用的Python自然语言处理中特征提取的方法和步骤,根据具体的任务和数据集的特点,可以选择合适的方法来提取特征,并进行相应的处理和分析。<span class="em">1</span><span class="em">2</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值