Natural Language Toolkit 简明教程
Natural Language Toolkit - Tokenizing Text
What is Tokenizing?
它可以被定义为将一段文本分解为更小的部分(例如句子和单词)的过程。这些较小的部分称为标记。例如,单词是句子中的标记,句子是段落中的标记。
众所周知,NLP 用于构建诸如情感分析、问答系统、语言翻译、智能聊天机器人、声音系统等应用程序,因此,为了构建它们,了解文本中的模式变得至关重要。上面提到的标记在查找和理解这些模式方面非常有用。我们可以将标记化视为其他流程(如词干提取和词形还原)的基本步骤。
NLTK package
nltk.tokenize 是 NLTK 模块提供的用于实现标记化过程的包。
Tokenizing sentences into words
将句子拆分词语或从字符串中创建词语列表是每个文本处理活动中必不可少的部分。让我们通过 nltk.tokenize 包提供的各种函数/模块来理解它。
Example
import nltk
from nltk.tokenize import word_tokenize
word_tokenize('Tutorialspoint.com provides high quality technical tutorials for free.')
Output
['Tutorialspoint.com', 'provides', 'high', 'quality', 'technical', 'tutorials', 'for', 'free', '.']
TreebankWordTokenizer Class
上面使用的 word_tokenize 模块基本上是一个封装函数,它将 tokenize() 函数作为 TreebankWordTokenizer 类的实例进行调用。它将给出与我们使用 word_tokenize() 模块将句子拆分为词语时获得的相同输出。让我们看看上面实现的相同示例 −
Example
首先,我们需要导入自然语言工具包 (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.'
)
Output
[
'Tutorialspoint.com', 'provides', 'high', 'quality',
'technical', 'tutorials', 'for', 'free', '.'
]
Complete implementation example
让我们在下面看到完整的实现示例
import nltk
from nltk.tokenize import TreebankWordTokenizer
tokenizer_wrd = TreebankWordTokenizer()
tokenizer_wrd.tokenize('Tutorialspoint.com provides high quality technical
tutorials for free.')
Output
[
'Tutorialspoint.com', 'provides', 'high', 'quality',
'technical', 'tutorials','for', 'free', '.'
]
分词器最重要的约定是区分缩写。例如,如果我们为此目的使用 word_tokenize() 模块,它将以如下方式输出 −
Output
['wo', "n't"]]
TreebankWordTokenizer 的这种约定是不可接受的。这就是为什么我们有两个可选分词器,即 PunktWordTokenizer 和 WordPunctTokenizer 。
Tokenizing text into sentences
在本节中,我们将把文本/段落分成句子。NLTK为此目的提供 sent_tokenize 模块。
Why is it needed?
一个出现在我们脑海中的明显问题是,当我们有分词器时,为什么我们需要句子分词器,或者为什么我们需要将文本分词成句子。假设我们需要计算句子中的平均单词,我们如何做到?为了完成这项任务,我们需要句子分词和单词分词。
让我们借助以下简单的示例了解句子和单词分词之间的差异 −
Sentence tokenization using regular expressions
如果您觉得分词器的输出不可接受,并且想要完全控制如何分词文本,我们有正则表达式,可在进行句子分词时使用。NLTK提供 RegexpTokenizer 类来实现此目的。
让我们借助以下两个示例来理解这个概念。
在第一个示例中,我们将使用正则表达式来匹配字母数字令牌和单引号,以避免拆分 “won’t” 之类的缩写。
Example 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.")
Output
["won't", 'is', 'a', 'contraction']
["can't", 'is', 'a', 'contraction']
在第一个示例中,我们将使用正则表达式在空格上分词。
Example 2
import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('/s+' , gaps = True)
tokenizer.tokenize("won't is a contraction.")