es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python | Cuaderno Jupyter – función NLTK lenta al verificación de palabras.

Estoy intentando limpiar mi conjunto de datos usando NLTK, pero tengo algunos problemas, ya que está tardando mucho en completarse. Tengo un conjunto de datos muy grande con más de 20000+ filas de texto.

El código que estoy ejecutando se ve así:

from nltk.corpus import words
nltk.download('words')
gibberishBody = []

for x in bodyStopWords:
    if x in words.words():
        gibberishBody.append(x)

print(gibberishBody)

bodyStopWords es un tipo de datos pandas.core.series.Series.

¿Alguien tiene sugerencias para optimizar el script para velocidad?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas sugerencias para optimizar su script para mejorar la velocidad al usar NLTK para limpiar un gran conjunto de datos:

    1. En lugar de usar el método words.words() en NLTK para verificar si una palabra es válida, puede crear un conjunto de palabras válidas del corpus de NLTK y verificar contra ese conjunto. Esto será más rápido que verificar repetidamente contra una lista de palabras cada vez.
      from nltk.corpus import words
      nltk.download('words')
      
      valid_words = set(words.words())
      gibberishBody = []
      
      for x in bodyStopWords:
          if x in valid_words:
              gibberishBody.append(x)
      print(gibberishBody)
      
    2. Otra manera de optimizar el script es usar la comprensión de lista en lugar de un bucle for. La comprensión de lista es más rápida que los bucles for al iterar sobre grandes conjuntos de datos.
      from nltk.corpus import words
      nltk.download('words')
      
      valid_words = set(words.words())
      gibberishBody = [x for x in bodyStopWords if x in valid_words]
      print(gibberishBody)
      
    3. También puede considerar utilizar el procesamiento paralelo para el script mediante el uso de la biblioteca de procesamiento paralelo de Python. Esto dividirá el conjunto de datos en fragmentos más pequeños y los procesará en paralelo, lo que puede reducir significativamente el tiempo de ejecución para grandes conjuntos de datos.
      from nltk.corpus import words
      from multiprocessing import Pool
      import pandas as pd
      
      nltk.download('words')
      
      valid_words = set(words.words())
      bodyStopWords_chunks = [chunk.tolist() for chunk in np.array_split(bodyStopWords, 8)] # split into 8 chunks
      with Pool(8) as p:
          gibberishBody_chunks = p.map(filter_words, bodyStopWords_chunks) # run filter_words function in parallel
      gibberishBody = pd.concat(gibberishBody_chunks)
      print(gibberishBody)
      
      def filter_words(chunk):
          return pd.Series([x for x in chunk if x in valid_words])
      

      Nota: el número de fragmentos debe corresponder al número de núcleos disponibles en su máquina para un rendimiento óptimo.

Comments are closed.