概述
spaCy是目前世界上最快的工业级自然语言处理工具。 支持多种自然语言处理基本功能。
spaCy入门
如果你刚接触spaCy
,那么你应该了解以下两点:
spaCy
基于统计模型spaCy
核心是处理管道 下面我们进行详细讨论。
spaCy的统计模型
模型是spaCy
的核心。这些模型使spaCy
能够完成指定的NLP
任务,例如词性标记、命名实体识别、依存关系解析等。
下面列出了spaCy中的不同统计模型及其规范:
模型 | 描述 | 大小 |
---|---|---|
en_core_web_sm | 英语多任务CNN,在OntoNotes上训练 | 11 MB |
en_core_web_md | 英语多任务CNN,在OntoNotes上训练,并且使用Common Crawl上训练的GLoVe词嵌入 | 91 MB |
en_core_web_lg | 英语多任务CNN,在OntoNotes上训练,并且使用Common Crawl上训练的GLoVe词嵌入 | 789 MB |
导入这些模型非常容易。我们可以通过执行spacy.load(‘model_name’) 导入模型,如下所示:
import spacy
nlp = spacy.load('en_core_web_sm')
spaCy的处理管道
使用spaCy
时,第一步是将文本字符串传递给NLP对象。这个对象本质上是由几个文本预处理操作组成的管道,输入文本字符串必须通过这些操作。
如上图所示,NLP管道有多个组件,如标记生成器、标签器、解析器、ner等。因此,在处理输入文本字符串之前,必须先通过所有这些组件。 如何创建nlp对象:
import spacy
nlp = spacy.load('en_core_web_sm')
# 创建nlp对象
doc = nlp("He went to play basketball")
你可以使用以下代码找出活动的管道组件:
nlp.pipe_names
输出:['tagger','parser','ner']
如果您希望禁用管道组件只保留ner
的运行,则可以使用下面的代码禁用管道组件:
nlp.disable_pipes('tagger', 'parser')
然后再次检查活动管道组件:
nlp.pipe_names
输出:['ner']
spaCy实战
在本节中,你将学习使用spaCy
执行各种NLP
任务。我们将从流行的NLP
任务开始,包括词性标记、依存分析和命名实体识别。
词性标注
在英语语法中,词类告诉我们一个词的功能是什么,以及如何在句子中使用。英语中常用的词类有名词、代词、形容词、动词、副词等。
词性标注是自动为单词标注词性的任务。它是NLP
其他任务的基础,如特征工程、语言理解、信息提取等。
在spaCy
中执行POS
标记是一个简单的过程:
import spacy
nlp = spacy.load('en_core_web_sm')
# 创建nlp对象
doc = nlp("He went to play basketball")
# 遍历token
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
基于spaCy的命名实体识别
首先让我们了解什么是实体。实体包括个人、地点、组织等常见事物的信息的词或词组。 例如,请考虑以下句子:
"Donald Trump will meet the chairman of Google in New York City"
在这句话中,实体是“Donald Trump”、“Google”和“New York City”。
现在让我们看看spaCy
如何识别句子中的命名实体。
doc = nlp("Indians spent over $71 billion on clothes in 2018")
for ent in doc.ents:
print(ent.text, ent.label_)
输出:
Indians NORP
over $71 billion MONEY
2018 DATE
# 查看词性描述
spacy.explain("NORP")
输出:‘Nationalities or religious or political groups’
基于规则的spaCy匹配
基于规则的匹配是spaCy
的新功能。使用spaCy
匹配器,您可以自定义规则在文本中查找单词和短语。就像正则表达式一样。
正则表达式使用文本模式来查找单词和短语,而spaCy匹配器不仅使用文本模式,还使用单词的词汇属性,如POS标记、依赖标记、词根等。
让我们看看它是如何工作的:
import spacy
nlp = spacy.load('en_core_web_sm')
# 导入 spaCy Matcher
from spacy.matcher import Matcher
#用spaCy词汇表初始化Matcher
matcher = Matcher(nlp.vocab)
doc = nlp("Some people start their day with lemon water")
# 定义规则
pattern = [{'TEXT': 'lemon'}, {'TEXT': 'water'}]
# 添加规则
matcher.add('rule_1', None, pattern)
所以,在上面的代码中:
- 首先,我们导入spaCy matcher
- 之后,我们用默认的spaCy词汇表初始化matcher对象
- 然后,我们像往常一样在NLP对象中传递输入
- 在下一步中,我们将为要从文本中提取的内容定义规则。
假设我们想从文本中提取“lemon water”这个短语。那么我们的目标是water
跟在lemon
后面。最后,我们将定义的规则添加到matcher
对象。
现在让我们看看matcher
发现了什么:
matches = matcher(doc)
matches
输出: [(7604275899133490726, 6, 8)]
输出有三个元素。第一个元素“7604275899133490726”是匹配ID。第二个和第三个元素是匹配标记的位置。
# 提取匹配文本
for match_id, start, end in matches:
# 获得匹配的宽度
matched_span = doc[start:end]
print(matched_span.text)
输出:lemon water
因此,模式是一个标记属性列表。例如,“TEXT”是一个标记属性,表示标记的确切文本。实际上,spaCy中还有许多其他有用的标记属性,可以用来定义各种规则和模式。
可用的Token模式键对应于许多Token
属性. 基于规则的匹配支持的属性有:
ATTRIBUTE | DESCRIPTION |
---|---|
ORTH | 准确的Token逐字文本. TYPE:str |
TEXT | 准确的Token逐字文本. TYPE:str |
LOWER | Token文本的小写形式.TYPE:str |
LENGTH | Token文本的长度.TYPE:int |
IS_ALPHA, IS_ASCII, IS_DIGIT | Token文本由字母字符、ASCII 字符、数字组成.TYPE:bool |
IS_LOWER, IS_UPPER, IS_TITLE | Token文本是小写、大写、标题.TYPE:bool |
IS_PUNCT, IS_SPACE, IS_STOP | Token文本是标点符号、空格、停止词.TYPE:bool |
IS_SENT_START | Token是句子的开始.TYPE:bool |
LIKE_NUM, LIKE_URL, LIKE_EMAIL | Token文本类似于数字、URL、电子邮件.TYPE:bool |
SPACY | Token有一个结尾空格.TYPE:bool |
POS, TAG, MORPH, DEP, LEMMA, SHAPE | 令牌的简单和扩展词性标签、形态分析、依赖标签、词根、形状(shape)。请注意,这些属性的值区分大小写。有关可用词性标签和依赖项标签的列表,请参阅注释规范。 TYPE:str |
ENT_TYPE | Token的实体标签。 TYPE:str |
_ | 自定义扩展属性的属性. TYPE:Dict[str, Any] |
OP | 运算符和量词,限定Token模式的匹配次数。TYPE:str |
让我们看看spaCy matcher
的另一个用例。考虑下面的两句话:
You can read this book
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'}]
# 用共享的vocab初始化matcher
matcher = Matcher(nlp.vocab)
matcher.add('rule_2', None, pattern)
matches = matcher(doc1)
matches
输出: [(7604275899133490726, 3, 4)]
matcher在第一句话中找到了模式。
matches = matcher(doc2)
matches
输出:[]
很好!尽管“book”出现在第二句话中,matcher却忽略了它,因为它不是一个名词。
写在最后
以上对spaCy
做了一个简短的介绍,告诉你它到底能为你做些什么。如果你正在做自然语言处理(NLP)相关的工作,那么spaCy应该会帮助到你。
原文链接