使用 fastai 进行文本分类的简明指南 - Fastai Part 5
子词分词
对于中文而言,由于不存在"词"的概念,fastai通过SentencePiece
提供的subword
支持变得至关重要。由于词与词之间没有空格:
我喜欢学习 (I like studying)
SentencePiece会将其分割为:
我/喜欢/学习/
这是通过直接在原始中文文本上进行无监督学习过程来完成的,使模型能够泛化到新词和新表达。这对中文很重要,因为它允许模型学习正确的词边界,避免以意想不到的方式分割词语。因此,我们可以将它们应用于fastai的NLP管道中使用的AWD-LSTM或基于Transformer的模型。
下面是另一个例子:
我喜欢吃辣椒。
▁我 ▁喜欢 ▁吃 ▁辣 ▁椒 ▁。
每个token要么是一个字符,要么是一个频繁出现的组合,这是模型从训练数据(原始文本)中随时间学习到的。_
标记了新子词的开始。如你所见,它正确地将喜
(快乐)和欢
(欢喜)组合为单个token喜欢
(喜欢)。
具体来说,子词分词可以这样完成:
# 假设 `text` 是原始文本
def subword(vocab_size):sw = SubwordTokenizer(vocab_size=vocab_size)sw.setup(text)return ' '.join(first(sw([text])))
注意,根据词汇表的大小,子词分词可能会产生不同的结果。词汇表越大,每句话的token越少,训练时间越快,但嵌入矩阵也越大。这就是为什么我们需要找到平衡。
数值化 - 将Token转换为数字
在本系列的第2部分中,我们学习了如何将图像转换为数字以进行分类任务。同样的原理适用于文本。计算机只能处理数字,所以我们需要将前一步的token转换为数字。然后我们可以将它们输入到神经网络中。
我们将利用fastai的Numericalize()
将token转换为整数。这是通过创建一个Vocab
对象来完成的,它是token到整数的映射。Numericalize()
然后使用这个映射将token转换为整数。然后我们可以将它们输入到fastai的Datasets
对象中,该对象对整个数据集应用相同的转换。结果的dataset.items
将包含整数。
下面是一个示例: