计算NLTK标记句子

时间:2017-03-27 04:30:43

标签: python-2.7 nlp nltk counter pos-tagger

我有一个元组列表,我正在尝试计算元组的键数。以下是我的代码:

import nltk
from nltk.corpus import treebank
from collections import Counter

# print treebank.fileids()
treebank_raw = list(treebank.tagged_sents()) ##treebank_raw is a list of list (of tuples)                        

treebank_flipped = []
treebank_flipped_counter = Counter()
for sent in treebank_raw:
    flipped = {b : a.lower() for a, b in sent}
    treebank_flipped_counter.update(flipped.items())   

如果我要计算u'VBD的数量,print treebank_flipped_count显示以下是所有独立的案例,而实际上我想要将它们统计在一起。

(u'VBD', u'said'): 405
(u'VBD', u'was'): 264
(u'VBD', u'were'): 138

所以u'VBD':( 405 + 264 + 138)。如何解散元组的键并完全统计它们?

2 个答案:

答案 0 :(得分:1)

您可以跳过大部分代码。 您所需要的只是:

from nltk.corpus import treebank
from collections import Counter

pos_counts = Counter(pos for _, pos in treebank.tagged_sents())

变量pos_counts将计算每个词性标记与任何单词标记出现的次数。

(生成器表达式中的_部分只是意味着我们对单词token不感兴趣。你也可以写pos for token, pos in ...,但是在Python中使用{{1抛弃值。)

答案 1 :(得分:0)

@lenz回答使用计数器和列表理解是好的。

但如果你需要一些更复杂的东西,尤其是当你需要检索除pos / word计数之外的单词+ pos计数时,也许这会有所帮助:

from collections import Counter, defaultdict
corpus_counts = defaultdict(Counter)
for word, pos in treebank.tagged_sents():
    corpus_counts[pos][word] +=1

[OUT]:

>>> corpus_counts['NNPS']
Counter({u'Securities': 16, u'Containers': 16, u'Industries': 12, u'Materials': 10, u'Soviets': 8, u'Americans': 6, u'Associates': 5, u'Airlines': 5, u'Savings': 5, u'Motors': 5, u'States': 5, u'Democrats': 5, u'Systems': 4, u'Markets': 4, u'Resources': 4, u'Services': 4, u'Travelers': 4, u'Communications': 4, u'Stores': 3, u'Investors': 3, u'Partners': 3, u'Giants': 3, u'Machines': 3, u'Brothers': 3, u'Philippines': 3, u'Issues': 3, u'Friends': 3, u'Messrs.': 2, u'Laboratories': 2, u'Engineers': 2, u'Futures': 2, u'Burgundies': 2, u'Islands': 2, u'Options': 2, u'Cabernets': 2, u'Nations': 2, u'Instruments': 2, u'Writers': 2, u'Dealers': 2, u'Institutes': 2, u'ADRs': 2, u'Contras': 2, u'Lakes': 1, u'Tots': 1, u'BILLS': 1, u'Manufacturers': 1, u'Republicans': 1, u'Journals': 1, u'Netherlands': 1, u'Notes': 1, u'Products': 1, u'Underwoods': 1, u'Operations': 1, u'ASSETS': 1, u'Facilities': 1, u'Foods': 1, u'Preferences': 1, u'Holdings': 1, u'BRIEFS': 1, u'Dakotas': 1, u'Plains': 1, u'Toys': 1, u'Lawyers': 1, u'Utilities': 1, u'Monopolies': 1, u'Chardonnays': 1, u'Inns': 1, u'Charities': 1, u'Parkinson': 1, u'Fundamentalists': 1, u'Centers': 1, u'Bridges': 1, u'Yorkers': 1, u'SOYBEANS': 1, u'Pictures': 1, u'Rieslings': 1, u'F-series': 1, u'ASSOCIATES': 1, u'RATES': 1, u'Lawmakers': 1, u'Contracts': 1, u'Investments': 1, u'Dolphins': 1, u'Appropriations': 1, u'Mergers': 1, u'Productions': 1, u'Virginians': 1, u'Works': 1, u'Donuts': 1, u'Angels': 1, u'Asians': 1, u'GRAINS': 1, u'Airways': 1, u'Elders': 1, u'Delegates': 1, u'Germans': 1, u'Articles': 1, u'Lines': 1, u'METALS': 1, u'Publications': 1, u'Mercedes': 1, u'Craftsmen': 1, u'Builders': 1, u'Appeals': 1, u'Bricklayers': 1, u'FUNDS': 1, u'Springs': 1})

# Count of `Securities|NNPS`:
>>> corpus_counts['NNPS']['Securities']
16

# Count of all `NNPS`:
>>> sum(corpus_counts['NNPS'].values())