语义部分标签(POS)教程
简介
在这篇文章中,我们将带领大家学习Python的Spacy库中的语音部分或POS标签的教程。我们将首先了解什么是POS标签,为什么要使用它,最后看看Spacy中的一些例子。
什么是POS标签?
语篇标签或POS标签是根据语境和定义将文本中的一个词标记为一个特定的语篇的过程。用简单的语言来说,我们可以说POS标签是将一个词识别为名词、代词、动词、形容词等的过程。
为什么使用POS标签
有些词在不同情况下使用时可以有多种功能。POS标签在这里起着至关重要的作用,可以了解该词在句子中的使用情况。POS标签在句子解析、信息检索、情感分析等方面非常有用。
- 还可以阅读 - NLTK Python中的POS标签和分块教程
Spacy库中的POS标签
Spacy提供了一系列的POS标签,如NOUN(名词)、PUNCT(标点符号)、ADJ(形容词)、ADV(副词)等。它有一个训练有素的管道和统计模型,使spaCy能够对一个标记或标签的归属作出分类。例如,英语中 "the "后面的一个词很可能是一个名词。
Spacy POS标签列表
在Spacy中,每个标记都被分配了一个来自以下列表的POS标签。
POS | 描述 | 例子 |
---|---|---|
ADJ | 形容词 | *大的,老的,绿色的,不可理解的,第一的*。 |
ADP | 介词 | *在、到、期间* |
ADV | 副词 | *非常,明天,下来,在哪里,那里*。 |
AUX | 助词 | 是,已经(做了),将(做),应该(做)*。 |
句子 | 连词 | 并且,或者,但是*。 |
CCONJ | 协调连词 | 和,或,但是*。 |
定语 | 限定词 | *a, an, the* |
INTJ | 插入语 | *psst, ouch, bravo, hello*. |
名词 | 名词 | *女孩,猫,树,空气,美*。 |
数字 | 数字 | *1, 2017, one, seventy-seven, IV, MMXIV*。 |
部分 | 粒子 | *'s, not,* |
PRON | 代词 | 我、你、他、她、我自己、他们、某人*。 |
专业名词 | 专有名词 | 玛丽、约翰、伦敦、北约、HBO*。 |
PUNCT | 标点符号 | *., (, ), ?* |
SCONJ | 从属连词 | 如果,而,那*。 |
SYM | 符号 | *$, %, §, ©, +, -, ×, ÷, =, :),![]() |
VERB | 动词 | *运行,运行,运行,吃,吃了,吃了*。 |
X | 其他 | *SFPKSDPSXMSA* |
空间 | 空间 |
Spacy POS标签的例子
在Spacy库中的POS标签是非常容易的,正如下面的例子所见。我们只是把Spacy对象实例化为doc。我们遍历doc对象并使用pos_ , tag_, 来打印POS标签。Spacy还允许你通过使用spacy.explain()函数访问POS标签的详细解释,该函数也会在同一迭代中与POS标签一起打印。
In [1]:
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Get busy living or get busy dying.")
print(f"{'text':{8}} {'POS':{6}} {'TAG':{6}} {'Dep':{6}} {'POS explained':{20}} {'tag explained'} ")
for token in doc:
print(f'{token.text:{8}} {token.pos_:{6}} {token.tag_:{6}} {token.dep_:{6}} {spacy.explain(token.pos_):{20}} {spacy.explain(token.tag_)}')
[输出] :
text POS TAG Dep POS explained tag explained
Get AUX VB ROOT auxiliary verb, base form
busy ADJ JJ amod adjective adjective
living NOUN NN dobj noun noun, singular or mass
or CCONJ CC cc coordinating conjunction conjunction, coordinating
get AUX VB conj auxiliary verb, base form
busy ADJ JJ acomp adjective adjective
dying VERB VBG xcomp verb verb, gerund or present participle
. PUNCT . punct punctuation punctuation mark, sentence closer
细粒度的POS标签
Spacy还提供了一个细粒度的标签,将一个标记进一步归入不同的子类别。例如,当一个词是形容词时,它进一步将其归类为JJR(比较形容词),JJS(最高级形容词),或AFX(词缀形容词)。我们可以通过使用nlp.pipe_labels['tagger']获得Spacy中的细粒度标签列表,如下例所示。
在 [2] 中
import spacy
nlp = spacy.load("en_core_web_sm")
tag_lst = nlp.pipe_labels['tagger']
print(len(tag_lst))
print(tag_lst)
[输出] :
50
['$', "''", ',', '-LRB-', '-RRB-', '.', ':', 'ADD', 'AFX', 'CC', 'CD', 'DT', 'EX', 'FW', 'HYPH', 'IN', 'JJ', 'JJR', 'JJS', 'LS', 'MD', 'NFP', 'NN', 'NNP', 'NNPS', 'NNS', 'PDT', 'POS', 'PRP', 'PRP$', 'RB', 'RBR', 'RBS', 'RP', 'SYM', 'TO', 'UH', 'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ', 'WDT', 'WP', 'WP$', 'WRB', 'XX', '_SP', '``']
细粒度的POS标签列表
下面是一个POS标签列表,它们的描述,细粒度标签,它们的描述,形态学,以及一些例子。
POS | 描述:POS_Description | 细粒度标签 | 描述 | 形态学 | 例子 | |
---|---|---|---|---|---|---|
0 | ADJ | 形容词 | AFX | 词缀 | Hyph=是 | Flintstones是一个***历史悠久的家庭。 |
1 | ADJ | 形容词 | JJ | 形容词 | 程度=pos | 这是一个**好的**句。 |
2 | ADJ | 形容词 | JJR | 形容词,比较 | 程度=comp | 这是一个**更好的**句。 |
3 | ADJ | 形容词 | JJS | 形容词,超限 | 程度=sup | 这是***最好的句子。 |
4 | ADJ | 形容词 | PDT | 预设者 | AdjType=pdt PronType=prn | 醒来是***战斗的一半。 |
5 | ADJ | 形容词 | PRP$ | 代词,占有式 | PronType=prs Poss=yes | **他**的手臂很疼。 |
6 | ADJ | 形容词 | WDT | 判断词 | PronType=int rel | 它是蓝色的,***这***是奇怪的。 |
7 | ADJ | 形容词 | WP$ | 代词,占有式 | Poss=yes PronType=int rel | 我们不知道***是谁的。 |
8 | ADP | 定位词 | IN | 连词、从句或介词 | 它是在***个盒子里到达的。 | |
9 | ADV | 副词 | EX | 存在于那里 | AdvType=ex | **那里**是蛋糕。 |
10 | ADV | 副词 | RB | 副词 | 程度=位置 | 他跑得**快。 |
11 | ADV | 副词 | RBR | 副词,比较 | 程度=comp | 他跑得**快了。 |
12 | ADV | 副词 | RBS | 副词,超限 | 程度=sup | 他跑得**快。 |
13 | ADV | 副词 | WRB | wh-adverb | PronType=int rel | ***是什么时候? |
14 | 句子 | 连接词 | CC | 连词,协调性 | ConjType=coor | 气球爆裂了,***大家都跳了起来。 |
15 | DET | 限定词 | DT | 限定词 | 这**是一个**的句子。 | |
16 | INTJ | 插入语 | UH | 插入语 | ***Um**,我不知道。 | |
17 | NOUN | 名词 | NN | 名词,单数或众数 | 数字=sing | 这是一个**的句子。 |
18 | NOUN | 名词 | NNS | 名词,复数 | 数量=plur | 这些是**词**。 |
19 | NOUN | 名词 | WP | 代词,个人 | PronType=int rel | ***是谁? |
20 | NUM | 数字 | CD | 心数 | NumType=card | 我想要***三样东西。 |
21 | 部分 | 粒子 | POS | 占有式结尾 | Poss=是 | 弗雷德**的**名字很短。 |
22 | 部分 | 粒子 | RP | 副词,粒子 | 把它**回**! | |
23 | 部分 | 粒子 | 到 | 不等式to | PartType=inf 动词形式=inf | 我想***去。 |
24 | PRON | 代词 | PRP | 代词,个人 | PronType=prs | 我***希望***你***去。 |
25 | 专有名词 | 专有名词 | NNP | 名词,适当的单数 | NounType=prop Number=sign | **Kilroy**在这里。 |
26 | 专业名词 | 专有名词 | NNPS | 名词,适当的复数 | NounType=prop Number=plur | 燧石族**是一个史前家族。 |
27 | PUNCT | 标点符号 | -LRB- | 左圆括号 | PunctType=brck PunctSide=ini | 圆括号 **(**也叫小括号) |
28 | PUNCT | 标点符号 | -RRB- | 右圆括号 | PunctType=brck PunctSide=fin | 圆括号(也叫小括号**)** |
29 | PUNCT | 标点符号 | , | 标点符号, 逗号 | PunctType=comm | 我**,**我和我自己。 |
30 | PUNCT | 标点符号 | : | 标点符号,冒号或省略号 | 冒号 **:**是一个标点符号 | |
31 | PUNCT | 标点符号 | . | 标点符号,句子接近 | PunctType=peri | 句末的标点符号**.** |
32 | PUNCT | 标点符号 | ” | 结束语引号 | PunctType=quot PunctSide=fin | "机器学习**"** |
33 | PUNCT | 标点符号 | “” | 结束语引号 | PunctType=quot PunctSide=fin | **””** |
34 | PUNCT | 标点符号 | “ | 开头的引号 | PunctType=quot PunctSide=ini | **"**机器学习" |
35 | PUNCT | 标点符号 | HYPH | 标点符号,连字符 | PunctType=破折号 | ML网站 **-** machinelearningknowledge.ai |
36 | 符号 | 标点符号 | LS | 列表项标记 | NumType=ord | |
37 | PUNCT | 标点符号 | NFP | 多余的标点符号 | ||
38 | SYM | 符号 | # | 符号,数字符号 | SymType=numbersign | 这是哈希**#**符号。 |
39 | SYM | 符号 | $ | 符号,货币 | SymType=货币 | 美元**$**是20多种货币的名称。 |
40 | SYM | 符号 | SYM | 符号 | 这是一个符号**$** | |
41 | VERB | 动词 | BES | 助词 "是" | 让它**是**。 | |
42 | VERB | 动词 | HVS | "有 "的形式 | 我***见过女王 | |
43 | VERB | 动词 | MD | 动词,情态助词 | 动词类型=mod | 这***可能会起作用。 |
44 | VERB | 动词 | VB | 动词,基本形式 | verbForm=inf | 我想去***。 |
45 | VERB | 动词 | VBD | 动词,过去式 | 动词形式=fin 时态=过去式 | 这***是一个句子。 |
46 | VERB | 动词 | 语气词 | 动词,动名词或现在分词 | 动词形式=part 时态=pres 侧面=prog | 我正在***去***。 |
47 | 动词(VERB | 动词 | VBN | 动词,过去分词 | 动词形式=部分 时态=过去式 语态=过去式 | 宝藏被**丢了。 |
48 | 动词 | 动词 | VBP | 动词,非第三人称单数现在时 | 动词形式=fin 时态=pres | 我***想去。 |
49 | 动词(VERB | 动词 | VBZ | 动词,第三人称单数现在时 | 动词形式=fin 时态=pres 数词=sing 人称=3 | 他***想去。 |
50 | X | 其他 | 增加 | 电子邮件 | example@gmail.com | |
51 | X | 其他 | FW | 外来词 | 外国=是 | 西班牙语中的 "你好 "是**Hola**。 |
52 | X | 其他 | GW | 多词表达中的附加词 | ||
53 | X | 其他 | XX | 未知 | ||
54 | 空间 | 空间 | ǞǞǞ | 空间 | ||
55 | NIL | 缺少标签 |
形态学
在语言学中,形态学被定义为分析一个词的过程,它们是如何形成的,以及它们与同一语言中其他词的关系,词的结构,以及词的部分,如词干、词根、前缀和后缀。形态学还研究了语篇、语调和重音,以及语境可以改变一个词的发音和含义的方式。
Spacy使用代币文本和细粒度的语音部分标签来产生形态学特征。
在Spacy中,形态学特征被存储在Token.morph下的MorphAnalysis中,这使得我们可以访问单个形态学特征。在下面的例子中,我们通过使用token.morph属性来迭代doc对象的标记并打印所有的形态学特征。然而,我们也可以通过使用morph.get()函数访问任何特定类型的形态学特征。token.morph.to_dict()函数以字典格式返回所有形态学特征。
In [2]:
import
[Out] :
Pipeline: ['tok2vec', 'tagger', 'parser', 'ner', 'attribute_ruler', 'lemmatizer']
I
Case=Nom|Number=Sing|Person=1|PronType=Prs
['Sing']
{'Case': 'Nom', 'Number': 'Sing', 'Person': '1', 'PronType': 'Prs'}
was
Mood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin
['Sing']
{'Mood': 'Ind', 'Number': 'Sing', 'Person': '3', 'Tense': 'Past', 'VerbForm': 'Fin'}
heading
Aspect=Prog|Tense=Pres|VerbForm=Part
[]
{'Aspect': 'Prog', 'Tense': 'Pres', 'VerbForm': 'Part'}
towards
[]
{}
North
NounType=Prop|Number=Sing
['Sing']
{'NounType': 'Prop', 'Number': 'Sing'}
.
PunctType=Peri
[]
{'PunctType': 'Peri'}
计算Spacy中的POS标签
在下面的例子中,我们将POS标记属性传递给Doc.count()函数,该函数返回一个频率字典,key为POS属性值,其频率为值。在for循环的帮助下,我们正在打印POS标记和它的计数。
In [3]:
import
[Out] :
{87: 2, 94: 3, 84: 2, 100: 2, 85: 2, 90: 2, 92: 1}
84. ADJ : 2
85. ADP : 2
87. AUX : 2
90. DET : 2
92. NOUN : 1
94. PART : 3
100. VERB : 2
计算细粒度的标签
在下面的例子中,我们将TAG标记属性传递给Doc.count(),它将返回一个频率字典,key为TAG属性值,频率为值。在for循环的帮助下,我们正在打印POS标签和它的计数。
在 [4]:
import
[输出] :
{15267657372422890137: 2, 10554686591937588953: 3, 15308085513773655218: 3, 17109001835818727656: 1, 1292078113972184607: 1, 74: 1, 12646065887601541794: 1}
74. POS : 1
1292078113972184607. IN : 1
10554686591937588953. JJ : 3
12646065887601541794. . : 1
15267657372422890137. DT : 2
15308085513773655218. NN : 3
17109001835818727656. VBD : 1
在Spacy中实现POS标签的可视化
在Spacy中,我们可以使用dispacy.serve()函数将语篇标签和句法依赖关系可视化,该函数接收单个Doc或Doc对象的列表并返回一个漂亮的可视化。
在[6]中。
import
[Out] :
然而,我们可以通过传递一列参数来调整显示函数,从而获得不同的可视化效果,这些参数的重要性将在下面说明。
参数
distance: 象征性凹陷之间的距离。 **compact:**颜色的紧凑性。 **color:**字体的颜色。 **bg:**可视化的背景颜色。 font:可视化中的字体风格。
In [7]:
import
[Out] :
在Spacy中实现长文本中POS标签的可视化
长文本在一排显示时可能会变得难以阅读,所以将它们逐句可视化往往会更好。Displacy支持渲染Doc和Span对象,以及Doc或Span的列表。我们可以不把完整的Doc传给displacy.serve,而是传入一个列表doc.sents。这将为每个句子创建一个可视化。
在[8]中。
import
[Out] :
- 同时阅读 - NLTK Python中的POS标签和分块教程
参考资料 -Spacy文档
The postTutorial on Spacy Part of Speech (POS) Taggingappeared first onMLK - Machine Learning Knowledge.
转载自:https://juejin.cn/post/7087842724803674142