2016-10-24 4 views
0

Ich beginne mit NLTK und möchte einen holländischen Satz markieren, aber ich habe Schwierigkeiten, den Korpus anzugeben.NLTK-Tag Niederländischer Satz

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

gibt,

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

So klar ich bin nicht das Corpus korrekt angeben. Ich habe den Alpinokorpus heruntergeladen. Kann mir jemand helfen, herauszufinden, wie man den Korpus korrekt spezifiziert?

+1

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

Antwort

3

Der Standard nltk.pos_tag für englischen Text ausgebildet wurde, würden Sie einen neuen Tagger auf dem alpino corpus trainieren müssen, um rollen Sie Ihre eigener niederländischer Tagger.

Aber beachten Sie, dass das Modell so gut sein wird wie:

  • welche Daten es auf
  • trainiert wird, der Algorithmus mit

Von UnigramTagger und BigramTagger Beispiel trainiert wird:

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

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

Wie @WasiAhmed erwähnt, dies ist ein weiteres gutes Beispiel: https://github.com/evanmiltenburg/Dutch-tagger und als @evanmiltenburg auf der GitHub angegeben, versucht, eine schnellere taggger in der Produktion zu verwenden.


EDITED

einen Tagger zu bewerten, können Sie ein test_set als solches durchhalten:

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

dann die tagger.evaluate() Funktion verwenden, um die Genauigkeit zu erhalten, der Eingang für die .evaluate() Funktion ist das gleiche wie die Eingabe für die .train() Funktion, dh eine Liste von Satz, und jeder Satz ist eine Liste von ('word', 'tag') Tupel:

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

Danke für das komplette Beispiel! – Stereo

+0

Bitte erweitern Sie Ihre Antwort, um zu zeigen, wie Sie den resultierenden Tagger (mit ausgeblendeten Daten) auswerten können. Der Alpinokorpus ist winzig, also wirst du keine großartige Leistung bekommen. Trainiere nicht einfach einen Tagger und benutze ihn mit geschlossenen Augen! – alexis

+0

@alexis, es ist http://stackoverflow.com/questions/40144473/do-we-need-to-use-stopwords-filtering-before-pos-tagging/40167059#40167059 wieder. Aber sicher, ich werde zu der Antwort hinzufügen =) – alvas

2

Sie können diesen Tagger (https://github.com/evanmiltenburg/Dutch-tagger) verwenden, um holländische Sätze zu markieren. Die Genauigkeit beträgt 97%.

Beispiel (mit 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()) 

Ausgabe

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

Downvote: Dies tut nicht Ich erkläre, was bei dem Versuch des OPs falsch war oder wie es behoben werden kann. – tripleee

+0

Ich habe auch vorgeschlagen, den Perceptron-Tagger zu verwenden, wie in der akzeptierten Antwort vorgeschlagen. Tut mir leid, wenn Sie denken, dass es nicht hilfreich war. –

+0

Ich denke, was @tripleee bedeutete, war, dass der Link hilfreich ist, aber eine Antwort auf Stackoverflow sollte nicht nur Link sein.Es braucht ein wenig mehr Erklärung, damit es dem OP hilft (Originalposter der Frage). – alvas