简介NLP中的Tokenization(基于Word,Subword 和 Character)
概念理解
- Word:一个单词,例如
hello
- Character:一个字母,例如
a
- Subword:①若使用单词进行编码,由于单词多且杂,容易导致OOV问题,而且不太好编码 ②若使用字母进行编码,又太少,容易丢失语义;所以人们发明了subword,将一个word分成多个subword,同时兼顾了①②两个问题。
- OOV:Out of Vocabulary,意思是有些单词在词典中查询不到,例如一些根据词根现造的词,或者拼写错误的词等。
- Tokenization:将一段文本分成若干个元素,一个元素称为一个Token,而 token 是之后要被编码成向量然后送往模型的基本单位。
- Token:Token可以是一个单词、一个字母、甚至是“半个单词”
Tokenization 举例:
假设要对 Let us learn tokenization
做 Tokenization,通常有三种做法:
1:Word-Based Tokenization,结果为:[“Let”, “us”, “learn”, “tokenization.”]
2. Subword-based Tokenization,结果为:[“Let”, “us”, “learn”, “token”, “ization.”]
3. Character-based Tokenization,结果为:[“L”, “e”, “t”, “u”, “s”, “l”, “e”, “a”, “r”, “n”, “t”, “o”, “k”, “e”, “n”, “i”, “z”, “a”, “t”, “i”, “o”, “n”, “.”]
Word-based Tokenization
目标:将一段文本分成一个词一个词的Sequence
常用方法:
- 直接使用空格(Space)进行分隔(Split)
- 使用分隔符(delimiter)进行分隔,例如:空格和标点符号(Punctuation marks)
- 使用框架,例如:NLTK,spaCy,Keras,Gensim等
缺点:
- 会导致词典(Vocabulary)特别大,进而导致Embedding Matrix非常大,最终导致模型巨大,需要更多的训练资源
- 容易出现OOV问题
- 难以处理拼写错误的单词
缺点解决方案
- 缺点1,限制词典大小,例如,将出现次数最多的5000个单词编成词典,其他的单词全标记为UNKNOWN,但这样加重OOV问题
- 缺点2,使用Subword-based Tokenization
- 缺点3,无解
优点:word是具有含义的,例如:run
是跑的意思
Character-based Tokenization
目标:将一段文本分成一个字母一个字母的Sequence
常用方法:直接分就好了
优点:
- 总量固定
- 不存在OOV问题
- 拼写错误也可以应对
缺点:
- 一个字母不具备任何含义。(致命缺点)
- 会导致Sequence很长
致命缺点导致Character-based Tokenization基本不会被使用
对于中文这种一个Charactor也具有含义的,是可以使用Character-based Tokenization的,而且有时效果还很好(因为中文做分词很难)
Subword-based Tokenization
目标:将一段文本分成一个字词一个字词的Sequence,但有些词能拆就拆。
对Subword的进行举例说明:
例1. 将boys
拆成boy
和s
,这可以让模型学到,boys
和boy
的有相同的意思,但又有些微小的差别
例2. 将tokenization
拆成token
和ization
,这样的拆法可以让模型学到 tokenization
、tokens
、tokenizing
具有相近的意思。
例3. 接着例2,还可以让模型学到 tokenization
和 modernization
具有相同的词性
subword 时的一般原则:
- 频率非常高的词不进行拆分
- 将罕见的词拆成小的有意义的词
- 对于后缀,一般前面会增加一个特殊标记,例如将
tokenization
实际会拆成token
和##ization
,##
标记ization
是一个后缀
常用方法:
- WordPiece
- BPE(Byte-Pair Encoding)
- Unigram
- SentencePiece
优点:
- Vocabulary的大小还行,能接受
- 减少了OOV问题
- 模型甚至可以理解没见过的单词,例如,假设模型没见过
pretrain
,但由于拆分成了pre
和train
,模型就可能会理解该单词的意思是预训练
缺点:
- 好像依然没办法解决拼写错误的问题
参考资料
Word, Subword, and Character-Based Tokenization: Know the Difference: https://towardsdatascience.com/word-subword-and-character-based-tokenization-know-the-difference-ea0976b64e17