2016-10-24 3 views
0

Я начинаю с NLTK и хочу отметить голландское предложение, но у меня возникают проблемы с указанием корпуса.NLTK tag Голландское предложение

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

по умолчанию nltk.pos_tag был обучен для английского текста, вы должны обучить новый Tagger на alpino корпус катиться ваш собственный голландский теггер.

Но обратите внимание, что модель будет столь же хороша, как:

  • какие данные он обучается на
  • , какой алгоритм он тренировался с

От UnigramTagger и BigramTagger Например:

>>> 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 в производстве.


EDITED

Чтобы оценить Tagger, вы можете дотягивает 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:] 

Затем используйте функцию tagger.evaluate(), чтобы получить точность, вход для функции .evaluate() является то же, что и вход для функции .train(), то есть список предложений, и каждое предложение представляет собой список из ('word', 'tag') кортежей:

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

Спасибо за полный пример! – Stereo

+0

Просьба продлить ваш ответ, чтобы показать, как оценить полученный теггер (с данными с выдержкой). Корпус alpino крошечный, поэтому вы не получите отличную производительность. Не просто тренируйте теггер и используйте его с закрытыми глазами! – alexis

+0

@alexis, это снова http://stackoverflow.com/questions/40144473/do-we-need-to-use-stopwords-filtering-before-pos-tagging/40167059#40167059. Но, конечно, я добавлю к ответу =) – alvas

2

Вы можете использовать этот tagger (https://github.com/evanmiltenburg/Dutch-tagger), чтобы пометить голландские предложения. Точность составляет 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()) 

Выход

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

Downvote: This doesn ' t объясните, что было не так в попытке OP или как исправить это. – tripleee

+0

Я также предложил использовать персептрон-теггер, как это было предложено в принятом ответе. Извините, если вы считаете, что это не помогло. –

+0

Я думаю, что значение @tripleee было связано с тем, что ссылка полезна, но ответ на Stackoverflow не должен быть только ссылкой.Это требует немного большего объяснения, так что оно помогает OP (оригинальный плакат вопроса). – alvas