【问题标题】:What do spaCy's part-of-speech and dependency tags mean?spaCy 的词性和依赖标签是什么意思?
【发布时间】:2016-10-27 15:14:32
【问题描述】:

spaCy 用词性标记Document 中的每个Tokens(以两种不同的格式,一种存储在Tokenpospos_ 属性中,另一种存储在在tagtag_ 属性中)以及对其.head 标记的语法依赖(存储在depdep_ 属性中)。

其中一些标签是不言自明的,即使对于像我这样没有语言学背景的人来说也是如此:

>>> import spacy
>>> en_nlp = spacy.load('en')
>>> document = en_nlp("I shot a man in Reno just to watch him die.")
>>> document[1]
shot
>>> document[1].pos_
'VERB'

其他...不是:

>>> document[1].tag_
'VBD'
>>> document[2].pos_
'DET'
>>> document[3].dep_
'dobj'

更糟糕的是,official docs 甚至不包含大多数这些属性的可能标记列表,也不包含其中任何一个的含义。他们有时会提到他们使用的标记化标准,但这些说法目前并不完全准确,而且这些标准很难追踪。

tag_pos_dep_ 属性的可能值是什么,它们的含义是什么?

【问题讨论】:

标签: python nlp spacy


【解决方案1】:

tl;博士回答

只需在以下位置展开列表:

更长的答案

自从我第一次提出这个问题以来,文档有了很大的改进,而 spaCy 现在记录得更好了。

词性标签

postag 属性列表在https://spacy.io/api/annotation#pos-tagging,并描述了这些值列表的来源。在本次(2020 年 1 月)编辑时,文档说 pos 属性:

spaCy 将所有特定于语言的词性标签映射到Universal Dependencies scheme 之后的一组固定的小词类型标签。通用标签不针对任何形态特征进行编码,仅涵盖单词类型。它们以 Token.posToken.pos_ 属性的形式提供。

至于tag 属性,文档说:

英语词性标注器使用 Penn Treebank 标记集的OntoNotes 5 版本。我们还将标签映射到更简单的 Universal Dependencies v2 POS 标签集。

德语词性标注器使用TIGER Treebank 注释方案。我们还将标签映射到更简单的 Universal Dependencies v2 POS 标签集。

因此,您可以选择使用跨语言一致的粗粒度标签集 (.pos) 或特定于特定树库的细粒度标签集 (.tag),因此特定的语言。

.pos_标签列表

文档列出了以下用于 pospos_ 属性的粗粒度标签:

  • ADJ:形容词,例如大、旧、绿色、难以理解、首先
  • ADP:附加,例如在,到,期间
  • ADV:副词,例如非常,明天,下来,哪里,那里
  • AUX:辅助,例如是,已经(完成),将(做),应该(做)
  • CONJ:连词,例如和,或者,但是
  • CCONJ:协调连词,例如和,或者,但是
  • DET:确定者,例如一个,一个,那个
  • INTJ:感叹词,例如psst,哎哟,好极了,你好
  • NOUN: 名词,例如女孩, 猫, 树, 空气, 美女
  • NUM:数字,例如2017 年 1 月 1 日、77 日、IV、MMXIV
  • PART:粒子,例如的,不是,
  • PRON: 代词,例如我、你、他、她、我自己、他们自己、某人
  • PROPN:专有名词,例如玛丽、约翰、伦敦、北约、HBO
  • PUNCT:标点符号,例如., (, ), ?
  • SCONJ:从属连词,例如如果,而,那
  • SYM:符号,例如$、%、§、©、+、-、×、÷、=、:)、?
  • VERB:动词,例如跑,跑,跑,吃,吃,吃
  • X:其他,例如sfpksdpsxmsa
  • SPACE:空格,例如

请注意,当他们说这个列表遵循通用依赖方案时,文档有点撒谎;上面列出的两个标签不属于该方案。

其中一个是 CONJ,它曾经存在于通用 POS 标签方案中,但自从 spaCy 首次编写以来,它已被拆分为 CCONJSCONJ。根据文档中 tag->pos 的映射,看起来 spaCy 的当前模型实际上并没有使用CONJ,但由于某种原因它仍然存在于 spaCy 的代码和文档中 - 可能与旧模型向后兼容。

第二个是SPACE,它不是通用 POS 标签方案的一部分(据我所知,从来没有),除了单个普通 ASCII 空格(它不' t 获得自己的令牌):

>>> document = en_nlp("This\nsentence\thas      some weird spaces in\n\n\n\n\t\t   it.")
>>> for token in document:
...   print('%r (%s)' % (str(token), token.pos_))
... 
'This' (DET)
'\n' (SPACE)
'sentence' (NOUN)
'\t' (SPACE)
'has' (VERB)
'     ' (SPACE)
'some' (DET)
'weird' (ADJ)
'spaces' (NOUN)
'in' (ADP)
'\n\n\n\n\t\t   ' (SPACE)
'it' (PRON)
'.' (PUNCT)

我将从这个答案中省略 .tag_ 标签的完整列表(更细粒度的标签),因为它们数量众多,现在有据可查,英语和德语不同,并且可能更可能在发布。相反,请查看文档中的列表(例如,英语为 https://spacy.io/api/annotation#pos-en),其中列出了每个可能的标签、它映射到的 .pos_ 值以及它的含义描述。

依赖标记

现在有 三种 spaCy 用于依赖标记的不同方案:one for Englishone for Germanone for everything else。再一次,值列表是巨大的,我不会在这里完整地复制它。每个依赖项旁边都有一个简短的定义,但不幸的是,它们中的许多——比如“同位修饰符”或“从句补语”——对于像我这样的日常程序员来说是相当陌生的艺术术语。如果您不是语言学家,则只需研究这些艺术术语的含义即可理解它们。

不过,我至少可以为使用英文文本的人提供该研究的起点。如果您想在真实句子中查看 CLEAR 依赖项(由英语模型使用)的一些示例,请查看 Jinho D. Choi 的 2012 年工作:他的Optimization of Natural Language Processing Components for Robustness and Scalability 或他的@ 987654334@(这似乎只是前一篇论文的一个小节)。两者都列出了 2012 年存在的所有 CLEAR 依赖标签以及定义和例句。 (不幸的是,自 2012 年以来,CLEAR 依赖标签集发生了一些变化,因此 Choi 的作品中没有列出或举例说明一些现代标签 - 但尽管有些过时,但它仍然是一个有用的资源。)

【讨论】:

【解决方案2】:

关于获取简短形式的详细含义的快速提示。您可以使用explain 方法如下:

spacy.explain('pobj')

这会给你这样的输出:

'object of preposition'

【讨论】:

    【解决方案3】:

    官方文档现在在https://spacy.io/api/annotation 提供了所有这些注释的更多详细信息(令牌的其他属性列表可以在https://spacy.io/api/token 找到)。

    如文档所示,它们的词性 (POS) 和依赖标记具有针对不同语言的通用和特定变体,explain() 函数是一个非常有用的快捷方式,可以更好地描述标记的含义,而无需文档,例如

    spacy.explain("VBD")
    

    给出“动词,过去式”。

    【讨论】:

      【解决方案4】:

      直接链接(如果您不想通过无休止的冗长文档来获取完整的表格):

      【讨论】:

        【解决方案5】:

        在 Spacy 最近更新到 v3 之后。上面的链接不起作用。您可以访问这些链接以获取完整列表 https://v2.spacy.io/api/annotation

        通用 POS 标签

        英文词性标签

        【讨论】:

          【解决方案6】:

          目前,SpaCy 中的依赖解析和标记似乎仅在单词级别实现,而不是在短语(名词短语除外)或从句级别实现。这意味着 SpaCy 可用于识别名词(NN、NNS)、形容词(JJ、JJR、JJS)和动词(VB、VBD、VBG 等),但不能用于识别形容词短语 (ADJP)、副词短语 ( ADVP)或问题(SBARQ、SQ)。

          为了说明,当你使用 SpaCy 解析句子“Which way is the bus going?”时,我们得到the following tree.

          相比之下,如果你使用斯坦福解析器,你会得到a much more deeply structured syntax tree.

          【讨论】:

          • -1; IMO,这并没有回答我提出的问题(尽管这些树很有趣,并且很好地说明了两个解析器之间的差异)。仅供参考,您在这里描述的是 constituency parser(如 Stanford)和 dependency parser(如 spaCy)之间的区别。另见stackoverflow.com/a/10401433/1709587
          猜你喜欢
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          • 2016-03-17
          • 2018-05-24
          • 2020-12-04
          • 2014-04-20
          • 2011-01-20
          • 1970-01-01
          相关资源
          最近更新 更多