2013-06-23 3 views
0

Я попытался сделать часть тега речи (или POS) в nltk, но я не могу заставить его работать более чем на один теггер ngram за какое-то время, используя отсрочку. Я читал, что вы используете больше тегов для более высоких баллов, но это не сработает для меня. Я хочу, чтобы он сначала использовал больше слов, а затем использовал меньше, чем один. Я попробовал это, как это,tagging pos в nltk с использованием backoff ngrams

import nltk 
from nltk.corpus import brown 

#sentence = brown.sents(categories = "news") 
trains = brown.tagged_sents(categories = "news") 


from nltk import NgramTagger 

fortest = ["hi", "how","are", "you"] 

tagger = (nltk.NgramTagger (n, trains, backoff=n-1) for n in range (3)) 
print tagger.tag(fortest) 

Но это дает мне AttributeError об ошибке: «генератор» объект не имеет атрибута «тег»

так я сделать это без списка:

for n in range(3): 
    tagger = nltk.NgramTagger(n, trains, backoff=n-1) 

Но то я получаю:

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nltk/tag/sequential.py", line 271, in __init__ 
    ContextTagger.__init__(self, model, backoff) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nltk/tag/sequential.py", line 121, in __init__ 
    SequentialBackoffTagger.__init__(self, backoff) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nltk/tag/sequential.py", line 46, in __init__ 
    self._taggers = [self] + backoff._taggers AttributeError: 'int' object has no attribute '_taggers' 

Пожалуйста, помогите с оценкой, поскольку я новичок в создании python.

ответ

2

Spaceghost правильно, вы должны обеспечить обратную ссылку на фактический NgramTagger объекта в качестве аргумента backoff, а не просто int. Просто использование числа в качестве отсрочки бессмысленно - при создании нового теггера он понятия не имеет, где искать ранее созданный теггер с меньшим относительным контекстом.

Вот почему вы получаете AttributeError: 'int' object has no attribute '_taggers'. NLTK ищет объект класса, наследующий от SequentialBackoffTagger.

Основываясь на вашем range(3), я собираюсь думаю, вы на самом деле хотели триграммы Tagger с потерей мощности на Биграммного Tagger с потерей мощности на Юниграмму Tagger.

Вы можете попробовать что-то вроде,

from nltk.corpus import brown 
from nltk import NgramTagger 

trains = brown.tagged_sents(categories="news") 
tagger = None   # None here is okay since it's the default argument anyway 
for n in range(1,4): # start at unigrams (1) up to and including trigrams (3) 
    tagger = NgramTagger(n, trains, backoff=tagger) 

ПРИМЕЧАНИЕ: Нет необходимости импортировать NLTK несколько раз.

>>> tagger.tag('hi how are you'.split()) 
[('hi', None), ('how', 'WRB'), ('are', 'BER'), ('you', 'PPSS')] 

Обратите внимание, мы получаем None для POS слов, как «привет», так как это не происходит в данном корпусе (новости категории Брауна). Вы можете установить по умолчанию теггер, если хотите, изначально устанавливая tagger (до обратной петли), например

0

Отклонение параметра должно указывать на другой теггер, который должен использоваться, когда текущий из них сделал это лучше всего. Вам нужно определить второй теггер или использовать значение по умолчанию, а затем изменить свой код, чтобы использовать его. Что-то вроде этого:

default_tagger = nltk.data.load(nltk.tag._POS_TAGGER) 
tagger = nltk.NgramTagger(n, trains, backoff=default_tagger) 
Смежные вопросы