常见的分词方法

Word-based tokenization

这是一种很常用的分词方法,基于分隔符(空格或者标点等)将文本拆分成 words

例子:

“Is it weird I don’t like coffee?”

如果我们只考虑空格,将会得到

[“Is”, “it”, “weird”, “I”, “don’t”, “like”, “coffee?”]

  • 我们发现 coffee? 这种带着标点符号的词
  • 如果现在有个 coffee.,这将会导致同一个词带着不同的标点,会有不同的表达,这不是理想状态

因此,我们将标点考虑进来:

[“Is”, “it”, “wierd”, “I”, “don”, “’”, “t”, “like”, “coffee”, “?”]

  • 我们发现,don't 被分成了三个 token
  • 一种更好的表达应该是 do,n't
  • 这样在下次看到 doesn't 的时候,就可以分成 doesn't,因为 n't 之前已经学过了,所以可以直接应用学过的知识
  • 这可以通过设计一些规则来实现

空格,标点和rule-based tokenization都是 word-based tokenization的例子

之后,每次词都会用一个 ID 表示,每个 ID 都包含大量信息,因为句子中的一个词有很多上下文和语义信息

这种方法听起来很好,但是会导致大量的语料,从而产生很大的词汇表

  • SOTA model,Transformer XL,使用空格和标点,导致词汇表的大小达到 267735
  • 巨大的词汇表会为输出输出产生一个巨大的 embedding matrix,导致模型参数量很大(占资源)

为了防止出现巨大的词汇表,我们可以限制被加到词汇表中的词的数目

  • 比如只加入最常见的5000个词

  • 模型会为这些词产生 IDS,将剩下的词标记为 OOV(Out Of Vocabulary)

  • 缺点1:但是这会导致很多信息丢失,因为模型不会学习 OOV 词,他为所有未知的词学习同一个 OOV 表示

  • 缺点2:将拼写错误的词标记为 OOV

为了解决上面的缺点,产生了 Character-based tokenization

Character-based tokenization

将raw text分割成独立的character

  • 因为每种语言有很多不同的词,但是有固定数量的字母
  • 这会产生一个很小的词典

比如英文中,我们使用 256中不同的character(字母,数字,特殊字符),然而其词典中有将近170000词

优点

  • 会产生一个很小的词典
  • 很少有 OOV words,因此可以利用每个字符的表达,为训练时没见过的词创建表达
  • 拼错的词可以被正确拼写,而不是标记为 OOV

缺点:

  • 字符通常不会像词那样携带任何意思/信息(词)
  • 用这种方式表示的 tokenized 序列比原始序列长很多

Note: 有些语言的字符携带很多信息,因此这种方法很有用

Subword-based tokenization

是介于 word-based 和 character-based tokenization,主要为了解决上面两种方法的问题

  • word-based:词典太大,OOV token数量太多,相似词有不同的意思
  • character-based:序列太长,独立的token没有包含多少意义

Principles:

  • 不将常用词分割成更小的 subwords
  • 将罕见词分割成更小的有意义的 subwords

比如:不应该分割boy,应该分割 boysboys

  • 这将帮助模型学习单词“boys”是由单词“boy”组成的,它们的含义略有不同,但词根相同。

我们将 tokenization 划分成 token 和 ization

  • token是词根,这将帮助模型学习相同词根的词的意义是相似的,比如 tokens

  • ization是 subword,被标记成词根的额外信息。这将帮助模型学习 tokenization和modernization是由不同词根组成的,但是有相同的后缀 ization,是在相同的句法环境下使用的

另一种情况是将 surprisingly 分割成 surprising 和 ly,因为这两个独立的 subword 出现更频繁

这种算法会使用特殊的符号来标记哪个词是 token 的开始,那个词是开始 token 的补全

  • tokenization -> token and ## ization
  • 不同的模型有不同的特殊符号, ## 是 BERT 用的
  • 特殊符号也可以放在词的开始

A few common subword-based tokenization algorithms are WordPiece used by BERT and DistilBERT, Unigram by XLNet and ALBERT, and Bye-Pair Encoding by GPT-2 and RoBERTa.

这种方式使模型有大小不错的词汇表,还可以学到有意义的与上下文无关的表示。这还可以处理没见过的词,因为可以分解为已知的 subwords

参考:https://towardsdatascience.com/word-subword-and-character-based-tokenization-know-the-difference-ea0976b64e17

猜你喜欢

转载自blog.csdn.net/qq_52852138/article/details/129116527
今日推荐