Python: Как посчитать pos-теги из предложения?

У меня есть код по этой ссылке. Он возвращает POS-теги вместе с номером их появления. Как бы получить код, в котором вместо ввода тега я ввожу предложение, и оно возвращает слова из него и различные теги pos на слово, основанные на корпусе (в данном случае корпус Брауна).

def findtags(tag_prefix, tagged_text):
    cfd = nltk.ConditionalFreqDist((tag, word) for (word, tag) in tagged_text
                                  if tag.startswith(tag_prefix))
    return dict((tag, cfd[tag].keys()[:5]) for tag in cfd.conditions())

tagdictNNS = findtags('NNS', nltk.corpus.brown.tagged_words())

for tag in sorted(tagdictNNS):
    print tag, tagdictNNS[tag]

for k,v in tagdictNNS.items():
        new[k] = len(tagdictNNS[k])

print new

3 ответа

>>>from nltk.tag import pos_tag
>>>from nltk.tokenize import word_tokenize

>>>sent = "This is a foo bar sentence."
>>>text= pos_tag(word_tokenize(sent))
>>>print(text)

>>>from collections import Counter
>>>count= Counter([j for i,j in pos_tag(word_tokenize(sent))])
>>>print (count)

Если это на английском, вы можете попробовать это:

>>> from nltk.tag import pos_tag
>>> from nltk.tokenize import word_tokenize
>>> sent = "This is a foo bar sentence."
>>> pos_tag(word_tokenize(sent))
[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('foo', 'NN'), ('bar', 'NN'), ('sentence', 'NN'), ('.', '.')]
>>> from collections import Counter
>>> Counter([j for i,j in pos_tag(word_tokenize(sent))])
Counter({'NN': 3, 'DT': 2, 'VBZ': 1, '.': 1})

NLTK имеет встроенный модуль для токенизации слов (nltk.tokenize.word_tokenize и маркировка POS (nltk.tag.pos_tag), который использует теги Penn Treebank. Затем вы можете просто ввести список pos-тегов из тегового предложения в Counter,

Если вы хотите сгруппировать пунктуацию в одном PUNCT тег, вы можете попробовать это:

>>> import string
>>> Counter([k if k not in string.punctuation else "PUNCT" for k in [j for i,j in pos_tag(word_tokenize(sent))]])
Counter({'NN': 3, 'DT': 2, 'VBZ': 1, 'PUNCT': 1})

В документации есть пример (в самом низу страницы), который может быть актуален:

nltk.tag определяет несколько тегеров, которые берут список токенов (обычно это предложение), назначают тег каждому токену и возвращают итоговый список маркированных токенов. Большинство тегеров создаются автоматически на основе учебного корпуса. Например, UnigramTagger помечает каждое слово w, проверяя, какой самый частый тег для w был в учебном корпусе:

from nltk.corpus import brown
from nltk.tag import UnigramTagger
tagger = UnigramTagger(brown.tagged_sents(categories='news')[:500])
sent = ['Mitchell', 'decried', 'the', 'high', 'rate', 'of', 'unemployment']
for word, tag in tagger.tag(sent):
    print(word, '->', tag)

Который дает:

Mitchell -> NP
decried -> None
the -> AT
high -> JJ
rate -> NN
of -> IN
unemployment -> None
Другие вопросы по тегам