Bootstrap

NLP库——Spacy库教程

spaCy 的统计模型

这些模型是 spaCy 的强大引擎。这些模型使 spaCy 能够执行多项 NLP 相关任务,例如词性标注、命名实体识别和依存关系解析。

下面我列出了 spaCy 中的不同统计模型及其规格:

en_core_web_sm:一个小型的英语多任务卷积神经网络(CNN),基于OntoNotes数据集训练。适用于基本的自然语言处理任务,模型体积较小,约为11 MB,适合轻量化应用。

en_core_web_md:一个中等规模的英语多任务卷积神经网络,基于OntoNotes数据集训练,并包含在Common Crawl数据集上训练的GloVe词向量。模型体积约为91 MB,在保持精度和性能的同时提供更多的词汇信息,适合需要更精细处理的任务。

en_core_web_lg:一个大型的英语多任务卷积神经网络,基于OntoNotes数据集训练,并使用了Common Crawl数据集训练的GloVe词向量。模型体积较大,约为789 MB,能提供更丰富的词汇和语义信息,适合精细

导入这些模型非常简单。我们只需执行spacy.load('model_name')即可导入模型,如下所示:度要求更高的应用。

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

spaCy 的处理流水线

使用 spaCy 时,文本字符串的第一步是将其传递给NLP 对象。该对象本质上是输入文本字符串必须经过的几个文本预处理操作的管道。


如上图所示,NLP 管道有多个组件,例如tokenizertaggerparserner等。因此,输入的文本字符串必须经过所有这些组件后才能进行处理。

spaCy 的实际应用

 1. 使用 spaCy 进行词性 (POS) 标记

在英语语法中,词性告诉我们单词的功能以及它在句子中的用法。 英语中一些常见的词性有名词、代词、形容词、动词、副词等。

词性标注是自动为句子中的所有单词分配词性标注的任务。它对 NLP 中的各种下游任务(例如特征工程、语言理解和信息提取)很有帮助。

示例标注

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

# Create an nlp object
doc = nlp("He went to play basketball")
 
# Iterate over the tokens
for token in doc:
    # Print the token and its part-of-speech tag
    print(token.text, "-->", token.pos_)

输出

He --> PRON
went --> VERB
to --> PART
play --> VERB
basketball --> NOUN

因此,模型已正确识别句子中所有单词的 POS 标记。如果您不确定这些标记中的任何一个,那么您可以简单地使用 spacy.explain() 来找出答案:

spacy.explain("PART") Output: 'particle'

2. 使用 spaCy 进行依赖解析

每个句子都有一个语法结构,借助依存关系解析,我们可以提取这种结构。它也可以被认为是一个有向图,其中节点对应于句子中的单词,节点之间的边是单词之间的相应依存关系。

在 spaCy 中执行依赖解析也非常容易。我们将在这里使用与 POS 标记相同的句子:

# dependency parsing
for token in doc:
    print(token.text, "-->", token.dep_)

输出

He --> nsubj #主语
went --> ROOT #动词或谓语
to --> aux #辅助成分
play --> advcl #状语从句
basketball --> dobj #直接宾语

3.使用spaCy进行命名实体识别

首先我们来了解一下实体是什么。实体是代表常见事物(如人、地点、组织等)信息的单词或单词组。这些实体有专有名称。

示例

import spacy

nlp = spacy.load('en_core_web_sm')

text = "Apple is looking at buying a startup in San Francisco for $1 billion."

doc = nlp(text)

for ent in doc.ents:
    print(ent.text, ent.label_)

输出

Apple ORG
San Francisco GPE
$1 billion MONEY

标签说明

  • ORG:组织(如公司、机构)
  • GPE:地理位置(如城市、国家)
  • MONEY:货币金额

 4.使用 spaCy 进行基于规则的匹配

基于规则的匹配是 spaCy 库中的一项新功能。借助此 spaCy 匹配器,您可以使用用户定义的规则在文本中查找单词和短语。它就像是强化版的正则表达式。虽然正则表达式使用文本模式来查找单词和短语,但 spaCy 匹配器不仅使用文本模式,还使用单词的词汇属性,例如 POS 标签、依赖标签、词干等。

示例

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

# Import spaCy Matcher
from spacy.matcher import Matcher

# Initialize the matcher with the spaCy vocabulary
matcher = Matcher(nlp.vocab)

doc = nlp("Some people start their day with lemon water")

# Define rule
pattern = [{'TEXT': 'lemon'}, {'TEXT': 'water'}]

# Add rule
matcher.add('rule_1', None, pattern)

matches = matcher(doc)

 

因此,在上面的代码中:

  • 首先,我们导入 spaCy 匹配器
  • 之后,我们使用默认的 spaCy 词汇初始化匹配器对象
  • 然后,我们像往常一样将输入传递到 NLP 对象中
  • 在下一步中,我们定义想要从文本中提取的规则/模式。

假设我们想从文本中提取短语“柠檬水”。因此,我们的目标是,只要“柠檬”后面跟着单词“水”,匹配器就应该能够在文本中找到此模式。这正是我们在上面的代码中定义模式时所做的。最后,我们将定义的规则添加到匹配器对象。

output :[(7604275899133490726, 6, 8)]

输出有三个元素。第一个元素 '7604275899133490726' 是匹配 ID。第二个和第三个元素是匹配的 token 的位置。

# Extract matched text
for match_id, start, end in matches:
    # Get the matched span
    matched_span = doc[start:end]
    print(matched_span.text)

output:lemon water 

因此,模式是标记属性的列表。例如,“TEXT”是一个标记属性,表示标记的确切文本。事实上,spaCy 中还有许多其他有用的标记属性,可用于定义各种规则和模式。

 让我们看看 spaCy 匹配器的另一个用例。考虑以下两个句子:

  1. You can read this book
  2. I will book my ticket

 

现在我们感兴趣的是找出一个句子中是否包含单词“book”。这看起来很简单,对吧?但问题就在这里——只有当“book”在句子中用作名词时,我们才需要找到它。

在上面的第一句中,“book”被用作名词,在第二句中,它被用作动词。因此,spaCy 匹配器应该能够仅从第一句中提取模式。

doc1 = nlp("You read this book")
doc2 = nlp("I will book my ticket")

pattern = [{'TEXT': 'book', 'POS': 'NOUN'}]

# Initialize the matcher with the shared vocab
matcher = Matcher(nlp.vocab)
matcher.add('rule_2', None, pattern)
matches = matcher(doc1)
matches
Output: [(7604275899133490726, 3, 4)]

 匹配器在第一句话中找到了模式。

matches = matcher(doc2)
matches
Output: [ ]

太棒了!虽然第二句中出现了“book”,但匹配器忽略了它,因为它不是名词。

;