Saltar al contenido

Extraer todos los sustantivos de un archivo de texto usando nltk

No olvides que en la informática un problema puede tener varias resoluciones, así que nosotros enseñaremos lo más óptimo y mejor.

Solución:

Si está abierto a otras opciones además de NLTKverificar TextBlob. Extrae todos los sustantivos y frases nominales fácilmente:

>>> from textblob import TextBlob
>>> txt = """Natural language processing (NLP) is a field of computer science, artificial intelligence, and computational linguistics concerned with the inter
actions between computers and human (natural) languages."""
>>> blob = TextBlob(txt)
>>> print(blob.noun_phrases)
[u'natural language processing', 'nlp', u'computer science', u'artificial intelligence', u'computational linguistics']

import nltk

lines = 'lines is some string of words'
# function to test if something is a noun
is_noun = lambda pos: pos[:2] == 'NN'
# do the nlp stuff
tokenized = nltk.word_tokenize(lines)
nouns = [word for (word, pos) in nltk.pos_tag(tokenized) if is_noun(pos)] 

print nouns
>>> ['lines', 'string', 'words']

Consejo útil: suele ocurrir que las listas por comprensión son un método más rápido para crear una lista que agregar elementos a una lista con el método .insert() o append(), dentro de un bucle ‘for’.

Puede lograr buenos resultados usando nltk, Textblob, SpaCy o cualquiera de las muchas otras bibliotecas que existen. Todas estas bibliotecas harán el trabajo pero con diferentes grados de eficiencia.

import nltk
from textblob import TextBlob
import spacy
nlp = spacy.load('en')
nlp1 = spacy.load('en_core_web_lg')

txt = """Natural language processing (NLP) is a field of computer science, artificial intelligence, and computational linguistics concerned with the interactions between computers and human (natural) languages."""

En mi Windows 10 2 núcleos, 4 procesadores, 8 GB de RAM i5 caballos de fuerza portátil, en jupyter notebook, realicé algunas comparaciones y aquí están los resultados.

Para TextBlob:

%%time
print([w for (w, pos) in TextBlob(txt).pos_tags if pos[0] == 'N'])

Y la salida es

>>> ['language', 'processing', 'NLP', 'field', 'computer', 'science', 'intelligence', 'linguistics', 'inter', 'actions', 'computers', 'languages']
    Wall time: 8.01 ms #average over 20 iterations

Para nltk:

%%time
print([word for (word, pos) in nltk.pos_tag(nltk.word_tokenize(txt)) if pos[0] == 'N'])

Y la salida es

>>> ['language', 'processing', 'NLP', 'field', 'computer', 'science', 'intelligence', 'linguistics', 'inter', 'actions', 'computers', 'languages']
    Wall time: 7.09 ms #average over 20 iterations

Para espacio:

%%time
print([ent.text for ent in nlp(txt) if ent.pos_ == 'NOUN'])

Y la salida es

>>> ['language', 'processing', 'field', 'computer', 'science', 'intelligence', 'linguistics', 'inter', 'actions', 'computers', 'languages']
    Wall time: 30.19 ms #average over 20 iterations

Parece nltk y TextBlob son razonablemente más rápidos y esto es de esperar ya que no almacenan nada más sobre el texto de entrada, txt. Spacy es mucho más lento. Una cosa más. SpaCy se perdió el sustantivo NLP tiempo nltk y TextBlob Entendido. dispararía por nltk o TextBlob a menos que haya algo más que desee extraer de la entrada txt.

Echa un vistazo a un inicio rápido en spacy aquí.

Echa un vistazo a algunos conceptos básicos sobre TextBlob aquí.
Verificar nltk Instrucciones aquí

Puedes amparar nuestra faena poniendo un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *