使用-spaCy-掌握-NLP---第二部分
使用 spaCy 掌握 NLP – 第二部分
简介

图片来自 Unsplash
所有这些都必须弄清楚,才能构建具有自然语言理解能力的应用程序。三个主要任务有助于从文本中捕获不同类型的信息:
-
词性(POS)标注
-
依存句法分析
-
命名实体识别
词性(POS)标注

图片由作者提供
在词性标注中,我们根据单词在句子中的功能将单词分类到某些类别中。例如,我们想要区分名词和动词。这有助于我们理解某些文本的含义。
最常见的标签如下。
-
NOUN:命名人、地点、事物或概念(例如,“狗”,“城市”)。
-
VERB:描述动作、状态或事件(例如,“跑”,“是”)。
-
ADJ:修饰名词,描述其质量、数量或程度(例如,“大”,“快乐”)。
-
ADV:修饰动词、形容词或其他副词,通常表示方式、时间或程度(例如,“快速地”,“非常”)。
-
PRON:替换名词或名词短语(例如,“他”,“他们”)。
-
DET:引入或指定名词(例如,“the”,“a”)。
-
ADP:显示名词或代词与其他单词的关系(例如,“in”,“on”)。
-
NUM:表示数字或数量(例如,“一个”,“五十”)。
-
CONJ:连接单词、短语或子句(例如,“和”,“但是”)。
-
PRT:粒子,通常是动词短语或介词的一部分(例如,“give up”中的“up”)。
-
PUNCT:标记标点符号(例如,“。”,“,”)。
-
X:用于其他或不确定的分类(例如,外语单词,符号)。
这些被称为通用标签。然后每种语言都可以有更细粒度的标签。例如,我们可以扩展“名词”标签以添加单数/复数信息等。
在 spaCy 中,标签用缩写如“VBD”表示。如果您不确定缩写代表什么,可以要求 spaCy 使用 spacy.explain()进行解释。
让我们看看一些例子。
import spacy
spacy.explain("VBD")
>>> verb, past tense
现在我们来尝试调查整个句子的词性标签。
nlp = spacy.load("en_core_web_sm")
doc = nlp("I love Rome, it is the best city in the world!"
)
for token in doc:
print(f"{token.text} --> {token.tag_}--> {spacy.explain(token.tag_)}")

图片由作者提供
单词的标签取决于附近的单词、它们的标签以及单词本身。
词性标注器基于统计模型。我们主要有
-
基于规则的标签器:使用手工制作的语料库规则(例如,“the”后面的单词通常是名词”)。
-
统计标签器:使用概率模型,如隐马尔可夫模型(HMM)或条件随机字段(CRFs)来根据单词和标签序列预测标签。
-
神经网络标注器:使用循环神经网络(RNN)、长短期记忆(LSTM)网络或转换器(例如,BERT)等深度学习模型来捕捉上下文并预测标签。
依存句法分析
通过词性标注,我们能够对文档中的单词进行分类,但我们不知道单词之间的关系。这正是依存句法分析所做的。这有助于我们理解句子的结构。
我们可以将依存关系视为从父词到子词的直接边/链接,这定义了两者之间的关系。这就是为什么我们使用依存树来表示句子的结构。请参见以下图片。

src: spacy.io/usage/visualizers
在依存关系中,我们始终有一个父词,也称为头部,和一个依赖词,也称为子词。在短语“红色汽车”中,汽车是头部,红色是子词。

图片由作者提供
在 spaCy 中,关系始终分配给子词,可以通过属性 token.dep_ 访问。
doc = nlp("red car")
for token in doc:
print(f"{token.text}, {token.dep_} ")
>>> red, amod
>>> car, ROOT
如您在句子中看到的那样,主要词,通常是动词,在这种情况下是名词,具有根的角色。从根开始,我们构建我们的依存树。
重要的是要知道,一个词可以有多个子词,但只有一个父词。
所以在这种情况下,amod 关系告诉我们什么?
无论名词的意义是以组合方式(例如,大型房屋)还是以习语方式(热狗)修改,关系都适用。
事实上,“红色”是一个通过添加一些信息来修饰“汽车”的词。
我现在将列出在依存句法分析中可以找到的最基本的关系及其含义。
要获取完整的列表,请查看此网站:universaldependencies.org/u/dep/index.html
-
root
-
意思是:句子的主要谓语或头部,通常是动词,是依存树的锚点。
-
示例:在“她跑”中,“跑”是根。
-
-
nsubj(名词主语)
-
意思是:一个名词短语作为动词的主语。
-
示例:在“猫睡觉”中,“猫”是“睡觉”的 nsubj。
-
-
obj(宾语)
-
意思是:一个名词短语直接接受动词的动作。
-
示例:在“她踢球”中,“球”是“踢”的 obj。
-
-
iobj(间接宾语)
-
意思是:一个名词短语间接受动词的影响,通常是接受者。
-
示例:在“她给他一本书”中,“他”是“给”的 iobj。
-
-
obl(斜名词)
-
意思是:一个名词短语作为非核心论元或附加成分(例如,时间、地点)。
-
示例:在“她在公园里跑”中,“公园”是“跑”的 obl。
-
-
advmod(副词修饰语)
-
意思是:一个副词修饰动词、形容词或副词。
-
示例:在“她跑得快”中,“快”是“跑”的 advmod。
-
-
amod(形容词修饰语)
-
意思是:一个形容词修饰名词。
-
例子:在“A red apple”中,“red”是“apple”的 amod。
-
-
det (Determiner)
-
意义:指定名词(例如,冠词、指示代词)的词。
-
例子:在“The cat”中,“the”是“cat”的 det。
-
-
case (Case Marking)
-
意义:一个词(例如,介词)标记名词短语的角色。
-
例子:在“In the park”中,“in”是“park”的 case。
-
-
conj (Conjunct)
-
意义:通过连词连接的并列词或短语。
-
例子:在“She runs and jumps”中,“jumps”是“runs”的 conj。
-
-
cc (Coordinating Conjunction)
-
意义:连接协调元素的连词。
-
例子:在“She runs and jumps”中,“and”是 cc。
-
-
aux (Auxiliary)
-
意义:支持主要动词的助动词(时态、语气、语态)。
-
例子:在“She has eaten”中,“has”是“eaten”的 aux。
-
我们可以使用 spaCy 的display模块来可视化依存树。让我们看看一个例子。
from spacy import displacy
sentence = "A dependency parser analyzes the grammatical structure of a sentence."
nlp = spacy.load("en_core_web_sm")
doc = nlp(sentence)
displacy.serve(doc, style="dep")

图像由作者提供
命名实体识别 (NER)
POS 标签提供有关词在句子中角色的信息。当我们执行 NER 时,我们寻找代表现实世界中对象的词:公司名称、专有名词、地点等。
我们将这些词称为命名实体。参见此示例。

src: spacy.io/usage/visualizers#ent
在句子“Rome is the capital of Italy”中,Rome 和 Italy 是命名实体,而 capital 不是,因为它是一个普通名词。
spaCy 支持许多命名实体,要可视化它们:
nlp.get_pipe("ner").labels
命名实体可以通过 spaCy 的doc.ents属性访问
sentence = "A dependency parser analyzes the grammatical structure of a sentence."
nlp = spacy.load("en_core_web_sm")
doc = nlp("Rome is the bast city in Italy based on my Google search")
doc.ents
>>> (Rome, Italy, Google)
我们也可以要求 spaCy 提供一些关于命名实体的解释。
doc[0], doc[0].ent_type_, spacy.explain(doc[0].ent_type_)
>>> (Rome, 'GPE', 'Countries, cities, states')
再次,我们可以依靠 displacy 来可视化 NER 的结果。
displacy.serve(doc, style="ent")

图像由作者提供
最后的想法
理解语言的结构和运作方式对于构建能够以有意义的方式处理文本的更好工具至关重要。像词性标注、依存句法分析和命名实体识别等技术有助于分解句子,以便我们可以看到词语如何发挥作用,如何连接,以及它们指代哪些现实世界的事物。
这些方法为我们提供了一种从文本中提取有用信息的方法,例如识别谁对谁做了什么,或发现名称、日期和地点。像 spaCy 这样的库使探索这些想法变得更容易,提供了清晰的方式来查看语言是如何结合在一起的。

浙公网安备 33010602011771号