自然语言处理-Tokenizer

提升自然语言处理的能力,在字词语料的处理上是一个至关重要的环节,比如如何将自然语言文本切分成不同的词汇单元(tokens),并去除一些噪声或者冗余信息。 从技术的角度来说,也叫做Tokenizer。 按照我个人的理解,Tokenizer是一个用于向量化文本的工具或者类,在计算机进行语言文字处理的时候,是无法像人一样理解文字的含义,通常会把一个词转换为一个数字,把一个文本转换为一个序列,然后再对序列进行向量化,之后模型就可以对这些向量进行处理。这其中其实也会包含embedding的过程。 本节,重点阐述Tokenizer。

常见的tokenizer方式包括:word-level(词粒度)、byte-level(字粒度)、character-level(子词粒度)。 我们来对比下这几种方式的差异。

word-level

基本单元是单词,比如如下一段话:

I love my home.

如果以word-level的方式进行,那么就会得到I/love/my/home/.

byte-level

其又称为字符粒度,按照当前语言的最小符号来进行划分。 还以上面这句话所示,就会得到I/l/o/v/e/m/y/h/o/m/e/. 比如中文,我爱我家。,那么,就会得到我/爱/我/家/。

character-level

我们在构造词表的时候,肯定是希望词表能够尽量少,同时,又能囊括我们想要的几乎所有的词。目前社会在发展,其实也催生出了很多新时代用词或者网络用语,如何处理好这些,也是我们需要考虑的一个内容。 前面两种维度或多或少都有一些问题。比如基于单词,对于一些新词无法去进行处理;比如基于字符的,又分得太细,词表也会很大。 所以就衍生出subword子词的切分方法。 比如这句话:I want to buy gpu! 通过子词切分,我们能得到:I/want/to/buy/gp/##u/! 可以看到,其实在切分的时候,会按照整个词的存在进行切分,比如以gpu来讲,切分了gp和u。

其实subword也有一些切分原则:1、高频词依旧为完整的词;2、低频词尽量分成有意义的词,就比如gpu=>gp/##u。 按照如上的切分方式也有一些好处,比如能学习到词缀之间的关系、词表规模处于适中、不会有UNK信息导致词丢失等。

目前基于subword进行切分的方法有BPE、WordPiece、SentencePiece、Unigram

后期篇章重点介绍子词分类的相关内容。

(完)

—————–EOF——————



Previous     Next
mjgao /