2012-05-20 16 views
15

Ho più testi e vorrei creare profili di essi in base al loro utilizzo di varie parti del discorso, come nomi e verbi. Fondamentalmente, ho bisogno di contare quante volte ogni parte del discorso è usata.Conta verbi, nomi e altre parti del parlato con NLTK di Python

mi hanno taggato il testo, ma non sono sicuro di come andare oltre:

tokens = nltk.word_tokenize(text.lower()) 
text = nltk.Text(tokens) 
tags = nltk.pos_tag(text) 

Come posso risparmiare i conteggi per ogni parte del discorso in una variabile?

+0

Ti sei imbattuto in 'collections.Counter'? – katrielalex

risposta

26

Il metodo pos_tag ti restituisce una lista di coppie (Token, tag):

tagged = [('the', 'DT'), ('dog', 'NN'), ('sees', 'VB'), ('the', 'DT'), ('cat', 'NN')] 

Se si sta utilizzando Python 2.7 o successivo, allora si può fare semplicemente con:

>>> from collections import Counter 
>>> counts = Counter(tag for word,tag in tagged) 
>>> counts 
Counter({'DT': 2, 'NN': 2, 'VB': 1}) 

Per normalizzare i conteggi (che danno la proporzione di ciascun) dO:

>>> total = sum(counts.values()) 
>>> dict((word, float(count)/total) for word,count in counts.items()) 
{'DT': 0.4, 'VB': 0.2, 'NN': 0.4} 

si noti che nelle versioni precedenti di Python, dovrai implementare lo stesso Counter:

>>> from collections import defaultdict 
>>> counts = defaultdict(int) 
>>> for word, tag in tagged: 
... counts[tag] += 1 

>>> counts 
defaultdict(<type 'int'>, {'DT': 2, 'VB': 1, 'NN': 2}) 
+0

Questo è assolutamente incredibile, grazie. Sto usando Python 2.7. C'è un modo per capire quale proporzione del testo taggato usi ogni parte del discorso? Ad esempio, dividendo il numero di nomi per i tag totali e moltiplicando per 100 (per ottenere una percentuale) ... ma facendo ciò per tutto? Quindi ottieni risultati come: nomi del 23%, verbi del 14% e così via? – Zach

+0

@Zach, ho aggiunto qualcosa sulla normalizzazione dei conteggi per te. – dhg

+0

@dgh, grazie funziona alla grande. Un'ultima domanda, sai quale set di tag è usato da nltk.pos_tag()? per esempio. Brown, Penn Treebank, ecc.? – Zach