自然语言处理(五):子词嵌入(fastText模型)

这篇具有很好参考价值的文章主要介绍了自然语言处理(五):子词嵌入(fastText模型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

子词嵌入

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

文章内容来自李沐大神的《动手学深度学习》并加以我的理解,感兴趣可以去https://zh-v2.d2l.ai/查看完整书籍



fastText模型

回想一下词在word2vec中是如何表示的。在跳元模型和连续词袋模型中,同一词的不同变形形式直接由不同的向量表示,不需要共享参数。为了使用形态信息,fastText模型提出了一种子词嵌入方法,其中子词是一个字符 n n n-gram (Bojanowski et al., 2017)。fastText可以被认为是子词级跳元模型,而非学习词级向量表示,其中每个中心词由其子词级向量之和表示。

fastText是一种用于自然语言处理的词向量表示和文本分类的模型。与传统的词向量模型(如word2vec)不同,fastText不仅考虑了单词级别的表示,还考虑了子词(n-grams)级别的表示。这使得fastText能够更好地处理词汇中的复杂性和稀有词。

以下是fastText模型的主要特点和工作原理:

  1. 子词表示:fastText将每个单词表示为其字符级别n-grams的平均值。例如,对于单词"apple",它可以表示为"ap"、“app”、“ppl”、"ple"等子词的平均向量。这样做的好处是能够捕捉到词汇的内部结构和形态信息,对于处理未登录词(out-of-vocabulary)和稀有词具有优势。

  2. 分层Softmax:fastText使用了分层Softmax来加速训练过程。传统的词向量模型在训练时需要计算输出层中所有词的概率,而分层Softmax将词汇表划分为多个层级,每个层级包含一部分词汇。这样可以减少计算量,并加快训练速度。

  3. 文本分类:除了词向量表示,fastText还可以用于文本分类任务。它使用了基于词袋(bag-of-words)模型的方法,将文本表示为词向量的加权和,并通过softmax函数进行分类预测。

fastText是一个开源项目,由Facebook AI Research团队开发。它以其快速训练速度、对稀有词的处理能力和在文本分类任务上的良好表现而受到广泛关注和应用。

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

在fastText中,对于任意词 w w w,用 C w C_w Cw表示其长度在3和6之间的所有子词与其特殊子词的并集。词表是所有词的子词的集合。假设 z g z_g zg是词典中的子词 g g g的向量,则跳元模型中作为中心词的词 w w w的向量 v w v_w vw是其子词向量的和:
v w = ∑ g ∈ C w z g v_w=\sum_{g\in C_w}z_g vw=gCwzg
fastText的其余部分与跳元模型相同。与跳元模型相比,fastText的词量更大,模型参数也更多。此外,为了计算一个词的表示,它的所有子词向量都必须求和,这导致了更高的计算复杂度。然而,由于具有相似结构的词之间共享来自子词的参数,罕见词甚至词表外的词在fastText中可能获得更好的向量表示。

字节对编码

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

字节对编码执行训练数据集的统计分析,以发现单词内的公共符号,诸如任意长度的连续字符。从长度为1的符号开始,字节对编码迭代地合并最频繁的连续符号对以产生新的更长的符号。请注意,为提高效率,不考虑跨越单词边界的对。最后,我们可以使用像子词这样的符号来切分单词。字节对编码及其变体已经用于诸如GPT-2 (Radford et al., 2019)和RoBERTa (Liu et al., 2019)等自然语言处理预训练模型中的输入表示。在下面,我们将说明字节对编码是如何工作的。

首先,我们将符号词表初始化为所有英文小写字符、特殊的词尾符号’_‘和特殊的未知符号’[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

自然语言处理(五):子词嵌入(fastText模型),深度学习,自然语言处理,人工智能

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

def get_max_freq_pair(token_freqs):
    pairs = collections.defaultdict(int)
    for token, freq in token_freqs.items():
        symbols = token.split()
        for i in range(len(symbols) - 1):
            # “pairs”的键是两个连续符号的元组
            pairs[symbols[i], symbols[i + 1]] += freq
    return max(pairs, key=pairs.get)  # 具有最大值的“pairs”键

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

def merge_symbols(max_freq_pair, token_freqs, symbols):
    symbols.append(''.join(max_freq_pair))
    new_token_freqs = dict()
    for token, freq in token_freqs.items():
        new_token = token.replace(' '.join(max_freq_pair),
                                  ''.join(max_freq_pair))
        new_token_freqs[new_token] = token_freqs[token]
    return new_token_freqs

解释一下new_token = token.replace(’ ‘.join(max_freq_pair),’'.join(max_freq_pair))
max_freq_pair 是一个元组,表示最高频率的一对符号。例如,假设 max_freq_pair = ('a', 'b')
' '.join(max_freq_pair) 将最高频率符号对中的两个符号用空格连接起来,生成一个字符串。对于上述示例,结果将是 'a b'
''.join(max_freq_pair) 将最高频率符号对中的两个符号直接连接起来,生成一个新的合并后的符号。对于上述示例,结果将是 'ab'
token.replace(' '.join(max_freq_pair), ''.join(max_freq_pair)) 则使用生成的字符串和新的合并后的符号对标记进行替换操作。它将标记中所有出现的最高频率符号对 'a b' 替换为合并后的符号 'ab',得到新的合并标记。

现在,我们对词典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)

自然语言处理(五):子词嵌入(fastText模型),深度学习,自然语言处理,人工智能
在字节对编码的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”分割。例如,单词“faster_”和“taller_”分别被分割为“fast er_”和“tall er_”。

print(list(token_freqs.keys()))

自然语言处理(五):子词嵌入(fastText模型),深度学习,自然语言处理,人工智能
请注意,字节对编码的结果取决于正在使用的数据集。我们还可以使用从一个数据集学习的子词来切分另一个数据集的单词。作为一种贪心方法,下面的segment_BPE函数尝试将单词从输入参数symbols分成可能最长的子词。

def segment_BPE(tokens, symbols):
    outputs = []
    for token in tokens:
        start, end = 0, len(token)
        cur_output = []
        # 具有符号中可能最长子字的词元段
        while start < len(token) and start < end:
            if token[start: end] in symbols:
                cur_output.append(token[start: end])
                start = end
                end = len(token)
            else:
                end -= 1
        if start < len(token):
            cur_output.append('[UNK]')
        outputs.append(' '.join(cur_output))
    return outputs
  1. 函数接受两个参数:tokenssymbols

    • tokens 是待分割的标记列表。
    • symbols 是用于分割标记的符号列表。
  2. 函数创建一个空列表 outputs 用于存储分割后的结果。

  3. 对于每个标记 token,进行以下操作:

  4. 初始化两个变量 startend 为 0 和标记的长度。

  5. 创建一个空列表 cur_output 用于存储当前标记的分割结果。

  6. 在一个循环中,尝试从标记的起始位置开始找到最长的子字,使其在符号列表 symbols 中存在。

  7. 如果从 startend 的子字在 symbols 中存在,则将该子字添加到 cur_output 中,并更新 startend,将 end 重置为标记的长度。

  8. 如果子字不在 symbols 中,则将 end 减小 1,继续尝试找到更短的子字。

  9. 如果 start 小于标记的长度,说明有未被分割的部分,将其视为未知符号 [UNK],并将其添加到 cur_output 中。

  10. cur_output 使用空格连接为一个字符串,并将其添加到 outputs 列表中。

  11. 循环结束后,返回 outputs 列表,其中包含了对每个标记进行分割后的结果。

我们使用列表symbols中的子词(从前面提到的数据集学习)来表示另一个数据集的tokens。

tokens = ['tallest_', 'fatter_']
print(segment_BPE(tokens, symbols))

自然语言处理(五):子词嵌入(fastText模型),深度学习,自然语言处理,人工智能文章来源地址https://www.toymoban.com/news/detail-692706.html

到了这里,关于自然语言处理(五):子词嵌入(fastText模型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自然语言处理(一):词嵌入

    词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,用于将文本中的单词映射到一个低维向量空间中。它是将文本中的单词表示为实数值向量的一种方式。 在传统的文本处理中,通常使用独热编码(One-Hot Encoding)来表示单词,即将每个单词表示为一个稀疏的高维向量

    2024年02月11日
    浏览(31)
  • 自然语言处理-用于预训练词嵌入的数据集

    word2vec模型的技术细节和大致的训练方法,让我们来看看它们的实现。具体地说,用于预训练词嵌入模型的数据集开始:数据的原始格式将被转换为可以在训练期间迭代的小批量。 读取数据集 我们在这里使用的数据集是Penn Tree Bank(PTB)。该语料库取自“华尔街日报”的文章

    2024年02月02日
    浏览(26)
  • 自然语言处理(四):全局向量的词嵌入(GloVe)

    全局向量的词嵌入(Global Vectors for Word Representation),通常简称为GloVe,是一种用于将词语映射到连续向量空间的词嵌入方法。它旨在捕捉词语之间的语义关系和语法关系,以便在自然语言处理任务中能够更好地表示词语的语义信息。 GloVe的设计基于两个观察结果:共现矩阵(

    2024年02月11日
    浏览(35)
  • 2.自然语言处理NLP:词映射为向量——词嵌入(word embedding)

    1. 什么是词嵌入(word2vec) : 把词映射为向量(实数域)的技术 2. 为什么不采用one-hot向量: one-hot词向量无法准确表达不同词之间的相似度,eg:余弦相似度,表示夹角之间的余弦值,无法表达不同词之间的相似度。 3. word2vec主要包含哪两个模型 跳字模型: 基于某个词生成

    2024年02月06日
    浏览(37)
  • 自然语言处理:大语言模型入门介绍

    随着自然语言处理(Natural Language Processing, NLP)的发展,此技术现已广泛应用于文本分类、识别和总结、机器翻译、信息提取、问答系统、情感分析、语音识别、文本生成等任务。 研究人员发现扩展模型规模可以提高模型能力,由此创造了术语——大语言模型(Large Language

    2024年02月12日
    浏览(38)
  • 《自然语言处理》chapter7-预训练语言模型

    这是阅读《自然语言处理-基于预训练模型的方法》的学习笔记,记录学习过程,详细的内容请大家购买书籍查阅。 同时参考沐神的两个视频: GPT,GPT-2,GPT-3 论文精读【论文精读】 BERT 论文逐段精读【论文精读】 自然语言处理的核心在于如何更好地建模语言。广义上的预训

    2024年02月10日
    浏览(48)
  • 30个最新的自然语言处理模型

    T5:基于Transformer,结合了多任务学习和无监督预训练,并使用大规模的英文维基百科语料库进行训练。 GPT-3:同样基于Transformer,使用了极其庞大的语料库,并使用Zero-shot学习实现了自然语言推理功能。 Chinchilla:一种新型自然语言生成模型,使用了自适应正则化和动态使用

    2023年04月27日
    浏览(32)
  • 自然语言处理 微调ChatGLM-6B大模型

    bert的主要任务是随机的去除掉某个单词,使用上下文将其预测出来(相当于完形填空任务); GPT的主要任务是根据前面一句话,预测下面的内容; GLM结合了bert的强大双向注意力与gpt的强大生成能力两种能力,被nask的地方使用单向注意力,未被mask的地方使用双向注意力 预测

    2024年02月09日
    浏览(37)
  • 【自然语言处理】:实验4答案,预训练语言模型实现与应用

    代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主,接实验技术指导1对1 运行模型,测试模型在有 100% / 50% / 10% training data(通过随机 sample 原 training set 一部分的数据,10%代表低资源的设定)的情况下模型

    2024年02月22日
    浏览(42)
  • 【自然语言处理】:实验4布置,预训练语言模型实现与应用

    清华大学驭风计划 因为篇幅原因实验答案分开上传,自然语言处理专栏持续更新中,期待的小伙伴敬请关注 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 案例简介  2018年,Google提出了预训练语言模型BERT,该模型在各种NLP任务上都取得了很好的效果。与

    2024年02月19日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包