带实例的Spacy Tokenizer完整指南

1,468 阅读7分钟

简介

在本教程中,我们将通过实例介绍初学者对Spacy标记器的理解。我们将让你简单了解自然语言处理中的标记化,然后告诉你如何在Spacy库中进行标记化。我们将涵盖各种例子,包括自定义标记器、第三方标记器、句子标记器等。

什么是标记化?

标记化是将文本分割成小段的任务,称为标记。标记化可以是在文档层面上产生句子的标记,也可以是产生单词标记的句子标记,还可以是产生字符标记的单词标记。

标记器通常是文本预处理管道的初始步骤,并作为后续NLP操作的输入,如词根化、词母化、文本挖掘、文本分类等。

Spacy Tokenizer

图片来源

Spacy 符号化器

在Spacy中,将文本标记为单词和标点符号段的过程分多个步骤进行。它从左到右处理文本。

  • 首先,标记化器在空白处分割文本,类似于split()函数。
  • 然后,标记化器检查子串是否符合标记化器的例外规则。例如,"don't "不包含空白,但应该被分割成两个标记,"do "和 "n't",而 "U.K. "应该始终保持一个标记。
  • 接下来,它检查子串中是否有前缀、后缀或内缀,这些包括逗号、句号、连字符或引号。如果匹配,子串就会被分割成两个标记。

在下面的例子中,我们使用spacy对文本进行标记。首先,我们导入spacy库,然后加载spacy的英语语言模型,然后迭代doc对象的标记,在输出中打印它们。

In [1]:

import

[输出] :

You
only
live
once
,
but
if
you
do
it
right
,
once
is
enough
.

创建标记器

在spacy中,我们可以非常容易地在管道中添加我们自己创建的标记器。例如,在下面的代码中,我们正在添加空白的标记器,只有英文词汇。

在 [2]:

# Construction 1

[输出] :

Blank tokenizer : Let's, go, to, N.Y., 
Default tokenizer : Let, 's, go, to, N.Y.,

添加特殊规则

在某些情况下,我们需要定制我们的标记化规则。这可能是一个表达式或一个缩写,例如,如果我们的文本中有ViratKohli,我们需要在标记化过程中分割它(Virat Kholi)。这可以通过在现有的标记化规则中添加一个特殊的规则来实现。

在[3]中。

import

[Out] :

Normal tokenization :  ViratKholi, is, the, worlds, best, bastman, 
Special case tokenization :  Virat, Kholi, is, the, worlds, best, bastman,

调试符号化器

spacy库提供了一个调试工具,即nlp.tokenizer.explain(text),它返回一个包含token本身和它被标记的规则的tuples列表。

在[4]中。

from

[Out] :

Let 	 SPECIAL-1
's 	 SPECIAL-2
move 	 TOKEN
to 	 TOKEN
L.A. 	 TOKEN

定制Spacy标记器

在Spacy中,我们可以用我们自己的定制规则创建我们自己的标记器。例如,如果我们想为一种新的语言创建一个标记器,这可以通过定义一个新的标记器方法并向该方法添加标记规则来实现。这些规则是前缀搜索、英缀搜索、后缀搜索、URL搜索,以及定义特殊情况。下面的代码是一个创建tokenizer类的例子。

In [5]:

import

[Out] :

['hello', '-', 'world.', ':)']

修改标记器的现有规则

在spacy中,我们也可以在NLP的Default对象的帮助下,通过添加或删除前缀、后缀或infix规则中的字符来修改标记器的现有规则。

i) 在后缀搜索中添加字符

在下面的代码中,我们将'+'、'-'和'$'添加到后缀搜索规则中,这样,只要在后缀中遇到这些字符,就可以被删除。

在 [6]:

from

[输出] :

Default tokenized text : This, is+, a-, tokenizing$, sentence. .,

ii) 从后缀搜索中删除字符

由于我们在后缀规则中添加了后缀,同样我们也可以从后缀规则中删除一些后缀。例如,我们要从后缀规则中删除后缀标记化'('。

在[7]。

from

[Out] :

Default tokenized text : This, is, a, (, tokenizing, ), sentence, ., 
Text after adding suffixes : This, is, a, (tokenizing, ), sentence .,

添加一个自定义标记化类

我们可以自定义nlp doc的对象的标记化类。这可以通过创建一个标记化类并将其分配给nlp.tokenize.例如,我们可以在我们的标记化对象中添加一个基本的白色空间标记化器。

在[8]。

import

[Out] :

['The', 'purpose', 'of', 'our', 'lives', 'is', 'to', 'be', 'happy.']

第三方标记器(BERT词件

我们还可以添加任何其他的第三方标记器。在下面的例子中,我们使用了由标记器库提供的BERT字片标记器。

在[9]。

from

[输出] :

Justin Drew Bieber is a Canadian singer, songwriter, and actor. 
['Justin', 'Drew', 'Bieber', 'is', 'a', 'Canadian', 'singer', ',', 'songwriter', ',', 'and', 'actor', '.']

标记的合并和拆分

在标记化的过程中,我们可以通过使用Doc.reokenize上下文管理器来合并或拆分我们的标记。当上下文管理器退出时,标记化中的修改被存储并一次性执行。

要将几个令牌合并成一个单一的令牌,可以向tokenizer.merge传递一个Span。

i) 合并标记

我们可以通过向tokenizer.merge传递一个跨度的doc来将几个标记合并成一个标记。一个可选的attrs字典让我们设置将被分配给合并的标记的属性--例如,词法、语篇标签或实体类型。默认情况下,合并后的标记将收到与合并后的span根相同的属性。

在[10]。

import

[Out] :

Before: ['I', 'live', 'in', 'New', 'York']
After: ['I', 'live', 'in', 'New York']

ii) 拆分标记

我们可以使用retokenizer.split方法将一个令牌分割成两个或多个令牌。例如,如果我们想把'NarendraModi'分成两个'Narendra'和'Modi',我们可以应用这个规则。

在[11]。

import

[输出] :

Before: ['PM', 'NarendraModi', 'is', 'our', 'prime', 'minister']
After: ['PM', 'Narendra', 'Modi', 'is', 'our', 'prime', 'minister']

句子标记化

句子标记化是对文本的句子进行分割的过程。我们可以通过使用Doc.sents对句子进行迭代。我们可以通过调用属性名称为 "SENT_START "的Doc.has_annotation来检查一个Doc是否有句子的边界。

下面的代码是一个将文本分割成句子的例子。

In [12]:

import

[Out] :

True
This is a sentence.
This is another sentence.

然而,SpaCy已经提供了四种方法来标记一个句子。这些方法是::

  • 依赖性分析器方法
  • 统计性句子分割器方法
  • 基于规则的管道组件方法
  • 自定义函数法

i) 默认。使用依存关系解析

spaCy库使用完整的依赖关系解析来确定句子的边界。这通常是最准确的方法,也是默认的句子分割器,但它需要一个经过训练的管道来提供准确的预测。如果我们的文本更接近于通用的新闻或网络文本,这种方法的准确性很好。

在[13]。

import

[出]:

This is a sentence.
This is another sentence.

ii) 统计性句子分割器

统计句子识别器是一个更简单、更快速的替代分析器的方法,它只提供句子的边界。它更容易训练,因为它只需要注释的句子边界,而不是完整的依赖分析。

在[14]中。

import

[Out] :

This is a sentence.
This is another sentence.

iii) 基于规则的流水线组件

基于规则的Sentencizer使用可定制的句末标点符号列表(如.、!或?)设置句子边界。

在[15]中。

import

[输出] :

This is a sentence.
This is another sentence.

iv) 基于规则的自定义策略

如果我们想实现自己的策略,与默认的基于规则的分句方法不同,我们也可以创建一个自定义管道组件,该组件接收一个Doc对象,并在每个单独的标记上设置Token.is_sent_start属性。

在[16]。

from

[Out] :

Before: ['this is a sentence...hello...and another sentence.']
After: ['this is a sentence...', 'hello...', 'and another sentence.']

参考资料 -Spacy文档

The postComplete Guide to Spacy Tokenizer with Examplesappeared first onMLK - Machine Learning Knowledge.