自然语言工具包 - 文本分词



什么是分词?

它可以定义为将一段文本分解成更小部分的过程,例如句子和单词。这些较小的部分称为标记。例如,在一个句子中,单词是一个标记;在一个段落中,句子是一个标记。

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

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为此提供sent_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类来实现这一点。

让我们通过以下两个示例来了解这个概念。

在第一个示例中,我们将使用正则表达式匹配字母数字标记加上单引号,这样我们就不会分割像“won’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.")

输出

[ ]

它将给我们一个空白输出。

广告