Saltar al contenido

Manera más rápida de eliminar palabras vacías en Python

Mantén la atención ya que en este post vas a hallar el arreglo que buscas.

Solución:

Intente almacenar en caché el objeto de palabras vacías, como se muestra a continuación. Construir esto cada vez que llamas a la función parece ser el cuello de botella.

    from nltk.corpus import stopwords

    cachedStopWords = stopwords.words("english")

    def testFuncOld():
        text = 'hello bye the the hi'
        text = ' '.join([word for word in text.split() if word not in stopwords.words("english")])

    def testFuncNew():
        text = 'hello bye the the hi'
        text = ' '.join([word for word in text.split() if word not in cachedStopWords])

    if __name__ == "__main__":
        for i in xrange(10000):
            testFuncOld()
            testFuncNew()

Ejecuté esto a través del generador de perfiles: python -m cProfile -s prueba acumulativa.py. Las líneas relevantes se publican a continuación.

Tiempo acumulado de nLlamadas

10000 7.723 palabras.py:7(testFuncOld)

10000 0.140 palabras.py:11(testFuncNew)

Por lo tanto, el almacenamiento en caché de la instancia de palabras vacías proporciona una aceleración de ~70x.

Utilice una expresión regular para eliminar todas las palabras que no coincidan:

import re
pattern = re.compile(r'b(' + r'|'.join(stopwords.words('english')) + r')bs*')
text = pattern.sub('', text)

Esto probablemente será manera más rápido que hacer un bucle, especialmente para cadenas de entrada grandes.

Si esto elimina la última palabra del texto, es posible que tenga un espacio en blanco al final. Propongo manejar esto por separado.

Lo siento por la respuesta tardía. Sería útil para los nuevos usuarios.

  • Cree un diccionario de palabras vacías usando la biblioteca de colecciones
  • Use ese diccionario para una búsqueda muy rápida (tiempo = O (1)) en lugar de hacerlo en la lista (tiempo = O (palabras vacías))

    from collections import Counter
    stop_words = stopwords.words('english')
    stopwords_dict = Counter(stop_words)
    text = ' '.join([word for word in text.split() if word not in stopwords_dict])
    

Puedes añadir valor a nuestra información participando con tu veteranía en los comentarios.

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