3

私はpythonコーディングが初めてです。バックオフ(私の場合はRegexpTagger)とともにUnigramTaggerを使用したいのですが、以下のエラーが何であるかを理解するのに苦労しています。これに関する助けに感謝します。

>>> 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

これは、パターンと backoff_tagger の tag_util にあるコードです

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
4

2 に答える 2

2

これを機能させるには、いくつか変更するだけです。

あなたが得ているエラーは、クラスを反復できないためですUnigramTagger。何か他のことを考えていたかどうかはわかりませんが、forループを削除してください。また、単なる単語のリストではなく、(word, tag)の sとして表されるタグ付きのUnigramTaggerのを渡す必要があります。そうしないと、トレーニング方法がわかりません。この一部は次のようになります。listlisttuple

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

ここで、各文自体が であることに注意してくださいlist。また、これには NTLK のタグ付きコーパスを使用できます (これをお勧めします)。

編集:

あなたの投稿を読んだ後、特定の関数からどのような入力/出力が期待されるかについて混乱しており、NLP の意味でのトレーニングの理解が不足しているように思えます。NLTK の本を最初から読んでおくと、大いに役立つと思います。

これを修正する方法をお見せできることをうれしく思いますが、さらに調査を行わないと、根本的なメカニズムを完全に理解することはできないと思います.

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

Python インタープリターで

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

ここで出力に注目してください。タグ付き文のブラウンコーパスから最初の 2 つの文を取得しています。これは、タガーを訓練するために (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 タグを付けました。

于 2013-03-23T08:07:14.640 に答える
0

あなたがそれを使っbackoff_taggerているなら、私は考えています。UnigramTagger以下のリストの項目である必要があります。

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

お役に立てば幸いです。

于 2015-06-03T05:44:13.037 に答える