2013-06-23 3 views
0

nltk에서 음성 또는 POS 태그러를 사용하려고했지만 backoff를 사용하여 둘 이상의 ngram 태그 작성기에서 작동하지 못했습니다. 더 높은 점수를 얻기 위해 더 많은 태그를 사용하는 것으로 읽었지 만 저에게는 효과가 없습니다. 처음에는 더 많은 단어를 사용하고 하나는 사용하지 않기를 바랍니다. 나는이 같은백 오프 ngrams를 사용하여 nltk에서 태그 지정

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' 

저는 파이썬을 처음 사용하는 사람들에게 도움이됩니다.

답변

2

Spaceghost이 올바른지, 당신은 다시 backoff 인수로 실제 NgramTagger 객체가 아니라 단지 int에 대한 참조를 제공해야합니다. 백 오프로 숫자를 사용하는 것만으로도 의미가 없습니다. 새 태그 작성기를 만들 때 상대적으로 작은 컨텍스트에서 이전에 작성한 태그 작성기를 어디에서 찾을 지 모릅니다.

여기에 AttributeError: 'int' object has no attribute '_taggers'이 표시됩니다. NLTK는 SequentialBackoffTagger을 상속하는 클래스의 개체를 찾고 있습니다. 당신의 range(3)을 바탕으로

, 나는 유니 그램 술래에 백 오프 더불어, 음절 술래에 실제로 백 오프와 괘 술래를 원 추측거야.

당신이 좋아하는 뭔가를 시도 할 수 있습니다

,

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')] 

공지 사항, 우리는 "안녕하세요"는 주어진 코퍼스 (브라운의 뉴스 카테고리)에서 발생하지 않기 때문에 같은 단어의 POS에 대한 None를 얻을. 처음에 tagger (for 루프 이전)을 설정하여 기본 타거를 설정할 수 있습니다.

from nltk import DefaultTagger 
tagger = DefaultTagger('NN') 
0

매개 변수 백 오프는 현재 상황이 가장 좋았을 때 사용할 다른 태그 지정자를 가리켜 야합니다. 두 번째 타거를 정의하거나 기본값을 사용하고 코드를 변경하여이를 사용해야합니다. 이런 식으로 뭔가 :

default_tagger = nltk.data.load(nltk.tag._POS_TAGGER) 
tagger = nltk.NgramTagger(n, trains, backoff=default_tagger) 
관련 문제