Supongamos que necesitamos identificar todos los nombres (comunes y propios, en singular y en plural) que existen en una cadena de texto -y supongamos que estamos trabajando con un texto en inglés-.
s = "This isn't a very long sentence but it's full of interesting words"
Podemos extraer fácilmente estos tokens utilizando la librería nltk y la función pos_tag ofrecida por ésta. Para ello vamos a identificar el 'POS' (categoría gramatical) de cada palabra:
import nltk
tags = nltk.pos_tag(nltk.word_tokenize(s))
tags
[('This', 'DT'),
('is', 'VBZ'),
("n't", 'RB'),
('a', 'DT'),
('very', 'RB'),
('long', 'JJ'),
('sentence', 'NN'),
('but', 'CC'),
('it', 'PRP'),
("'s", 'VBZ'),
('full', 'JJ'),
('of', 'IN'),
('interesting', 'JJ'),
('words', 'NNS')]
Ahora extraeremos aquellas cuyo POS pertenezca al conjunto ['NN','NNS', 'NNP', 'NNPS'] (puede obtenerse el listado de tags que se aplican por defecto, el Penn Treebank tagset, en esta web):
nouns = [(word, tag) for word, tag in tags if tag in ['NN','NNS', 'NNP', 'NNPS']]
nouns