2012-05-20 46 views
15

Tengo varios textos y me gustaría crear perfiles de ellos basados ​​en su uso de varias partes del discurso, como sustantivos y verbos. Básicamente, necesito contar cuántas veces se usa cada parte del discurso.Contar verbos, sustantivos y otras partes del discurso con python's NLTK

me han etiquetado el texto pero no estoy seguro de cómo ir más allá:

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

¿Cómo puedo guardar los recuentos para cada parte de la oración en una variable?

+0

¿Se ha encontrado el 'collections.Counter'? – katrielalex

Respuesta

26

El método pos_tag le devuelve una lista de pares (token, etiqueta):

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

Si está utilizando Python 2.7 o posterior, a continuación, puede hacerlo simplemente con:

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

Para normalizar las cuentas (que le da la proporción de cada uno) hacer:

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

Tenga en cuenta que en versiones anteriores de Python, que tendrá que poner en práctica Counter mismo:

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

Eso es absolutamente increíble, gracias. Estoy usando Python 2.7. ¿Hay alguna forma de que ahora pueda determinar qué proporción del texto etiquetado usa cada parte del discurso? Por ejemplo, dividiendo el número de sustantivos por el total de etiquetas y multiplicando por 100 (para obtener un porcentaje) ... ¿pero haciendo eso para todo? Así que obtenga resultados como: 23% de sustantivos, 14% de verbos, etc. – Zach

+0

@Zach, he agregado algo sobre normalizar los recuentos para usted. – dhg

+0

@dgh, gracias, funciona genial. Una última pregunta, ¿sabes qué conjunto de etiquetas usa nltk.pos_tag()? p.ej. Brown, Penn Treebank, etc.? – Zach

Cuestiones relacionadas