将讨论标记化的各种细微差别,包括如何处理词汇量不足(OOV)
标记化在处理文本数据中起着重要作用。因此,在本文中,我们将探讨自然语言处理中标记化的深度以及如何在Python中实现它。
如果您不熟悉NLP,建议您花一些时间浏览以下资源:
自然语言处理(NLP)简介
1、标记化的快速总结
标记化是自然语言处理(NLP)中的常见任务。这是Count Vectorizer之类的传统NLP方法和Transformers之类的基于高级深度学习的体系结构的基础步骤。
令牌是自然语言的基础
令牌化是一种将文本分成称为令牌的较小单元的方法。在这里,令牌可以是单词,字符或子单词。因此,标记化可以大致分为3种类型:单词,字符和子词(n-gram字符)标记化。
例如,考虑以下句子:“永不放弃”。
形成令牌的最常见方式是基于空间。假设以空格作为分隔符,则该句子的标记化会导致3个标记–永不放弃。由于每个标记都是一个单词,因此它成为单词标记化的一个示例。
同样,令牌可以是字符或子词。例如,让我们考虑“更智能”:
角色标记:更聪明
子词令牌:更聪明
2、代币化背后的真正原因
由于令牌是自然语言的基础,因此处理原始文本的最常见方法是在令牌级别上进行。
例如,基于Transformer的模型-NLP中的最新技术(SOTA)深度学习架构-在令牌级别处理原始文本。同样,RLP,GRU和LSTM等NLP最受欢迎的深度学习体系结构也在令牌级别处理原始文本。

RNN在特定时间步接收并处理每个令牌。
因此,在对文本数据进行建模时,标记化是最重要的步骤。对语料库执行令牌化以获得令牌。然后使用以下标记准备词汇表。词汇表是语料库中唯一的标记集。请记住,可以通过考虑语料库中的每个唯一标记或通过考虑前K个频繁出现的单词来构造词汇。
创建词汇表是令牌化的最终目标。
提高NLP模型性能的最简单的技巧之一是用经常出现的前K个单词来创建词汇。现在,让我们了解基于传统和高级深度学习的NLP方法中词汇的用法。
传统的NLP方法(例如Count Vectorizer和TF-IDF)使用词汇作为功能。词汇表中的每个单词都被视为一个独特功能:

在基于高级深度学习的NLP体系结构中,词汇表用于创建标记化的输入语句。最后,这些句子的标记作为输入传递给模型
您应该使用哪种标记?
如前所述,可以在单词,字符或子单词级别执行标记化。这是一个常见的问题–解决NLP任务时应使用哪种标记化?让我们在这里解决这个问题。
词标记化
单词标记化是最常用的标记化算法。它将基于某个定界符将一段文本分割成单个单词。根据定界符,形成不同的单词级令牌。诸如Word2Vec和GloVe之类的预训练单词嵌入在单词标记化之下。
但是,这几乎没有缺点。
单词标记化的缺点
单词标记的主要问题之一是处理 词汇不足(OOV)单词。OOV单词是指在测试中遇到的新单词。这些新词在词汇表中不存在。因此,这些方法无法处理OOV字。但是,请等待–尚未得出任何结论!
一个小技巧可以从OOV单词中拯救单词标记器。诀窍是用前K个常用词形成词汇表,并用未知标记(UNK)替换训练数据中的稀有词。这有助于模型学习使用UNK令牌表示的OOV单词的表示形式
因此,在测试期间,词汇表中不存在的任何单词都将映射到UNK令牌。这就是我们如何解决单词分词器中的OOV问题。
这种方法的问题在于,当我们将OOV映射到UNK令牌时,单词的所有信息都会丢失。单词的结构可能有助于准确表示单词。另一个问题是,每个OOV单词都具有相同的表示形式
单词标记的另一个问题与词汇量有关。通常,在大量文本语料库上训练预训练模型。因此,想象一下在如此大的语料库中用所有独特的单词来构建词汇表。这使词汇量大增!
这为字符标记化打开了大门。
字符标记化
字符标记化将一段文本分成一组字符。它克服了我们在上面看到的关于单词标记化的缺点。字符分词器通过保留单词的信息来连贯地处理OOV单词。它将OOV单词分解为字符,并用这些字符表示该单词。它还限制了词汇量。是否想对词汇量进行猜测?
字符标记化的缺点
字符标记解决了OOV问题,但是随着我们将句子表示为字符序列,输入和输出句子的长度会迅速增加。结果,学习字符之间的关系以形成有意义的单词变得具有挑战性。
这将我们带到另一个称为子词标记化的标记化,它位于单词和字符标记化之间。
子词标记化
子词标记化将文本片段划分为子词(或n-gram字符)。例如,可以将“ lower”之类的词细分为“ lower”,“ smartest”和“ smartest”等。
基于变换的模型(NLP中的SOTA)依赖于子词标记化算法来准备词汇表。现在,我将讨论一种最流行的子字标记化算法,称为字节对编码(BPE)
欢迎使用字节对编码(BPE)
字节对编码(BPE)是基于变压器的模型中广泛使用的标记化方法。BPE解决了单词和字符分词器的问题:
BPE有效地解决了OOV问题。它将OOV细分为子词,并根据这些子词表示该词
与字符标记化相比,BPE之后的输入和输出语句的长度更短。BPE是一种分词算法,可以迭代地合并最频繁出现的字符或字符序列。这是学习BPE的分步指南。
学习BPE的步骤
(1)</ w>之后,将语料库中的单词拆分为字符
(2)用语料库中的独特字符初始化词汇表
(3)计算语料库中一对字符或字符序列的频率
(4)合并语料库中最常见的一对
(5)将最佳配对保存到词汇表中
(6)重复步骤3至5进行一定次数的迭代
我们将通过一个示例来理解这些步骤。

考虑一个语料库:
a)将单词(例如</ w>)符号的末尾附加到语料库中的每个单词上

1b)将语料库中的单词标记为字符:

2.初始化词汇表:

迭代1:
3.计算频率:

4.合并最频繁的一对

5.保存最好的一对:

从现在开始,对每个迭代重复步骤3-5。让我再说明一次迭代。
迭代2:
3.计算频率:

4.合并最频繁的一对:

5.保存最好的一对:

经过10次迭代后,BPE合并操作如下所示:

很简单吧?
令牌化是一种处理文本数据的强大方法。我们在本文中对此有所了解,还使用Python实现了标记化。
继续并在您拥有的任何基于文本的数据集上进行尝试。练习得越多,您对令牌化的工作原理(以及为什么它是至关重要的NLP概念)的理解就更好。如果您对本文感兴趣,可以关注:数据分析1吧,会持续更新。


副业
