热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在上一篇文章中,我们开始讨论如何使用Python进行自然语言处理。我们学习了如何读写文本和PDF文件。在本文中,我们将开始使用spaCy库来执行一些更基
ca02e645a798935e02b4cbc4ea467b07.png

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

SpaCy简介

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

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

安装 spaCy

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

b2571572eb41883e75478da4bb53b842.png

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

792e2ca587beffdf8c5e792b2e1543b0.png

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

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

6705376e6143bf508b272341ee53b9a8.png

基本功能

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

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

9b7c8155e0cb1ddbab2da465daf56b79.png

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

97b649a9491d40455adc001a91cf3f8f.png

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

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

7930f586d2d840bb240cf8b3f226dcaf.png

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

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

895428af4a6541f99cad32cf51fed1de.png

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

00dd2cdc8db5a1f77ca14f149c69dc4a.png

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

c876235e62307a77bce27c98947cd5b1.png

输出:

466d15566dfd2d5b9efe4909ede4c279.png

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

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

我们来创建另一个文档:

d36a641f9732bf124da10a901be06eff.png

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

10658fb1127431647a0aa933c16e6059.png

输出如下:

0ef558c11a1bff7bf712a07081ded0a4.png

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

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

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

1818e5c77d2df3284ac0b8b572ad9423.png

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

7e40e3b679b2826e51ea35a67c680685.png

输出如

7a0bf4541755c8b4f2a83a316a6e3ef6.png

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

d7ad9997012afa27a14fdb7d491b016f.png

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

312c5461d9f6d8c2aaab7cbbe3fcf5a5.png

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

f2860390d03f82f4f6932bf67fd8c05f.png

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

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

标记化

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

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

a73b777c0a2db601b42978b6cd0c395c.png

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

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

c881501c0ff4d798f96ab063fd49b39c.png

输出:

b4522dc7a4866ea1f8e010811d587ac0.png

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

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

4880c11bc4827ea52292b3c859c736d4.png

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

0cbadb09c148aedb436363179dcf66f3.png

输出:

5a4f72ce7f895f1989659ddb571be843.png

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

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

8f82d65517cea5a31cd0552b907bb11d.png

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

检测实体

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

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

3b14ce3c910287d5273244bd4aa4238d.png

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

e654c27a133e31dcf209fec3b0dba911.png

输出:

f54ed24c7f4e1dc420efd8b0457d249a.png

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

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

e23738af2458684bd1d1a5b443670ba5.png

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

输出:

1ca66fdb2011b341cf6d9d0a7f14c6ae.png

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

检测名词

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

7f2c22047967b0969bca70a0c0f89a85.png

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

de06626dfcbf15d128008e374ad0ca89.png

输出:

9cb110637dbe265343a3ebd4bc60eb6f.png

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

词干提取

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

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

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

Porter Stemmer

我们来实际看一下 porter stemmer:

fea367e3b563f8ee9f358fa4faf546c2.png

先创建一个PorterStemmer类.

61da9764f12f98c5b883e19ebeb21265.png

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

03fc10857d29a779e07342e5452a6936.png

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

ba069c09f8931bb605c727fb0a5facaa.png

输出如下:

89f4d6afcffe13b51ebf6aa6e8d9de64.png

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

Snowball Stemmer

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

5b6ddd08e8005c546e4f3dfc3da16b66.png

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

a97279945cbf57f1948b17f306f9a46e.png

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

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

词形还原

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

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

e579810d0a42ca17d5a78e4accbcba32.png

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

abd68d3a36e71ad49c81415514e58200.png

上面脚本的输出如下:

d218ed6430a0169a34640c866e0297e3.png

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

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

ab59e8a7a42c9d2e831184d52d6c8249.png

输出:

4efe5fabd839d40bfd490984042e449a.png

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

结论

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

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



推荐阅读
author-avatar
张芬921_162
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有