Press "Enter" to skip to content

使用spaCy增强NLP流程

介绍

spaCy是一款用于自然语言处理(NLP)的Python库。spaCy的NLP流水线是免费且开源的。开发者可以使用它来创建信息提取和自然语言理解系统,就像Cython一样。它具有简洁且用户友好的API,适用于生产环境。

使用spaCy增强NLP流程 四海 第1张

如果你经常处理大量文本,你会想要了解更多关于它的信息。例如,它是关于什么的?在什么上下文中这些术语的含义是什么?对谁进行了什么操作?提到了哪些企业和产品?哪些文本可以相互比较?

spaCy专为生产环境使用,可以帮助您开发处理大量文本的应用程序,并“理解”这些文本。它可用于创建信息提取、自然语言解释和深度学习的预处理文本系统。

学习目标

  • 了解spaCy的基础知识,如分词、词性标注和命名实体识别。
  • 了解spaCy的文本处理架构,它高效且快速,适用于大规模的NLP任务。
  • 在spaCy中,您可以探索NLP流水线,并为特定任务创建定制的流水线。
  • 探索spaCy的高级功能,包括基于规则的匹配、句法分析和实体链接。
  • 了解在spaCy中可用的许多预训练语言模型以及如何在各种NLP应用中使用它们。
  • 使用spaCy学习命名实体识别(NER)策略,以识别和分类文本中的实体。

本文是Data Science Blogathon的一部分。

统计模型

spaCy的某些特性可以自主运行,而其他特性则需要加载统计模型。这些模型使spaCy能够预测语言注释,例如确定一个词是动词还是名词。目前,spaCy提供了多种语言的统计模型,您可以将它们作为独立的Python模块进行安装。它们通常包括以下元素:

  • 为了在上下文中预测这些注释,为词性标注器、依赖解析器和命名实体识别器分配二进制权重
  • 词汇表中的词条是词和它们的上下文无关特性,例如形式或拼写。
  • 数据文件包括词形还原规则和查找表。
  • 词向量是单词的多维意义表示,允许您确定它们的相似程度。
  • 在加载模型时,使用配置选项,如语言和处理流水线设置,将spaCy置于适当的状态。

要导入模型,只需运行spacy.load(‘model_name’),如下所示:

!python -m spacy download en_core_web_lg

!python -m spacy download en_core_web_sm

import spacy
nlp = spacy.load('en_core_web_sm')

语言注释

spaCy提供了多种语言注释,帮助您理解文档的语法结构。这包括单词的类型,如词性,以及单词之间的连接方式。例如,在分析文本时,一个名词是一个短语的主语还是宾语,或者“Google”是用作动词还是指特定的网站或公司,这都会产生很大的差别。

import spacy
nlp = spacy.load("en_core_web_sm")

doc = nlp("Company Y is planning to acquire stake in X company for $23 billion")
for token in doc:
    print(token.text, token.pos_, token.dep_)

使用spaCy增强NLP流程 四海 第2张

即使在对Doc进行处理(例如,将其分解为单个单词并进行注释)之后,它仍保留着原始文本的所有元数据,例如空格字符。您始终可以检索标记在原始字符串中的偏移量,或者通过合并标记及其尾随空格来重建它。这样,使用spaCy解析文本时,您将不会丢失信息。

spaCy的处理流程

在使用spaCy时,第一步是将文本字符串提供给一个NLP对象。这个对象是一个文本预处理活动的流水线,输入文本字符串必须通过这个流水线。

使用spaCy增强NLP流程 四海 第3张

如上图所示,NLP流水线由几个组件组成,例如分词器、标注器、解析器、命名实体识别器等等。因此,在我们对输入文本字符串进行任何操作之前,它必须经过所有的组件。

让我向你展示如何创建一个nlp对象:

import spacy
nlp = spacy.load('en_core_web_sm')

# 创建一个nlp对象
doc = nlp("He went to play cricket with friends in the stadium")

使用以下代码确定活动的流水线组件:

nlp.pipe_names

使用spaCy增强NLP流程 四海 第4张

如果你只想运行分词器,可以使用以下代码禁用流水线组件:

nlp.disable_pipes('tagger', 'parser')

使用spaCy增强NLP流程 四海 第5张

再次检查活动的流水线组件:

nlp.pipe_names

使用spaCy增强NLP流程 四海 第6张

分词

SpaCy通过对文本进行分词来开始处理,这意味着将文本分割为单词、标点符号等。这是通过使用特定于语言的规则来完成的。将文本分割为单词、标点符号等。

#import cimport spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("Reliance is looking at buying U.K. based 
analytics startup for $7 billion")
for token in doc:
    print(token.text)sv

使用spaCy增强NLP流程 四海 第7张

首先,原始文本被分割成空格字符,类似于text.split(‘ ‘)。然后,分词器从左到右读取文本。它对每个子字符串进行两个测试:

  • 子字符串是否匹配分词器例外规则?例如,“Don’t”不包括空格,应该分为两个标记,“do”和“n’t”,尽管“U.K.”始终应该保持为一个标记。
  • 前缀、后缀或中缀是否可以分开?例如,逗号、句号、连字符和引号。

如果找到匹配项,我们应用该规则并重新启动分词器循环,从刚刚被分割的子字符串开始。SpaCy可以使用这种方法来区分复杂的、嵌套的标记,例如缩写和多个标点符号。

使用spaCy增强NLP流程 四海 第8张

词性标注

词性(POS)是描述一个特定单词在句子中的使用方式的语法角色。这个分类包括八个不同的部分。

  • 名词
  • 代词
  • 形容词
  • 动词
  • 副词
  • 介词
  • 连词
  • 感叹词

词性标注是根据单词在句子中的使用方式为每个标记分配一个词性标签。词性标签对于为每个单词分配一个句法类别,如名词或动词,非常有用。

词性标注会自动为句子中的所有单词分配词性标签。它可用于各种下游NLP任务,如特征工程、语言解释和信息提取。

在spaCy中,POS标签是Token对象的一个属性,因此POS标注非常简单:

import spacy 
nlp = spacy.load('en_core_web_sm')

# 创建nlp对象
doc = nlp("Reliance is looking at buying U.K. based 
analytics startup for $7 billion")
 
# 遍历tokens
for token in doc:
    # 打印token及其词性标签
    print(token, token.tag_, token.pos_, spacy.explain(token.tag_))

使用spaCy增强NLP流程 四海 第9张

可视化Doc对象的最简单方法是使用displacy.serve,它可以轻松集成到spaCy中。它会启动一个简单的web服务器,允许您在浏览器中查看结果。displaCy的第一个参数可以是单个Doc对象或Doc对象的列表。这使您可以根据需要构建它们,使用任何模型或更改。以下是我们的示例语句及其依赖关系的样子:

import spacy
from spacy import displacy

doc = nlp("board member meet with senior manager")
displacy.render(doc, style="dep", jupyter=True)

使用spaCy增强NLP流程 四海 第10张

实体识别

实体识别是一种复杂的语言处理技术,可以区分文本字符串的重要特征,如地点、个人、组织和语言。这对于从文本中快速提取信息非常有益,因为它可以帮助您立即识别重要主题或文本的重要部分。

让我们尝试使用华盛顿邮报最近一篇文章中的一些摘录进行实体识别。我们将使用.label来检索文本中每个识别到的对象的标签,然后使用spaCy的displaCy可视化工具更直观地分析这些实体。

import spacy
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
doc= nlp(u"""The Amazon rainforest,[a] alternatively, 
the Amazon Jungle, also known in English as Amazonia, 
is a moist broadleaf tropical rainforest in the Amazon
 biome that covers most of the Amazon basin of South America.
  This basin encompasses 7,000,000 km2 (2,700,000 sq mi), of
   which 5,500,000 km2 (2,100,000 sq mi) are covered by the rainforest. 
   This region includes territory belonging to nine nations.""")

entities=[(i, i.label_, i.label) for i in doc.ents]
entities

使用spaCy增强NLP流程 四海 第11张

使用displacy,我们还可以查看输入文本,其中每个检测到的对象都以颜色高亮显示并命名。在这种情况下,我们将使用style = “ent”告诉DisplaCy我们想要查看实体。

displacy.render(doc, style="ent", jupyter=True)

使用spaCy增强NLP流程 四海 第12张

相似度

我们通过比较词向量或”词嵌入”来评估相似度。词向量是单词的多维语义表示,通常使用类似word2vec的算法生成,它们看起来像这样:

Spacy还包含了密集的实数向量,用于传达分布相似性信息。

import spacy

nlp = spacy.load("en_core_web_lg")
tokens = nlp("dog cat banana afskfsd")

for token in tokens:
    print(token.text, token.has_vector, token.vector_norm, token.is_oov)

使用spaCy增强NLP流程 四海 第13张

import spacy

nlp = spacy.load("en_core_web_lg")  # 确保使用更大的模型!
tokens = nlp("dog cat banana")

for token1 in tokens:
    for token2 in tokens:
        print(token1.text, token2.text, token1.similarity(token2))

使用spaCy增强NLP流程 四海 第14张

在这种情况下,模型的预测相当准确。狗和猫非常相似。然而,香蕉则完全不同。相同的标记是相同的(尽管由于向量计算和浮点数不精确性可能不是完全等于1.0)。

结论

spaCy是一个著名的开源自然语言处理(NLP)程序,可以进行高效和稳健的文本处理。由于其可扩展性、多语言支持和即用特性,SpaCy在学术界和工业应用中得到了广泛的认可。它与深度学习框架的交互简单,管道灵活,并且拥有活跃的社区,使其成为各种NLP活动的良好选择,可以提供准确和有效的语言处理结果。

  • 具有快速和可扩展的文本处理能力。
  • 支持多种语言,并提供预训练模型。
  • 提供即用特性,可用于标准的NLP任务。
  • 定制和训练特定领域模型。
  • 与深度学习框架的集成无缝。
  • 在实际的NLP应用中广泛使用。

最后,spaCy是一个高效、灵活和用户友好的NLP库,提供多种特性和预训练模型,适用于各种语言的文本处理。由于其速度、可扩展性和定制性,它是研究和生产级NLP应用的热门选择。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。

Leave a Reply

Your email address will not be published. Required fields are marked *