Image by Editor
如今,NLP 是人工智能中最具前景的趋势之一,因为它的应用广泛涵盖了医疗、零售和银行等多个行业。由于对快速和可扩展解决方案的需求日益增加,spaCy 成为开发人员的首选 NLP 库之一。NLP 产品旨在理解现有的文本数据。它主要围绕解决诸如‘数据的背景是什么?’,‘它是否存在任何偏见?’,‘单词之间是否存在相似性?’等问题来构建有价值的解决方案。
因此,spaCy 是一个帮助处理此类问题的库,它提供了一系列易于插拔的模块。它是一个开源且适合生产的库,使开发和部署变得顺畅高效。此外,spaCy 的构建并不是以研究为导向,因此它为用户提供了一组有限的功能,而不是多个选项来快速开发。
在这篇博客中,我们将探讨如何从安装开始,了解 spaCy 提供的各种功能。
要安装 spaCy,请输入以下命令:
pip install spacy
spaCy 通常需要加载训练好的管道以访问大多数功能。这些管道包含预训练模型,用于执行一些常见任务的预测。这些管道有多种语言和多种尺寸。在这里,我们将安装英文的小型和中型管道。
python -m spacy download en_core_web_sm
python -m spacy download en_core_web_md
Voila! 你现在已准备好开始使用 spaCy。
在这里,我们将加载英文的较小管道版本。
import spacy
nlp = spacy.load("en_core_web_sm")
现在,管道已加载到 nlp 对象中。
接下来,我们将通过示例探索 spaCy 的各种功能。
Tokenization 是将文本分割成更小的单元称为 tokens 的过程。例如,在一句话中,tokens 是单词,而在一个段落中,tokens 可能是句子。这一步有助于通过使内容易于阅读和处理来理解内容。
我们首先定义一个字符串。
text = "KDNuggets is a wonderful website to learn machine learning with python"
现在我们在 ‘text’ 上调用 ‘nlp’ 对象,并将其存储在 ‘doc’ 对象中。‘doc’ 对象将包含关于文本的所有信息——单词、空格等。
doc = nlp(text)
‘doc’ 可以用作迭代器来解析文本。它包含一个 ‘.text’ 方法,可以给出每个 token 的文本,例如:
for token in doc:
print(token.text)
output:
KDNuggets
is
a
wonderful
website
to
learn
machine
learning
with
python
除了通过空格分割单词外,tokenization 算法还对分割后的文本进行双重检查。
如上图所示,在通过空格拆分单词后,算法检查异常情况。单词‘Let’s’不是其词根形式,因此它被再次拆分为‘Let’和‘s’。标点符号也会被拆分。此外,规则确保不会拆分像‘N.Y.’这样的单词,并将其视为单个标记。
自然语言处理中的一个重要预处理步骤是从文本中去除停用词。停用词基本上是如‘to’、‘with’、‘is’等连接词,它们提供的上下文很少。spaCy 允许通过‘doc’对象的‘is_stop’属性轻松识别停用词。
我们遍历所有标记并应用‘is_stop’方法。
for token in doc:
if token.is_stop == True:
print(token)
输出:
is
a
to
with
词形还原是自然语言处理管道中的另一个重要预处理步骤。它有助于去除一个单词的不同版本,通过将单词转换为其词根形式,减少意义相同单词的冗余。例如,它将‘is’ -> ‘be’,‘eating’ -> ‘eat’,以及‘N.Y.’ -> ‘n.y.’。使用 spaCy,可以通过‘.lemma_’属性轻松将单词转换为其词根形式。
我们遍历所有标记并应用‘.lemma_’方法。
for token in doc:
print(token.lemma_)
输出:
kdnugget
be
a
wonderful
website
to
learn
machine
learning
with
python
自动词性标注使我们能够通过了解哪些词汇类别主导内容及其反之,从而了解句子结构。这些信息在理解上下文中形成了重要部分。spaCy 允许解析内容并通过‘.pos_’属性对单个标记进行词性标注。
我们遍历所有标记并应用‘.pos_’方法。
for token in doc:
print(token.text,':',token.pos_)
输出:
KDNuggets : NOUN
is : AUX
a : DET
wonderful : ADJ
website : NOUN
to : PART
learn : VERB
machine : NOUN
learning : NOUN
with : ADP
python : NOUN
每个句子都有一个固有的结构,其中单词之间有相互依赖的关系。依存句法分析可以被认为是一个有向图,其中节点是单词,边是单词之间的关系。它提取一个单词在语法上对另一个单词的意义信息;例如它是主语、助动词还是词根等等。spaCy 具有一个‘.dep_’方法,描述了标记的句法依赖关系。
我们遍历所有标记并应用‘.dep_’方法。
for token in doc:
print(token.text, '-->', token.dep_)
输出:
KDNuggets --> nsubj
is --> ROOT
a --> det
wonderful --> amod
website --> attr
to --> aux
learn --> relcl
machine --> compound
learning --> dobj
with --> prep
python --> pobj
所有现实世界中的对象都有一个分配给它们的名称以供识别,并且它们被分组到一个类别中。例如,‘India’、‘U.K.’ 和 ‘U.S.’ 这些术语属于国家类别,而‘Microsoft’、‘Google’ 和 ‘Facebook’ 则属于组织类别。spaCy 已经在管道中训练了可以确定和预测这些命名实体类别的模型。
我们将使用‘.ents’方法访问命名实体。我们将显示实体的文本、起始字符、结束字符和标签。
for ent in doc.ents:
print(ent.text, ent.start_char, ent.end_char, ent.label_)
输出:
KDNuggets 0 9 ORG
在自然语言处理(NLP)中,我们常常希望分析词语、句子或文档的相似性,这可以用于推荐系统或抄袭检测工具等应用。相似度得分通过查找词嵌入之间的距离来计算,即词的向量表示。spaCy 通过中型和大型管道提供了这一功能。较大的管道更为准确,因为它包含了在更多样化数据上训练的模型。然而,我们这里只是为了理解而使用中型管道。
我们首先定义要比较相似性的句子。
nlp = spacy.load("en_core_web_md")
doc1 = nlp("Summers in India are extremely hot.")
doc2 = nlp("During summers a lot of regions in India experience severe temperatures.")
doc3 = nlp("People drink lemon juice and wear shorts during summers.")
print("Similarity score of doc1 and doc2:", doc1.similarity(doc2))
print("Similarity score of doc1 and doc3:", doc1.similarity(doc3))
输出:
Similarity score of doc1 and doc2: 0.7808246189842116
Similarity score of doc1 and doc3: 0.6487306770376172
基于规则的匹配可以被认为类似于正则表达式,我们可以在文本中指定要查找的特定模式。spaCy 的匹配器模块不仅完成了上述任务,还提供了对文档信息的访问,例如词汇、词性标签、词元、依赖结构等,这使得在多个附加条件下提取词汇成为可能。
在这里,我们首先创建一个匹配器对象来包含所有词汇。接下来,我们将定义要查找的文本模式,并将其作为规则添加到匹配器模块中。最后,我们将对输入句子调用匹配器模块。
from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
doc = nlp("cold drinks help to deal with heat in summers")
pattern = [{'TEXT': 'cold'}, {'TEXT': 'drinks'}]
matcher.add('rule_1', [pattern], on_match=None)
matches = matcher(doc)
for _, start, end in matches:
matched_segment = doc[start:end]
print(matched_segment.text)
输出:
cold drinks
Let's also look at another example wherein we attempt to find the word 'book' but only when it is a 'noun'.
from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
doc1 = nlp("I am reading the book called Huntington.")
doc2 = nlp("I wish to book a flight ticket to Italy.")
pattern2 = [{'TEXT': 'book', 'POS': 'NOUN'}]
matcher.add('rule_2', [pattern2], on_match=None)
matches = matcher(doc1)
print(doc1[matches[0][1]:matches[0][2]])
matches = matcher(doc2)
print(matches)
输出:
book
[]
在这篇博客中,我们讨论了如何安装和开始使用 spaCy。我们还探索了它提供的各种基本功能,如分词、词形还原、依赖分析、词性标注、命名实体识别等。spaCy 在开发用于生产的 NLP 管道时非常方便。其详细的文档、易用性和多样的功能使其成为 NLP 领域广泛使用的库之一。
Yesha Shastri 是一位热情的 AI 开发者和作家,目前在蒙特利尔大学攻读机器学习硕士学位。Yesha 对探索负责任的 AI 技术以解决有益于社会的挑战感兴趣,并与社区分享她的学习成果。
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升您的数据分析技能
3. Google IT 支持专业证书 - 支持您的组织在 IT 方面