2015-07-10 2 views
1

Давайте попробуем отредактированный теггер части речи на Python в пакете nltk.Провоцируйте теггер частичной речи NLTK, чтобы сообщить о множественном правильном существительном

import nltk 
# You might also need to run nltk.download('maxent_treebank_pos_tagger') 
# even after installing nltk 

string = 'Buddy Billy went to the moon and came Back with several Vikings.' 
nltk.pos_tag(nltk.word_tokenize(string)) 

Это дает мне

[('Buddy', 'ННП'), ('Билли', 'ННП'), ('пошел', 'ДДК'), ('к '', 'TO'), ('the', 'DT'), ('moon', 'NN'), ('and', 'CC'), ('come', 'VBD'), («Назад», «NNP»), ('с', 'IN'), ('несколько', 'JJ'), ('Vikings', 'NNS'), ('.', '.')]]

Вы можете толковать коды here. Я немного разочарован тем, что «Назад» классифицировалось как собственное имя (NNP), хотя путаница понятна. Я больше расстроен тем, что «викинги» называются простым множественным существительным (NNS) вместо множественного собственного существительного (NNPS). Может ли кто-нибудь придумать один пример краткого ввода, который приведет к по меньшей мере одному тегу NNPS?

ответ

0

Там, кажется, некоторые проблемы с тегами в NLTK бурой корпус, что теги NNPS как NPS (Возможно, множество ярлыков NLTK является обновленными/устаревшими тегами, которые отличаются от https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html)

Вот пример plural proper nouns:

>>> from nltk.corpus import brown 
>>> for sent in brown.tagged_sents(): 
...  if any(pos for word, pos in sent if pos == 'NPS'): 
...    print sent 
...    break 
... 
[(u'Georgia', u'NP'), (u'Republicans', u'NPS'), (u'are', u'BER'), (u'getting', u'VBG'), (u'strong', u'JJ'), (u'encouragement', u'NN'), (u'to', u'TO'), (u'enter', u'VB'), (u'a', u'AT'), (u'candidate', u'NN'), (u'in', u'IN'), (u'the', u'AT'), (u'1962', u'CD'), (u"governor's", u'NN$'), (u'race', u'NN'), (u',', u','), (u'a', u'AT'), (u'top', u'JJS'), (u'official', u'NN'), (u'said', u'VBD'), (u'Wednesday', u'NR'), (u'.', u'.')] 

Но если вы помечать с nltk.pos_tag, вы получите NNPS:

>>> for sent in brown.tagged_sents(): 
...  if any(pos for word, pos in sent if pos == 'NPS'): 
...    print " ".join([word for word, pos in sent]) 
...    break 
... 
Georgia Republicans are getting strong encouragement to enter a candidate in the 1962 governor's race , a top official said Wednesday . 
>>> from nltk import pos_tag 
>>> pos_tag("Georgia Republicans are getting strong encouragement to enter a candidate in the 1962 governor's race , a top official said Wednesday .".split()) 
[('Georgia', 'NNP'), ('Republicans', 'NNPS'), ('are', 'VBP'), ('getting', 'VBG'), ('strong', 'JJ'), ('encouragement', 'NN'), ('to', 'TO'), ('enter', 'VB'), ('a', 'DT'), ('candidate', 'NN'), ('in', 'IN'), ('the', 'DT'), ('1962', 'CD'), ("governor's", 'NNS'), ('race', 'NN'), (',', ','), ('a', 'DT'), ('top', 'JJ'), ('official', 'NN'), ('said', 'VBD'), ('Wednesday', 'NNP'), ('.', '.')] 
+0

Я проверил, что вход «Georgia Republicans are ...» успешно провоцирует тег «NNPS». – zkurtz

+0

К вашему вопросу, «Кажется, есть некоторые проблемы с тегами ...», я не удивлен, что теги, возвращаемые тегом «brown» (http://www.comp.leeds.ac.uk/ccalas/ tagsets/brown.html) отличаются от тегов, созданных 'nltk.pos_tag', поскольку последний основан на Penn Treebank corpus, который использует совершенно другой набор тегов (http://cs.nyu.edu/grishman/jet/ руководство/PennPOS.html) – zkurtz