tokenize和embedding的区别
在自然语言处理中,Tokenization和Embedding是两个重要的概念。
Tokenization是将自然语言文本切分成不同的词汇单元(tokens)的过程。这个过程通常包括将文本中的单词、标点符号、数字等进行分割,并去除一些噪声或冗余信息。Tokenization的结果是一个包含若干个词汇单元的序列,这些词汇单元可以被用来构建文本的向量表示或输入到深度学习模型中进行处理。
Embedding是将词汇单元映射到向量空间的过程,通常使用的是一些预训练的词向量模型(如Word2Vec、GloVe和FastText等)。这些模型将每个词汇单元映射到一个固定长度的向量,使得每个词汇单元的向量表示能够捕捉到其语义和上下文信息。Embedding常用于文本分类、机器翻译、语言生成等任务中,可以将文本序列中的词汇单元转化为向量序列,从而方便模型进行处理。
总的来说,Tokenization和Embedding是自然语言处理中两个基础的操作,Tokenization将文本序列划分为词汇单元,Embedding将词汇单元映射到向量空间中,并为文本序列提供了向量表示。这些操作在很多自然语言处理任务中都是必不可少的。
上图中很好的展示了两者的区别。
常见的tokenize方式
主要分为三种:word-level(词粒度)、byte-level(字粒度)、character-level(子词粒度)。
word-level LMs(基于单词的语言模型)和byte-level LMs(基于字节的语言模型)的区别在于它们在处理文本时所使用的基本单元不同。
词粒度分词
本节我们来讨论词粒度的相关方法。词粒度的切分就跟人类平时理解文本原理一样,可以用一些工具来完成,例如英文的NLTK、SpaCy,中文的jieba、HanLP等。
首先我们直观地看一下词粒度进行Tokenization是怎么样的一种方法,很显然,跟我们人类阅读时自然而然地切分是一致的。
这种方法的优点是,能够很好地保留词的语义和边界信息。
具体细节可以参阅:https://zhuanlan.zhihu.com/p/444774532
在word-level LMs中,基本单元是单词。模型的输入是一系列单词,输出是预测下一个单词的概率分布。例如,在给定句子 “I am going to the” 的情况下,该模型的任务是预测下一个单词可能是什么,比如 “store” 或 “park” 等等。
词粒度分词的缺陷:
- 词粒度的方法,需要构造的词典太过庞大,严重影响计算效率和消耗内存。
- 即使使用这么大的词典不影响效率,也会造成OOV问题。因为人类语言是不断发展的,词汇也在发展中不断增加。例如:针不戳,Niubility,Sixology等。
- 词表中的低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的语义。
- 一个单词因为不同的形态会产生不同的词,如由“look”衍 生出的“looks”, “looking”, 但是意义相近,对他们都进行训练是不必要的。
字粒度分词
字粒度又称字符粒度,它是按某一种语言最小符号来进行切分的。字符粒度最早应该是2015年Karpathy提出,简单说英文(拉丁语系)就是以字母为单位,
中文日文韩文等就是以字为单位进行切分。举个例子:
它的优点是,词表大大减小,26个英文字母基本能覆盖出几乎所有词,5000多个中文基本也能组合出覆盖的词汇。但是除了这个优点之外全是缺点了,最重要的是,这种方法严重丢失了词汇的语音信息和边界信息,这对模型来说是灾难性的。而且把单词切分的太细,会使得输入太过长增加输入计算压力,减小词表的代价就是输入长度大大增加,从而输入计算变得更耗时。
这一种Tokenization方法没有什么过多可说的,因为现实中一般不用。
对应的,在byte-level LMs(字粒度分词)中,基本单元是字节。模型的输入是一系列字节,输出是预测下一个字节的概率分布。例如,在给定字节序列 “01000101 01101110 01100111 01101100 01101001 01110011 01101000” 的情况下,该模型的任务是预测下一个字节是什么,比如 ” ” 或 “!” 等等。
需要注意的是,byte-level LMs在处理中文文本时可能会遇到一些问题,因为中文字符通常由多个字节组成,而这些字节的组合方式是非常多样化的。因此,为了处理中文文本,通常需要使用更加复杂的字符级别(character-level)语言模型,这些模型的基本单元是字符。
子词粒度分词
首先我们先来谈谈怎么样的Tokenization才是理想的Tokenization。概括来说就是,词表要尽可能地小,小的同时又能覆盖到绝大多数的词尽可能地少出现OOV的词,另外此表中的每一个token都是由意义的,也就是说,对于一个词切出来的subwords中每一个都是由意义的,而且不要且得太细。
而前面两种的方法都存在或多或少的缺点,都不能同时满足以上需求。那么有没有一种兼顾各方的方法呢?有的,那就是子词切分的方法。不过这里首先声明一下,这种方法只适用于英文,对于中文来说总不能把一个字分为偏旁部首和字根吧。
那么subword的Tokenization是怎么切分的呢?再举个例子:
接着又要提问了,如何切分或者说如何构造出subwords词典呢?目前主要有4种方法。如下图所示。
具体四种分词方式请参阅:https://zhuanlan.zhihu.com/p/444774532
BPE
BPE相关参见:https://zhuanlan.zhihu.com/p/424631681
参考文献:
https://zhuanlan.zhihu.com/p/444774532
今天的文章nlp中的token_nlp token分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83668.html