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