【问题标题】:How to use a regex backoff tagger in python NLTK to override NN's?如何在 python NLTK 中使用正则表达式退避标记器来覆盖 NN?
【发布时间】:2013-01-25 23:34:22
【问题描述】:

我一直在使用经过自定义训练的 nltk pos_tagger,有时我会得到明显的动词(以 ING 或 ED 结尾)以 NN 的形式出现。如何让标记器通过额外的 regexpTagger 处理所有 NN 以找到额外的动词?

我已经包含了一些辅助正则表达式标记器的示例代码。

from nltk.tag.sequential import RegexpTagger

rgt = RegexpTagger(
    (r'.*ing$', 'VBG'),                # gerunds
    (r'.*ed$', 'VBD'),                 # past tense verbs
])

谢谢

【问题讨论】:

  • 但是很多名词确实以 -ing 或 -ed 结尾。通常将动词的动名词形式用作名词。你会如何处理这些?

标签: python nlp nltk pos-tagger


【解决方案1】:

这里是由 bi-gram 支持的 tri_gram 标记器(由 uni-gram 支持),主要的回退跟踪器是正则表达式跟踪器。因此,如果任何其他标记器未能根据此处定义的规则对其进行标记,则此处的最后一个标记将留给正则表达式。希望这可以帮助您构建自己的规则正则表达式标记器。

   from nltk.corpus import brown
   import sys
   from nltk import pos_tag
   from nltk.tokenize import word_tokenize
   import nltk
   from nltk import ne_chunk
   def tri_gram():
   ##Trigram tagger done by training data from brown corpus 
    b_t_sents=brown.tagged_sents(categories='news')

   ##Making n-gram tagger using Turing backoff
   default_tagger = nltk.RegexpTagger(
            [(r'^-?[0-9]+(.[0-9]+)?$', 'CD'),   # cardinal numbers
         (r'(The|the|A|a|An|an)$', 'AT'),   # articles
         (r'.*able$', 'JJ'),                # adjectives
         (r'.*ness$', 'NN'),                # nouns formed from adjectives  
         (r'.*ly$', 'RB'),                  # adverbs
         (r'.*s$', 'NNS'),                  # plural nouns  
         (r'.*ing$', 'VBG'),                # gerunds   
         (r'.*ed$', 'VBD'),                 # past tense verbs
         (r'.*', 'NN')                      # nouns (default)
        ])
    u_gram_tag=nltk.UnigramTagger(b_t_sents,backoff=default_tagger) 
    b_gram_tag=nltk.BigramTagger(b_t_sents,backoff=u_gram_tag)
    t_gram_tag=nltk.TrigramTagger(b_t_sents,backoff=b_gram_tag)

    ##pos of given text
    f_read=open(sys.argv[1],'r')
    given_text=f_read.read();
    segmented_lines=nltk.sent_tokenize(given_text) 
    for text in segmented_lines:
        words=word_tokenize(text)
        sent = t_gram_tag.tag(words)
        print ne_chunk(sent)
tri_gram()

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 2017-06-24
    • 2013-03-13
    • 1970-01-01
    • 2016-03-03
    • 2013-06-20
    • 1970-01-01
    • 2014-04-06
    • 2013-04-04
    相关资源
    最近更新 更多