📜  自然语言工具包-标记文本

📅  最后修改于: 2020-10-14 09:09:10             🧑  作者: Mango


什么是代币化?

它可以定义为将一段文本分解为较小的部分(例如句子和单词)的过程。这些较小的部分称为令牌。例如,单词是句子中的标记,而句子是段落中的标记。

众所周知,NLP用于构建应用程序,例如情感分析,QA系统,语言翻译,智能聊天机器人,语音系统等,因此,为了构建它们,理解文本中的模式变得至关重要。上面提到的令牌对于查找和理解这些模式非常有用。我们可以将标记化视为其他方法(如词干和词法化)的基础步骤。

NLTK套件

nltk.tokenize是NLTK模块提供的用于实现标记化过程的软件包。

将句子标记为单词

将句子拆分为单词或从字符串创建单词列表是每个文本处理活动的重要组成部分。让我们借助nltk.tokenize软件包提供的各种功能/模块来理解它。

word_tokenize模块

word_tokenize模块用于基本单词标记化。以下示例将使用此模块将句子拆分为单词。

import nltk
from nltk.tokenize import word_tokenize
word_tokenize('Tutorialspoint.com provides high quality technical tutorials for free.')

输出

['Tutorialspoint.com', 'provides', 'high', 'quality', 'technical', 'tutorials', 'for', 'free', '.']

TreebankWordTokenizer类

上面使用的word_tokenize模块基本上是一个包装函数,该函数调用tokenize()函数作为TreebankWordTokenizer类的实例。它将提供与使用word_tokenize()模块将句子拆分成单词时获得的输出相同的输出。让我们看看上面实现的相同示例-

首先,我们需要导入自然语言工具包(nltk)。

import nltk

现在,导入TreebankWordTokenizer类以实现单词分词器算法-

from nltk.tokenize import TreebankWordTokenizer

接下来,创建TreebankWordTokenizer类的实例,如下所示:

Tokenizer_wrd = TreebankWordTokenizer()

现在,输入要转换为标记的句子-

Tokenizer_wrd.tokenize(
   'Tutorialspoint.com provides high quality technical tutorials for free.'
)

输出

[
   'Tutorialspoint.com', 'provides', 'high', 'quality', 
   'technical', 'tutorials', 'for', 'free', '.'
]

完整的实施示例

让我们看下面完整的实现示例

import nltk
from nltk.tokenize import TreebankWordTokenizer
tokenizer_wrd = TreebankWordTokenizer()
tokenizer_wrd.tokenize('Tutorialspoint.com provides high quality technical
tutorials for free.')

输出

[
   'Tutorialspoint.com', 'provides', 'high', 'quality', 
   'technical', 'tutorials','for', 'free', '.'
]

分词器最重要的约定是分隔收缩。例如,如果我们为此目的使用word_tokenize()模块,它将给出如下输出:

import nltk
from nltk.tokenize import word_tokenize
word_tokenize('won’t')

输出

['wo', "n't"]]

TreebankWordTokenizer的这种约定是不可接受的。这就是为什么我们有两个替代的单词标记器,即PunktWordTokenizerWordPunctTokenizer

WordPunktTokenizer类

另一种单词标记器,它将所有标点符号拆分为单独的标记。让我们通过以下简单示例了解它-

from nltk.tokenize import WordPunctTokenizer
tokenizer = WordPunctTokenizer()
tokenizer.tokenize(" I can't allow you to go home early")

输出

['I', 'can', "'", 't', 'allow', 'you', 'to', 'go', 'home', 'early']

将文本标记为句子

在本节中,我们将文本/段落分为句子。 NLTK为此提供了send_tokenize模块。

为什么需要它?

我们想到的一个明显问题是,当我们有单词标记器时,为什么我们需要句子标记器或为什么需要将文本标记为句子。假设我们需要计算句子中的平均单词数,我们该怎么做?为了完成此任务,我们需要句子标记化和单词标记化。

通过以下简单示例,让我们了解句子和单词分词器之间的区别-

import nltk
from nltk.tokenize import sent_tokenize
text = "Let us understand the difference between sentence & word tokenizer. 
It is going to be a simple example."
sent_tokenize(text)

输出

[
   "Let us understand the difference between sentence & word tokenizer.", 
   'It is going to be a simple example.'
]

使用正则表达式的句子标记化

如果您认为单词分词器的输出不可接受,并且希望完全控制如何对文本进行分词,则可以使用正则表达式来进行句子分词。 NLTK提供RegexpTokenizer类来实现此目的。

让我们借助下面的两个示例来理解这一概念。

在第一个示例中,我们将使用正则表达式来匹配字母数字标记和单引号,以便我们不会拆分“ wo n’t”之类的收缩。

例子1

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer("[\w']+")
tokenizer.tokenize("won't is a contraction.")
tokenizer.tokenize("can't is a contraction.")

输出

["won't", 'is', 'a', 'contraction']
["can't", 'is', 'a', 'contraction']

在第一个示例中,我们将使用正则表达式对空白进行标记化。

例子2

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('/s+' , gaps = True)
tokenizer.tokenize("won't is a contraction.")

输出

["won't", 'is', 'a', 'contraction']

从上面的输出中,我们可以看到标点符号保留在令牌中。参数gaps = True表示模式将识别要标记的间隙。另一方面,如果我们将使用gaps = False参数,则该模式将用于标识令牌,在以下示例中可以看到-

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('/s+' , gaps = False)
tokenizer.tokenize("won't is a contraction.")

输出

[ ]

这将为我们提供空白输出。