2017-03-27 81 views
0

我有一个元组列表,我试图计算元组键数。下面是我的代码:计算NLTK标记语句中(word,pos)元组的POS数量

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)。我如何分解元组键并统计它们?

回答

1

你可以跳过这个的大部分代码。 所有你需要的是:

from nltk.corpus import treebank 
from collections import Counter 

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

变量pos_counts将计算部分的语音每个标签有多少次与令牌任何字出现。

(该_部分发电机表达简单的意思是我们不感兴趣的文字标记,你也可以同样写pos for token, pos in ...,但它是Python中的约定使用_为扔掉的值。)

0

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

但是,如果你需要更复杂一点的东西,当你需要同时检索比对POS /字数其他词+ POS机数量,也许这将有助于:

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

[出]:

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