2

我使用 nltk 进行词性标注。它有 36 个 Penn Treebank。我想将标签的数量减少到6个:“名词、动词、形容词、副词、介词、连词”我该怎么做?有没有具体的功能属性?还是命令?

4

4 回答 4

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'), ('.', '.')]

我建议你坚持这个映射,即使结果标签比预期的要多。这样,您将遵循某种“约定”。此外,“额外”标签主要是关于标点符号。

如果你严格地想映射到你的固定集合“名词、动词、形容词、副词、介词、连词”,你总是可以使用map_tag方法。

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

import nltk
nltk.download('universal_tagset')
于 2018-03-19T11:30:11.067 回答
0

询问“通用”标签集:

treebank.tagged_sents(tagset="universal")

它并不完全是您指定的列表(例如,它没有忘记确定器),但它很接近。如果您仍然不喜欢它,您可以自己重命名其余的 POS 标签。

于 2017-05-22T17:50:36.280 回答
0

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

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

NLTK 的所有可能的 pos 标签是什么?有一个很好的详细讨论/描述。


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

>>> nltk.help.brown_tagset()

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

treebank.tagged_sents(tagset="universal")

它们通过使用文件中的映射资源映射到通用标记集nltk.tag.mapping.tagset_mappingnltk_data/taggers/universal_tagset/en-*.map

~/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
于 2017-05-23T01:24:52.193 回答
0

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

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

  • 查看此链接以获取 HTML 中的映射表
  • 这确实会为您在语言注释本体中的特定减少执行实时查找 (请参阅解释中的长答案)
  • 要直接在 NLTK 中使用该映射,请将 JSON 定义为输出格式并将其解析为 Python 字典,如通过此链接

长答案:

  • 要将标签减少到您的“目标标签”,您可以使用 Ontologies of Linguistic Annotation [披露:我正在维护这些],并使用以下 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

于 2020-12-08T23:05:38.150 回答