spaCy 教程学习
作者 |PRATEEK JOSHI
编译 |VK
起源 |Analytics Vidhya
介绍
spaCy 是我的自然语言解决(NLP)工作的必备库。我冒昧地说,大多数专家都是这样!
现在,在泛滥的 NLP 库中,spaCy 的确自成一家。如果你在 NLP 上用过 spaCy,你就会晓得我在说什么。如果你对 spaCy 的弱小性能还不相熟,你会被这个库的多功能性和灵活性所吸引。
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’]
当您只须要标记文本时,就能够禁用整个管道。标记化过程变得十分快。例如,能够应用以下代码行禁用管道的多个组件:
nlp.disable_pipes('tagger', 'parser')
spaCy 实战
当初,让咱们练手。在本节中,你将学习应用 spaCy 执行各种 NLP 工作。咱们将从风行的 NLP 工作开始,包含词性标记、依存剖析和命名实体辨认。
1. 词性标注
在英语语法中,词类通知咱们一个词的性能是什么,以及如何在句子中应用。英语中罕用的词类有名词、代词、形容词、动词、副词等。
词性标注是主动将词性标注调配给句子中所有单词的工作。它有助于 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
因而,该模型正确辨认了句子中所有单词的 POS 标记。如果你对这些标记中的任何一个都不确定,那么您能够简略地应用 spacy.explain() 来确定:
spacy.explain("PART")
输入:‘particle’
2. 应用 spaCy 进行依存剖析
每个句子都有一个语法结构,通过依存句法分析,咱们能够提取出这个构造。它也能够看作是一个有向图,其中节点对应于句子中的单词,节点之间的边是单词之间的对应依赖关系。
在 spaCy 中,执行依存剖析同样非常容易。咱们将应用与词性标注雷同的句子:
# 依存剖析
for token in doc:
print(token.text, "-->", token.dep_)
输入:
He –> nsubj
went –> ROOT
to –> aux
play –> advcl
basketball –> dobj
依存标记 ROOT 示意句子中的次要动词或动作。其余词与句子的词根有间接或间接的分割。通过执行上面的代码,你能够理解其余标记的含意:
spacy.explain("nsubj"), spacy.explain("ROOT"), spacy.explain("aux"), spacy.explain("advcl"), spacy.explain("dobj")
输入:
(‘nominal subject’,
None,
‘auxiliary’,
‘adverbial clause modifier’,
‘direct object’)
3. 基于 spaCy 的命名实体辨认
首先让咱们理解什么是实体。实体是示意诸如集体、地点、组织等常见事物的信息的词或词组。这些实体具备专有名称。
例如,请思考以下句子:
在这句话中,实体是“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’
4. 基于规定的 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 中还有许多其余有用的标记属性,能够用来定义各种规定和模式。
我列出了以下标记属性:
属性 | 类型 | 形容 |
---|---|---|
ORTH |
unicode | 准确匹配的文本 |
TEXT |
unicode | 准确匹配的文本 |
LOWER |
unicode | 文本小写模式 |
LENGTH |
int | 文本的长度 |
IS_ALPHA , IS_ASCII , IS_DIGIT |
bool | 文本由字母字符、ASCII 字符、数字组成。 |
IS_LOWER , IS_UPPER , IS_TITLE |
bool | 文本是小写、大写、首字母大写格局的。 |
IS_PUNCT , IS_SPACE , IS_STOP |
bool | 文本是标点符号、空格、停用词。 |
LIKE_NUM , LIKE_URL , LIKE_EMAIL |
bool | 文本示意数字、URL 和电子邮件。 |
POS , TAG , DEP , LEMMA , SHAPE |
unicode | 文本是词性标记、依存标签、词根、形态。 |
ENT_TYPE |
unicode | 实体标签 |
让咱们看看 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。我激励你应用这些代码,从 DataHack 中获取一个数据集,并应用 spaCy 尝试应用它。
原文链接:https://www.analyticsvidhya.c…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/