Python:如何从句子中计算pos标签?

时间:2014-01-06 22:48:29

标签: python nlp nltk tagging

我有来自link的代码。它返回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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果是英文版,你可以试试这个:

>>> 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有一个使用Penn Treebank标签的word tokenizationnltk.tokenize.word_tokenizePOS taggingnltk.tag.pos_tag)的内置模块。然后您只需输入列表将标记句子中的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})

答案 2 :(得分:0)

the documentation(页面底部附近)有一个例子可能是相关的:

  

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