1. 分词和Tokenizer的核心概念
1.1 分词的定义
分词(Word Segmentation) window是NLP的基础任务,目的是将连续的文本(句子或段落)分割成有意义的语言单位(通常是单词、词语、子词或字符)。这些单位是后续NLP任务(如词性标注、句法分析、机器翻译、情感分析等)的基础。
- 英文分词:英文通常以空格和标点为分隔符,分词相对简单。例如:
- 输入:“I love to eat apples.”
- 输出:[“I”, “love”, “to”, “eat”, “apples”]
- 中文分词:中文没有明确的词语边界,分词需要依赖词典、上下文或模型。例如:
- 输入:“我爱吃苹果”
- 输出:[“我”, “爱”, “吃”, “苹果”]
1.2 Tokenizer的定义
Tokenizer(分词器)是一个工具、算法或模块,用于将原始文本分解为一系列“标记”(Tokens)。Tokens可以是:
- 单词(Word-level):如“I”, “love”。
- 子词(Subword-level):如“playing” → [“play”, “##ing”]。
- 字符(Character-level):如“我” → [“我”]。
- 字节(Byte-level):如Unicode字符的字节表示。
Tokenizer不仅限于分词,还可能包括:
- 去除标点或特殊字符。
- 转换为小写(英文)。
- 添加特殊标记(如[CLS]、[SEP],用于BERT)。
- 将Tokens映射为ID(用于模型输入)。
1.3 分词和Tokenizer的重要性
- 结构化文本:将无结构的文本转化为离散的、计算机可处理的单位。
- 语义保持:确保分割后的单位具有语义(如“苹果”作为一个词,而不是“苹”和“果”)。
- 模型输入:深度学习模型(如Transformer)需要将文本转化为数值化输入,分词是第一步。
- 跨语言适配:处理不同语言的分词规则(如英文的空格分隔、中文的连续性)。
1.4 分词 vs Tokenizer
- 分词:一个任务,目标是分割文本为语义单位。
- Tokenizer:实现分词任务的工具,可能包括额外的预处理步骤(如归一化、映射ID)。
2. 分词的挑战与语言特性
分词看似简单,但实际上面临诸多挑战,尤其是在不同语言、复杂场景和特定领域中。
2.1 语言差异
- 英文:
- 通常以空格和标点分隔,分词较简单。
- 挑战:缩写(如“don’t”)、连字符(如“well-known”)、专有名词(如“New York”)。
- 中文:
- 无明确词界,需依赖词典或模型判断。
- 例子:“南京市长江大桥”可能分为:
- 正确:[“南京市”, “长江大桥”]
- 错误:[“南京”, “市长”, “江大桥”]
- 日韩语:
- 类似中文,无明确词界,且有复杂的形态学(如日语的假名和汉字混合)。
- 泰语、越南语:
- 泰语无空格,越南语虽有空格但词界复杂。
- 多语言混合:
- 社交媒体文本(如“今天天气很好,btw I’m coding”)包含多语言、表情符号、缩写等。
2.2 歧义问题
分词结果因上下文而异:
- 中文:
- “研究生物”:
- [“研究生”, “物”](研究生和物体)
- [“研究”, “生物”](研究生物学)
- “他说的确实在理”:
- [“他”, “说”, “的”, “确实”, “在理”]
- [“他”, “说”, “的”, “确”, “实在”, “理”]
- “研究生物”:
- 英文:
- “New York”应作为一个Token,而不是[“New”, “York”]。
- “bank”可能是“银行”或“河岸”,需上下文消歧。
2.3 未登录词(OOV, Out-Of-Vocabulary)
- 定义:不在词典中的新词或专有名词(如“区块链”“自拍杆”)。
- 挑战:传统词典方法无法处理OOV。
- 解决方案:
- 子词分词(如BPE)。
- 字符级分词。
- 动态词典更新。
2.4 粒度选择
分词的粒度影响模型性能:
- 单词级:
- 优点:语义明确。
- 缺点:词汇表大,OOV问题严重。
- 子词级:
- 优点:平衡语义和泛化能力,适合多语言和OOV。
- 缺点:可能丢失部分语义。
- 字符级:
- 优点:词汇表最小,泛化能力强。
- 缺点:序列长,语义信息少。
- 字节级:
- 优点:支持任何语言,无需预处理。
- 缺点:计算成本高。