Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在上一篇文章中,我们开始讨论如何使用Python进行自然语言处理。我们学习了如何读写文本和PDF文件。在本文中,我们将开始使用spaCy库来执行一些更基本的NLP任务,如标记化、词干提取和词形还原。

SpaCy简介

spaCy库与NLTK都是最流行的NLP库之一。这两个库的基本区别在于,NLTK包含多种算法来解决一个问题,而spaCy只包含一种算法,但它是解决问题的最佳算法。

NLTK是在2001年发布的,而spaCy相对较新,是在2015年开发的。在这一系列关于NLP的文章中,我们将主要讨论spaCy,因为它的艺术性质。但是,当使用NLTK而不是spaCy更容易执行任务时,我们还将接触NLTK。

安装 spaCy

如果你使用pip安装程序安装Python库,打开命令行并执行以下语句:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

当然,如果你正在使用Anaconda,你需要在Anaconda提示符上执行以下命令:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

下载并安装spaCy之后,下一步是下载语言模块。我们将使用英语语言模块。语言模块用于执行各种NLP任务,我们将在后面的内容中看到。

下面的命令会下载语言模块:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

基本功能

在深入研究不同的spaCy函数之前,我们来简要地看看如何使用它。

作为第一步,你需要使用以下代码导入spacy库:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

接下来,我们需要载入spaCy语言模块。

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在上面的脚本中,我们使用spacy库中的load函数来加载核心英语语言模块。模块存储在sp变量中。

现在我们使用这个模块来创建一个小文档。文档可以是一个句子,也可以是一组句子,长度不限。下面的脚本创建一个简单的spaCy文档。

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

当使用该模块创建文档时,SpaCy会自动将文档分解为一系列标记。

标记是指句子中具有某种语义价值的单个部分。我们来看看我们的文档中都有哪些标记:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

上面脚本的输出看起来会是这样:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

可以看到我们的文档中有以下标记。我们还可以使用下面所示的.pos_属性来查看每个标记的词性:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

你可以看到,我们句子中的每个单词或标记都被指定了一个词性。例如,“Manchester”被标记为专有名词,“Looking”被标记为动词,等等。

最后,除了词性部分,我们还可以看到词性的依赖项。

我们来创建另一个文档:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

依赖项解析使用属性dep_,如下图所示:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出如下:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

从输出中,你可以看到spaCy足够智能,可以找到标记之间的依赖关系,例如在我们的句子中有一个单词is"nt。依赖项解析器将其分解为两个单词,并说明n"t实际上是对前一个单词的否定。

有关依赖项解析的详细理解,请参阅本文。

除了打印单词外,还可以从文档中打印句子。

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

现在,我们可以使用下面的脚本遍历每个句子:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出如

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

你还可以检查一个句子是否以特定标记开头。你可以使用索引和方括号(类似于数组)获取单个标记:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在上面的脚本中,我们正在搜索文档中的第5个单词。请记住,索引是从零开始,句点作为标记。在输出你应该能看到:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

现在,要查看文档中是否有以The开头的句子,我们可以使用is_sent_startattribute属性,如下所示:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在输出中,你会看到True,因为在第二句的开头使用了The标记。

在本节中,我们看到了spaCy库的一些基本操作。现在让我们更深入地研究,详细了解标记化、词干提取和词形还原。

标记化

如前所述,标记化是将文档分解为单词、标点符号、数字等的过程。

我们来详细看看spaCy标记化。使用以下脚本创建一个新文档:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

你可以看到这个句子的开头和结尾都有引号。缩写 "U.K" 和 "U.S.A."中还包含标点符号。

我们来看看spaCy是如何标记化这个句子的。

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在输出中,可以看到spaCy标记了开始和结束的双引号。但是,它还是很智能的,没有标记缩写词(例如U.K. 和 U.S.A.)之间的标点符号。

我们来看另一个标记化的例子:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在上面的句子中,“non-vegetarian”一词和电子邮件地址中都有破折号。我们来看看spaCy会如何标记这个:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

从输出结果可以明显看出,spaCy实际上能够检测到这个电子邮件,尽管它有一个“-”,但并没有对其进行标记。另一方面,“non-vegetarian”一词被标记出来。

现在我们来看看如何统计文档中的单词:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在输出中,你会看到14,这是sentence4中标记的数量。

检测实体

除了将文档标记化为单词之外,你还可以发现该单词是否为实体短语,如公司、地点、建筑物、货币、机构等。

我们来看一个命名的实体识别的简单例子:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

我们首先来简单对它进行标记:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

我们知道“Manchester United”是一个单词,所以它不应该被标记成两个单词。同样,“Harry Kane”是一个人的名字,“$ 9000 million”是货币值。这些也不应该被标记。

这就是命名实体识别发挥作用的地方。要从一个文档中获取命名实体,必须使用ents属性。我们来从上面的句子中检索命名实体。执行以下脚本:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在上面的脚本中,我们打印出实体的文本、实体的标签和实体的详细信息。输出如下:

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

你可以看到spaCy的命名实体识别器已经成功地将“Manchester United”作为一个组织,“Harry Kane”作为一个人,“$90 million”作为货币值识别出。

检测名词

除了检测命名实体外,还可以检测名词。为此,可以使用noun_chunks属性。考虑一下下面这句话:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

我们试着找出这个句子中的名词:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

从输出中可以看到,名词也可以是命名实体,反之亦然。

词干提取

词干提取是指将一个单词还原为它的词根形式。在执行自然语言处理任务时,在遇到的各种场景中,你会发现具有相同词根的不同单词。例如,computer, computer, computing, computed等。为了统一起见,你可能希望将单词缩减为词根形式。这就是词干提取的作用。

你可能会感到惊讶,但是spaCy不包含任何词干提取功能,因为它只依赖于词形还原。因此,在本节中,我们将使用NLTK进行词干提取。

在NLTK中有两种类型的词干提取器:Porter Stemmer和Snowball Stemmer。它们都是使用不同的算法实现的。

Porter Stemmer

我们来实际看一下 porter stemmer:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

先创建一个PorterStemmer类.

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

假设我们有以下的列表,我们想要将这些单词缩减为词干:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

下面的脚本使用porter stemmer查找列表中的单词的词干:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出如下:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

你可以看到,这四个单词都被简化成“comput”,这其实根本就不是一个单词。

Snowball Stemmer

Snowball stemmer是Porter stemmer的一个稍微改进版本,通常比后者更受欢迎。我们来实例看看:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

在上面的脚本中,我们使用Snowball stemmer来查找与porter stemmer实例中相同的4个单词的词干。输出如下:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

你可以看到结果是一样的。我们仍然得到“comput”作为词干。再说一遍,”comput” 这个词实际上不是字典里的单词。

这样一来词形还原就派上用场了。词形还原将这个单词缩减为在词典中出现的它的词干。通过词形还原返回的词干是实际的字典单词,它的语义是完整的,不像词干提取器返回的单词。

词形还原

虽然不能用spaCy进行词干提取,但可以用spaCy进行词形还原。

为此,我们需要使用spaCy文档中的lemma_属性。假设我们有下面这句话:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

我们可以通过下面的代码使用spaCy词形还原找到所有单词的词根:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

上面脚本的输出如下:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

可以看到不像词干提取得到的词根是“comput”,我们这里得到的词根是字典中的实际单词。

词形还原将第二种或第三种形式的单词转换为它们的第一种变体。请看下面的例子:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

输出:

Python自然语言处理: 使用SpaCycle库进行标记化、词干提取和词形还原

从输出中可以清楚地看到,“written”、“released”等第二、三种形式的单词已被转换为第一种形式,即:“write”和“release”。

结论

标记化、词干提取和词形还原是一些最基本的自然语言处理任务。在本文中,我们了解了如何使用spaCy库执行标记化和词形还原。我们还了解了如何使用NLTK进行词干提取。在下一篇文章中,我们将开始讨论Python中的词汇和短语匹配。

英文原文:https://stackabuse.com/python-for-nlp-tokenization-stemming-and-lemmatization-with-spacy-library/
译者:浣熊君( ・᷄৺・᷅ )