2016-10-24 3 views
0

NLTKで始まり、オランダ語の文章にタグを付けるが、コーパスを指定するのに問題がある。NLTKタグオランダ文

from nltk.tag import pos_tag 
from nltk.tokenize import word_tokenize 
from nltk.corpus import alpino 

pos_tag(word_tokenize("Python is een goede data science taal."), tagset = 'alpino') 

だから明らかに私が正しくコーパスを指定していない午前、

[('Python', 'UNK'), 
('is', 'UNK'), 
('een', 'UNK'), 
('goede', 'UNK'), 
('data', 'UNK'), 
('science', 'UNK'), 
('taal', 'UNK'), 
('.', 'UNK')] 

を与えます。私はアルピノコーパスをダウンロードしました。コーパスを正しく指定する方法を誰かに教えてもらえますか?

+1

http://stackoverflow.com/questions/14732465/nltk-tagging-spanish-words-using-a-corpusおよびhttps://github.com/alvations/spaghetti-tagger – alvas

答えて

3

デフォルト、あなたをロールバックするalpinoコーパスに新しいタグ付けを訓練しなければなりません独自のオランダのタガー。

しかし、モデルがほど良くなりますのでご注意:それはUnigramTaggerBigramTagger例から

で訓練されたアルゴリズム

  • に訓練されているどのデータ

    • >>> from nltk.corpus import alpino as alp 
      >>> from nltk.tag import UnigramTagger, BigramTagger 
      >>> training_corpus = alp.tagged_sents() 
      >>> unitagger = UnigramTagger(training_corpus) 
      >>> bitagger = BigramTagger(training_corpus, backoff=unitagger) 
      >>> pos_tag = bitagger.tag 
      >>> sent = 'NLTK is een goeda taal voor NLP'.split() 
      >>> pos_tag(sent) 
      [('NLTK', None), ('is', u'verb'), ('een', u'det'), ('goeda', None), ('taal', u'noun'), ('voor', u'prep'), ('NLP', None)] 
      

      PerceptronTagger

      >>> from nltk.tag import PerceptronTagger 
      >>> from nltk.corpus import alpino as alp 
      >>> training_corpus = list(alp.tagged_sents()) 
      >>> tagger = PerceptronTagger(load=True) 
      >>> tagger.train(training_corpus) 
      >>> sent = 'NLTK is een goeda taal voor het leren over NLP'.split() 
      >>> tagger.tag(sent) 
      [('NLTK', u'noun'), ('is', u'verb'), ('een', u'det'), ('goeda', u'adj'), ('taal', u'noun'), ('voor', u'prep'), ('het', u'det'), ('leren', u'noun'), ('over', u'prep'), ('NLP', u'noun') 
      

      @WasiAhmedが指摘したように、これは別の良い例です:https://github.com/evanmiltenburg/Dutch-taggerと@evanmiltenburgはgithubの上で述べたように、生産の高速化tagggerを使用するようにしてください。

      鬼を評価するために

      編集


      、次のようなtest_setを保持することができます:

      >>> from nltk.tag import PerceptronTagger 
      >>> from nltk.corpus import alpino as alp 
      >>> alp_tagged_sents = list(alp.tagged_sents()) 
      >>> len(alp_tagged_sents) 
      7136 
      >>> last_train_sent = int(len(alp_tagged_sents)/10 * 9) 
      >>> train_set = alp_tagged_sents[:last_train_sent] 
      >>> test_set = alp_tagged_sents[last_train_sent:] 
      

      その後.evaluate()関数の入力があり、精度を得るためにtagger.evaluate()機能を使用.train()関数の入力と同じです。つまり、文のリストです。各文は、('word', 'tag')タプルのリストです。

      >>> tagger = PerceptronTagger(load=False) 
      >>> tagger.train(train_set) 
      >>> tagger.evaluate(test_set) 
      0.927672285043738 
      

  • +0

    完全な例をありがとう! – Stereo

    +0

    返されるデータを評価する方法を提示してください(保留データあり)。アルピノのコーパスは小さいので、あなたは素晴らしいパフォーマンスを得るつもりはありません。タガーを訓練して目を閉じたままで使用しないでください! – alexis

    +0

    @alexis、http://stackoverflow.com/questions/40144473/do-we-need-to-use-stopwords-filtering-before-pos-tagging/40167059#40167059もう一度。しかし、確かに、私は答えに追加します。) – alvas

    2

    このタガー(https://github.com/evanmiltenburg/Dutch-tagger)を使用すると、dutch文にタグを付けることができます。精度は97%です。

    PerceptronTaggerを使用)例

    from nltk.tag.perceptron import PerceptronTagger 
    
    # This may take a few minutes. (But once loaded, the tagger is really fast!) 
    tagger = PerceptronTagger(load=False) 
    tagger.load('model.perc.dutch_tagger_small.pickle') 
    
    # Tag a sentence. 
    tagger.tag('Alle vogels zijn nesten begonnen , behalve ik en jij .'.split()) 
    

    nltk.pos_tagは、英語のテキストのために訓練された出力

    [('Alle', 'det__indef'), ('vogels', 'nounpl'), ('zijn', 'verbprespl'), ('nesten', 'nounpl'), ('begonnen', 'verbpapa'), (',', 'punc'), ('behalve', 'conjsubo'), ('ik', 'pronpers'), ('en', 'conjcoord'), ('jij', 'pronpers'), ('.', '$.')] 
    
    +1

    Downvote:これは、 OPの試行で何が間違っていたのか、それを修正する方法を説明してください。 – tripleee

    +0

    私はまた、受け入れられた答えに示唆されているように、パーセプトロンタグを使用することを提案しました。申し訳ありませんが、それは有用ではないと思う場合。 –

    +0

    @tripleeeの意味は、リンクが有用だが、Stackoverflowの答えはリンクだけであってはならないということでした。OP(質問の元のポスター)に役立つように、もう少し説明が必要です。 – alvas