2013-03-23 2 views
2

Я новичок в кодировании python. Я хочу использовать UnigramTagger вместе с отступлением (что в моем случае является RegexpTagger), и я изо всех сил пытался понять, что такое ошибка ниже. Цените любую помощь по этому поводу.Backoff Tagger in nltk

>>> train_sents = (['@Sakshi', 'Hi', 'I', 'am', 'meeting', 'my', 'friend', 'today'])  
>>> from tag_util import patterns 
>>> from nltk.tag import RegexpTagger 
>>> re_tagger = RegexpTagger(patterns) 
>>> from nltk.tag import UnigramTagger 
>>> from tag_util import backoff_tagger 
>>> tagger = backoff_tagger(train_sents, UnigramTagger, backoff=re_tagger) 

Traceback (most recent call last): 
File "<pyshell#6>", line 1, in <module> 
    tagger = backoff_tagger(train_sents, UnigramTagger, backoff=re_tagger) 
    File "tag_util.py", line 12, in backoff_tagger 
    for cls in tagger_classes: 
TypeError: 'YAMLObjectMetaclass' object is not iterable 

Это код, который я имею в tag_util для моделей и backoff_tagger

import re 
patterns = [ 
    (r'^@\w+', 'NNP'), 
    (r'^\d+$', 'CD'), 
    (r'.*ing$', 'VBG'), # gerunds, i.e. wondering 
    (r'.*ment$', 'NN'), 
    (r'.*ful$', 'JJ'), # i.e. wonderful 
    (r'.*', 'NN') 
] 

def backoff_tagger(train_sents, tagger_classes, backoff=None): 
    for cls in tagger_classes: 
     backoff = cls(train_sents, backoff=backoff) 
    return backoff 
+0

См. Мой обновленный ответ. – Jared

ответ

1

Вам нужно всего лишь изменить несколько вещей, чтобы это работало.

Ошибка, которую вы получаете, потому что вы не можете перебирать класс UnigramTagger. Я не уверен, что у вас было что-то еще, но просто удалите цикл for. Кроме того, вам необходимо передать UnigramTagger a list из тегированные предложения представлены как list s из (word, tag) tuple s - не просто список слов. В противном случае он не знает, как тренироваться. Частично это может выглядеть следующим образом:

[[('@Sakshi', 'NN'), ('Hi', 'NN'),...],...[('Another', 'NN'), ('sentence', 'NN')]] 

Обратите внимание, что здесь каждое предложение само по себе является list. Кроме того, вы можете использовать тегированный корпус из NTLK для этого (что я рекомендую).

Edit:

После прочтения вашего поста, мне кажется, что вы оба смущены о том, что вход/выход ожидать от определенных функций и не хватает понимания обучения в смысле НЛП. Я думаю, вы получите большую пользу от reading the NLTK book, starting at the beginning.

Я рад показать вам, как это исправить, но я не думаю, что у вас будет полное понимание основных механизмов без каких-либо дополнительных исследований.

tag_util.py (на основе кода)

from nltk.tag import RegexpTagger, UnigramTagger 
from nltk.corpus import brown 

patterns = [ 
    (r'^@\w+', 'NNP'), 
    (r'^\d+$', 'CD'), 
    (r'.*ing$', 'VBG'), 
    (r'.*ment$', 'NN'), 
    (r'.*ful$', 'JJ'), 
    (r'.*', 'NN') 
] 
re_tagger = RegexpTagger(patterns) 
tagger = UnigramTagger(brown.tagged_sents(), backoff=re_tagger) # train tagger 

В интерпретатора

>>> import tag_util 
>>> tag_util.brown.tagged_sents()[:2] 
[[('The', 'AT'), ('Fulton', 'NP-TL'), ('County', 'NN-TL'), ('Grand', 'JJ-TL'), ('Jury', 'NN-TL'), ('said', 'VBD'), ('Friday', 'NR'), ('an', 'AT'), ('investigation', 'NN'), ('of', 'IN'), ("Atlanta's", 'NP$'), ('recent', 'JJ'), ('primary', 'NN'), ('election', 'NN'), ('produced', 'VBD'), ('``', '``'), ('no', 'AT'), ('evidence', 'NN'), ("''", "''"), ('that', 'CS'), ('any', 'DTI'), ('irregularities', 'NNS'), ('took', 'VBD'), ('place', 'NN'), ('.', '.')], [('The', 'AT'), ('jury', 'NN'), ('further', 'RBR'), ('said', 'VBD'), ('in', 'IN'), ('term-end', 'NN'), ('presentments', 'NNS'), ('that', 'CS'), ('the', 'AT'), ('City', 'NN-TL'), ('Executive', 'JJ-TL'), ('Committee', 'NN-TL'), (',', ','), ('which', 'WDT'), ('had', 'HVD'), ('over-all', 'JJ'), ('charge', 'NN'), ('of', 'IN'), ('the', 'AT'), ('election', 'NN'), (',', ','), ('``', '``'), ('deserves', 'VBZ'), ('the', 'AT'), ('praise', 'NN'), ('and', 'CC'), ('thanks', 'NNS'), ('of', 'IN'), ('the', 'AT'), ('City', 'NN-TL'), ('of', 'IN-TL'), ('Atlanta', 'NP-TL'), ("''", "''"), ('for', 'IN'), ('the', 'AT'), ('manner', 'NN'), ('in', 'IN'), ('which', 'WDT'), ('the', 'AT'), ('election', 'NN'), ('was', 'BEDZ'), ('conducted', 'VBN'), ('.', '.')]] 

Обратите внимание на выход здесь. Я получаю первые два предложения из корпуса Брауна с помеченными предложениями. Это тот вид данных, который вам нужно передать в теггер как вход (например, UnigramTagger) для его обучения. Теперь давайте использовать теггер, которого мы обучили tag_util.py.

Назад к интерпретатору Python

>>> tag_util.tagger.tag(['I', 'just', 'drank', 'some', 'coffee', '.']) 
[('I', 'PPSS'), ('just', 'RB'), ('drank', 'VBD'), ('some', 'DTI'), ('coffee', 'NN'), ('.', '.')] 

И там у вас есть, POS помечены слова в предложении, используя свой подход.

0

Если вы используете backoff_tagger, что я думаю. UnigramTagger должен быть пункт списка, как показано ниже:

tagger = backoff_tagger(train_sents, [UnigramTagger], backoff=re_tagger) 

Я надеюсь, что это помогает.

Смежные вопросы