符号化是将一段文本分解为称为符号的小单元的过程。一个标记可以是一个词,一个词的一部分,或者只是像标点符号这样的字符。
这是NLP最基本的任务之一,也是一项困难的任务,因为每种语言都有自己的语法结构,而这些语法结构往往很难写成规则。
简介
符号化是NLP中最没有魅力的部分之一。我们如何分割我们的文本,以便我们可以对其进行有趣的处理。
尽管它缺乏魅力,但它是超级重要的。
标记化定义了我们的NLP模型可以表达什么。尽管标记化是超级重要的,但它并不总是被放在首位。
在本文的其余部分,我想给你一个关于标记化的高层次概述,它从哪里来,它采取什么形式,以及标记化在什么时候和如何重要。
为什么它被称为标记化?
在我们深入了解其日常使用之前,让我们先看看标记化的历史。我想知道的第一件事是为什么它被称为标记化。
自然语言处理与 "形式语言"齐头并进,这是一个介于语言学和计算机科学之间的领域,基本上是研究编程语言的语言方面。
就像自然语言一样,形式语言也有具有意义的独特字符串;我们通常称它们为词,但为了避免混淆,形式语言的人称它们为标记。
换句话说,令牌是一个具有已知含义的字符串。
第一个可以看到这一点的地方是在你的代码编辑器中。
当你在python中写下def ,它就会被染上颜色,因为代码编辑器将def 识别为具有特殊含义的标记。另一方面,如果你写了 "def",它的颜色就会不同,因为代码编辑器会把它识别为一个含义为 "任意字符串 "的标记。
def foo:
"def foo"
现代自然语言处理对标记的意义有一些不同的思考。正如我们将在下面看到的,现代标记化对标记的意义不太关心。
我们为什么要进行标记化?
这就给我们带来了一个问题,为什么我们在做NLP的时候需要标记化?
乍一看,这似乎很傻。我们有一堆文本,我们希望计算机能够处理所有的文本,那么我们为什么要把文本分成小的标记呢?
编程语言的工作方式是将原始代码分解成标记,然后通过自然语言处理中的一些逻辑(程序的语法)将它们组合起来。
通过将文本分解成小的、已知的片段,我们可以应用一套小的(大约)规则,将它们组合成一些更大的意义。在编程语言中,标记是通过正式的语法连接的。
但在自然语言处理中,多年来在一系列标记化方法的同时,也发展了不同的组合标记的方式。但标记化背后的动机是不变的,即为计算机提供一些有限的符号集,使其能够组合产生所需的结果。
符号有意义吗?
在编程语言中,像def这样的标记有明确的含义,而自然语言就比较微妙了,说一个标记是否有意义就成了一个深奥的哲学问题。
像Word2Vec或GloVe这样的算法,将一个向量分配给一个标记,已经让我们习惯于标记有意义的想法。你可以做 "King-man +woman",得到queen的向量。这似乎很有意义。
重要的是要记住,Word2Vec及其变体本质上是一个从标记(如符号)到向量--数字列表的映射。其含义是,所捕获的 "意义 "和能够具有意义的东西取决于你是如何将文本标记化的,开始时。我们将在下面看到一些例子。
为什么标记化是困难的
我是一个以希伯来语为母语的人,希伯来语是一种有趣的语言。这个词×××可能是指书,理发师,遥远的地方,或故事。
这些被称为 "异形词 " 的单词,拼写相同,但意义不同,发音也不同。 在自然语言处理中,异义词可能是有问题的,因为我们把所有不同的含义分配给同一个标记,我们的NLP算法可能无法区分它们。
我最喜欢的一个棘手的标记化的例子是如下。
"有四个字母的东西从来不会有五个字母,但有时会有九个字母。"
如果你注意到结尾处的句号,你会发现这不是一个问题。
这个例子为自然语言处理提出了三个不同的棘手问题:
首先,你的标记化过程是否保留了标点符号?
第二,我们遇到了一个异名问题的变种:what、never和sometimes在这里并不是按其意义使用的,而是作为任意字符串使用的。
最后,我们再次看到,一个标记的意义往往取决于它所呈现的背景。正如Firth所说,"一个词将被它的同伴所了解"。
符号化的第二个考虑因素是词汇量,即我们的系统所识别的不同符号的数量。在几乎所有的NLP系统中,词汇量是一个前期的决定,在未来不能被扩展或更新。
乍一看,我们很自然地想要捕捉 "所有的标记",这样我们就不会错过任何东西。
然而,这种选择往往是有代价的。拥有大量稀缺的标记使NLP系统容易过度拟合。另外,对于生成文本的系统来说,训练和推理的计算成本随着标记数量的增加而增加,并很快成为一个障碍。参见论文[训练大词汇量神经语言模型的策略][5-strategies-for-large-vocab]以了解更多细节和克服该问题的方法。
NLP中使用的不同类型的标记化是什么?
最近的NLP方法,在深度学习的支持下,在它们出现的上下文中解释了标记,包括很长的上下文。
这种能力减轻了我们上面看到的异名问题,也使NLP系统在面对罕见的标记时更加稳健,因为系统可以根据它们的上下文推断它们的 "含义"。
NLP世界中这些相对较新的能力改变了我们对文本进行标记的方式。非深度学习系统通常采用管道方法进行标记。
首先,文本被分割成候选标记(通过在空白处分割或使用更复杂的启发式方法),然后合并相似的标记(Walked和walking都会被合并成walk),并删除嘈杂的标记(如an、the、I)。
更现代的标记化方案,通常被称为子词标记化器,如Sentence piece或BPE算法,将标记拆分和合并成更复杂的形式。
例如,BPE是一种支持无界词汇的标记化方案,它将一些我们认为是标记的东西表达为成对的标记或更多。例如,有时你会看到一个字母,但BPE会把这个字母标记为两个甚至三个标记。
一个新兴的趋势是几乎完全放弃标记化,在字符层面上运行NLP算法。
这意味着我们的模型在处理字符时,需要学习其含义的简单性并处理更长的序列。字符级别的NLP允许我们跳过标记化的微妙之处,并避免它可能带来的错误,有时会产生显著的效果。
通常在NLP项目的开始阶段,标记化方案的细微差别并不是需要处理的最关键问题。然而,随着项目的发展,了解和调整标记化方案往往是提高模型性能的最简单的方法之一。
标记化和注解
现代NLP是由监督学习推动的。我们对文档进行注释,为我们的ML模型创建训练数据。当处理标记分类任务时,也被称为序列标签,我们的注释与标记化方案保持一致,或者我们知道如何在下游对齐它们,这是至关重要的。
LightTag
我的公司LightTag制作文本注释工具,我们的客户用由此产生的注释建立NLP模型。我们一次又一次地看到,对于复杂的文本和注释方案,在注释本身之后,准确的标记化是投资回报率最高的活动。
这是因为下游模型只能根据标记化方案 "看到 "和输出标记,而当该方案与建模者的目标不完全一致时,结果就不那么完美。
今天,许多公司在选择了一个模型后开始他们的注释工作,并试图根据它的标记化约束来进行注释。作为一个临别建议,请做相反的事情。当你注释文本时,要根据你所期望的结果进行注释,然后再选择符合该结果的模型和标记化方案。