首页 > 其他分享 >自然语言处理预训练——子词嵌入

自然语言处理预训练——子词嵌入

时间:2023-11-18 15:55:05浏览次数:25  
标签:嵌入 符号 freqs fast token tall 子词 自然语言 er

在英语中,“helps”“helped”和“helping”等单词都是同一个词“help”的变形形式。“dog”和“dogs”之间的关系与“cat”和“cats”之间的关系相同,“boy”和“boyfriend”之间的关系与“girl”和“girlfriend”之间的关系相同。在法语和西班牙语等其他语言中,许多动词有40多种变形形式,而在芬兰语中,名词最多可能有15种变形。在语言学中,形态学研究单词形成和词汇关系。但是,word2vec和GloVe都没有对词的内部结构进行探讨。

 

fastText模型

 fastText的其余部分与跳元模型相同。与跳元模型相比,fastText的词量更大,模型参数也更多。此外,为了计算一个词的表示,它的所有子词向量都必须求和,这导致了更高的计算复杂度。然而,由于具有相似结构的词之间共享来自子词的参数,罕见词甚至词表外的词在fastText中可能获得更好的向量表示。

 

字节对编码

首先,我们将符号词表初始化为所有英文小写字符、特殊的词尾符号'_'和特殊的未知符号'[UNK]'

import collections

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]']

 因为我们不考虑跨越词边界的符号对,所以我们只需要一个字典raw_token_freqs将词映射到数据集中的频率(出现次数)。注意,特殊符号'_'被附加到每个词的尾部,以便我们可以容易地从输出符号序列(例如,“a_all er_man”)恢复单词序列(例如,“a_all er_man”)。由于我们仅从单个字符和特殊符号的词开始合并处理,所以在每个词(词典token_freqs的键)内的每对连续字符之间插入空格。换句话说,空格是词中符号之间的分隔符。

raw_token_freqs = {'fast_': 4, 'faster_': 3, 'tall_': 5, 'taller_': 4}
token_freqs = {}
for token, freq in raw_token_freqs.items():
    token_freqs[' '.join(list(token))] = raw_token_freqs[token]
token_freqs
{'f a s t _': 4, 'f a s t e r _': 3, 't a l l _': 5, 't a l l e r _': 4}

我们定义以下get_max_freq_pair函数,其返回词内最频繁的连续符号对,其中词来自输入词典token_freqs的键。

作为基于连续符号频率的贪心方法,字节对编码将使用以下merge_symbols函数来合并最频繁的连续符号对以产生新符号。

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

num_merges = 10
for i in range(num_merges):
    max_freq_pair = get_max_freq_pair(token_freqs)
    token_freqs = merge_symbols(max_freq_pair, token_freqs, symbols)
    print(f'合并# {i+1}:',max_freq_pair)
合并# 1: ('t', 'a')
合并# 2: ('ta', 'l')
合并# 3: ('tal', 'l')
合并# 4: ('f', 'a')
合并# 5: ('fa', 's')
合并# 6: ('fas', 't')
合并# 7: ('e', 'r')
合并# 8: ('er', '_')
合并# 9: ('tall', '_')
合并# 10: ('fast', '_')

 在字节对编码的10次迭代之后,我们可以看到列表symbols现在又包含10个从其他符号迭代合并而来的符号。

print(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]', 'ta', 'tal', 'tall', 'fa', 'fas', 'fast', 'er', 'er_', 'tall_', 'fast_']

对于在词典raw_token_freqs的键中指定的同一数据集,作为字节对编码算法的结果,数据集中的每个词现在被子词“fast_”“fast”“er_”“tall_”和“tall”分割。例如,单词“fast er_”和“tall er_”分别被分割为“fast er_”和“tall er_”。

 

print(list(token_freqs.keys()))
['fast_', 'fast er_', 'tall_', 'tall er_']

请注意,字节对编码的结果取决于正在使用的数据集。我们还可以使用从一个数据集学习的子词来切分另一个数据集的单词

tokens = ['tallest_', 'fatter_']
print(segment_BPE(tokens, symbols))
['tall e s t _', 'fa t t er_']

 

总结

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

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

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

 

标签:嵌入,符号,freqs,fast,token,tall,子词,自然语言,er
From: https://www.cnblogs.com/yccy/p/17840630.html

相关文章

  • c5w2_自然语言处理与词嵌入
    自然语言处理与词嵌入词嵌入one-hot向量表示了每个词在词汇表中的位置,但是每个one-hot向量的内积为0,不能表示出每个词之间的相互关系。Iwantaglassoforangejuice.Iwantaglassofapple__.例如,对于上述的这样一句话,通过学习算法可能知道在orange后面填入juice是一......
  • 自然语言处理预训练——全局向量的词嵌入
    带全局语料统计的跳元模型   GloVe模型  从条件概率比值理解GloVe模型 总结诸如词-词共现计数的全局语料库统计可以来解释跳元模型。交叉熵损失可能不是衡量两种概率分布差异的好选择,特别是对于大型语料库。GloVe使用平方损失来拟合预先计算的全局语料库......
  • 自然语言处理预训练——用于预训练词嵌入的数据集
    读取数据集  下采样 提取中心词和上下文词 下面的get_centers_and_contexts函数从corpus中提取所有中心词及其上下文词。它随机采样1到max_window_size之间的整数作为上下文窗口。对于任一中心词,与其距离不超过采样上下文窗口大小的词为其上下文词。 #@savedefge......
  • 自然语言处理预训练——近似训练
    近似训练是一种用于加速训练过程的技术。 负采样负采样是在训练过程中对目标函数进行简化的一种方法。在传统的训练中,需要计算整个词汇表的概率分布,这在大规模任务中会非常耗时。负采样的思想是通过随机采样一小部分负例来近似计算全局的目标函数。具体来说,对于每个正例(例如......
  • 一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)
    我们知道Python是一门解释型语言,项目运行时需要依赖Python解释器,并且有时候需要安装项目中对应的三方依赖库。对于专业的Python开发者来说,可以直接通过pip命令进行安装即可。但是如果是分发给其他的Windows用户,特别是不熟悉Python的人来说,这样过于繁琐。因此最好的办法是连同Pytho......
  • 智能语音和自然语言处理技术
    一、定义智能语音和自然语言处理技术是指通过计算机技术实现人机交互的一种技术。它可以让计算机和人类之间进行自然而流畅的交流,从而实现更高效、更便捷、更智能的信息交流和处理。智能语音和自然语言处理技术主要包括语音识别、语音合成、自然语言理解、自然语言生成、文本分类、......
  • 嵌入式系统设计教程(第二版)学习总结1
    计算机系统基础知识1.数据表示 对于任何一种进位计数制,都可以多项式展开;1.10进制转2进制:整数部分“除2取余”,小数部分“乘2取整”   2.二进制,十六进制,八进制之间的对应关系: 3.数值型数据表示:无符号数:全部二进制位表示数值,没有符号位有符号数:最高位0表示正数,1表......
  • 如何将solidworks的模型嵌入到网页中运行并且进行交互?
    有一个solidworks装配模型,希望能够嵌入到网页中,当点击某个部位的时候,能够触发函数事件,并且修改该部位的颜色。要将Solidworks模型嵌入到网页中并实现交互,你可以按照以下步骤进行操作:导出Solidworks模型:首先,将Solidworks模型导出为适合在网页上运行的格式,如STL、OBJ或GLTF。你......
  • 嵌入式Linux adbd实现概要梳理(基于STM32MP157D+Buildroot)
    关键词:USBGadget、dwc2、configfs、functionfs、adbd等等。基于STM32MP157D简单记录ADB实现的过程,涉及到USB、Gadget、configfs、functionfs、adbd、ADB协议等等。基于Buildroot2020.02.6编译adbd运行于设备,和PCWindows交互的简要框图:1Linux下USBGadget1.1Linux内核Gad......
  • 大模型训练,推动自然语言处理发展的强大引擎
    近年来,自然语言处理(NLP)领域取得了显著的进步,其中最引人注目的成就之一是基于Transformer架构的预训练语言模型。这些模型,如GPT-3,在各种NLP任务中都取得了突破性的成果,包括问答系统。然而,尽管这些模型具有强大的性能,但它们通常需要大量的计算资源和数据来进行训练,这限制了它们的可扩......