如何减少Penn Treebank中的POS标签数量? - NLTK(Python)

时间:2017-05-22 16:17:32

标签: nltk pos-tagger penn-treebank

我使用nltk进行部分语音标记。它有36 Penn Treebank。我想将标签数量减少到6:“名词,动词,形容词,副词,介词,连词” 我该怎么办?是否有任何特定的功能属性?还是命令?

4 个答案:

答案 0 :(得分:0)

要求"通用"标签集:

treebank.tagged_sents(tagset="universal")

它不是你指定的列表(例如,它没有忘记确定者),但它接近了。如果你还不喜欢它,你可以自己重命名其余的POS标签。

答案 1 :(得分:0)

可以这样访问UPenn标记集文档:

>>> import nltk
>>> nltk.help.upenn_tagset()

What are all possible pos tags of NLTK?对其进行了详细的讨论/描述。

请注意,虽然Penn Treebank(PTB)的华尔街日报(wsj)子集使用UPenn标记集,但brown语料库(PTB的子集)具有更精细的谷物标记集:

>>> nltk.help.brown_tagset()

虽然原始PTB具有upennbrown标记,但可以映射treebank语料库中的标记。正如@alexis所示,PTB语料库的通用标记集可以这样访问:

treebank.tagged_sents(tagset="universal")

使用nltk_data/taggers/universal_tagset/en-*.map文件中的映射资源,Universal Tagset将它们映射到nltk.tag.mapping.tagset_mapping

~/nltk_data/taggers/universal_tagset$ ls
README             de-negra.map       en-tweet.map       fi-tdt.map         ja-verbmobil.map   sl-sdt.map
ar-padt.map        de-tiger.map       es-cast3lb.map     fr-paris.map       ko-sejong.map      sv-talbanken.map
bg-btb.map         el-gdt.map         es-eagles.map      hu-szeged.map      nl-alpino.map      tu-metusbanci.map
ca-cat3lb.map      en-brown.map       es-iula.map        it-isst.map        pl-ipipan.map      universal_tags.py
cs-pdt.map         en-ptb.map         es-treetagger.map  iw-mila.map        pt-bosque.map      zh-ctb6.map
da-ddt.map         en-tweet.README    eu-eus3lb.map      ja-kyoto.map       ru-rnc.map         zh-sinica.map

答案 2 :(得分:0)

我建议您使用tagset_mapping方法。如果您要求它从en-ptb(Penn Treebank PoS)映射到universal,您将减少PoS标记的数量。

这是一个非常简单的例子,可以看到如何合并方法:

from nltk.tokenize import word_tokenize
from nltk import pos_tag
from nltk.tag.mapping import tagset_mapping

PTB_UNIVERSAL_MAP = tagset_mapping('en-ptb', 'universal')

def to_universal(tagged_words):
    return [(word, PTB_UNIVERSAL_MAP[tag]) for word, tag in tagged_words]

text = "This is a very simple example."
pos_tagged = [(word, tag) for word, tag in pos_tag(word_tokenize(text))]

您可以观察映射之前和之后的差异:

print(pos_tagged)
>>>[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('very', 'RB'), ('simple', 'JJ'), ('example', 'NN'), ('.', '.')]

print(to_universal(pos_tagged))
>>> [('This', 'DET'), ('is', 'VERB'), ('a', 'DET'), ('very', 'ADV'), ('simple', 'ADJ'), ('example', 'NOUN'), ('.', '.')]

我建议您坚持使用此映射,即使结果标记多于预期。这样你就可以遵循#34;惯例"。此外,"额外"标签主要是关于标点符号。

如果您严格要映射到固定集"名词,动词,形容词,副词,介词,连词"您始终可以使用map_tag方法。

  

请注意,您可能需要下载额外的资源:

import nltk
nltk.download('universal_tagset')

答案 3 :(得分:0)

不能简化为这6个标签,因为对于诸如限定词或代词之类的事物,将有一个“其他”类别,而不能直接归为您提到的任何类别。

话虽如此,简短的答案是:

  • this link中获取HTML映射表
  • 这确实会针对您的特定还原执行实时查找 (请参见解释的长答案)
  • 要直接在NLTK中使用该映射,请将JSON定义为输出格式,然后通过this link将其解析为Python dict

长答案:

  • 要将标签减少到“目标标签”,可以通过以下SPARQL查询使用语言注释本体[公开:我正在维护这些]:

      PREFIX system: <http://purl.org/olia/system.owl#>
      PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
      PREFIX owl: <http://www.w3.org/2002/07/owl#>
      PREFIX olia: <http://purl.org/olia/olia.owl#>
    
      # columns of the mapping table 
      SELECT distinct ?tag ?category
    
      # lookup in the Ontologies of Linguistic Annotation
      FROM <http://purl.org/olia/penn.owl>        # Penn tags 
      FROM <http://purl.org/olia/olia.owl>        # reference concepts (Noun etc.)
      FROM <http://purl.org/olia/penn-link.rdf>   # Penn -> reference concepts
    
      # the actual query
      WHERE { 
    
          # for an element with a particular tag
          ?a system:hasTag ?tag.
    
          # retrieve all its super classes
          OPTIONAL { 
              ?a a/(rdfs:subClassOf|owl:equivalentClass|
      owl:unionOf|owl:intersectionOf)* ?b. 
    
              # but only if they match your target categories
              # see http://purl.org/olia/olia.owl for their definitions
              FILTER(?b in (
                  olia:Noun, olia:Verb, olia:Adjective,
                  olia:Adverb, olia:Preposition, 
                  olia:Conjunction
                  )) 
          }
    
          # return the local name of the target category
          # if none of your target categories can be found, return "OTHER" 
          BIND(if(bound(?b), replace(str(?b),".*[#/]",""), "OTHER") AS ?category)
      }
      ORDER BY ?tag
    
  • 请参阅嵌入式注释以获取解释。您可以调整过滤条件以获得更多,更少或其他类别。请注意,如果Penn标签不明确(分离,即owl:unionOf),则此查询可以返回多个映射。

  • 无需为此类偶尔的查询设置自己的端点,只需转到http://sparql.org/sparql.html并复制并粘贴(并编辑)该查询即可。可能有不同的输出格式,请选择“输出XML”和默认的XSL样式表以获取HTML视图。

  • 可以将整个查询压缩为单个URI(如上所述)。您可以自定义查询和输出格式,单击“获取结果”,然后复制结果页面的URL。 (或使用标准URI转义自行构建。)

  • 请注意,每当您单击该链接时,都会运行实时查询。最好一次执行一次并存储映射表。

  • 请注意,复杂表达式(rdfs:subClassOf|owl:equivalentClass| owl:unionOf|owl:intersectionOf)*允许您搜索OWL公理。但是,这是搜索,不是推理,因此您将只检索显式定义为超类的类。

  • 请注意,owl:unionOf是逻辑或。无法通过SPARQL查询来消除歧义,如果您想将含糊不清的标签视为OTHER,请从属性路径中删除该表达式。

  • 还请注意,这不仅限于Penn,OLiA支持100多种语言的标签集,请参见http://purl.org/olia