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.

¿Cómo escribir este código más rápido para eliminar palabras vacías en Python?

Tengo una función “remove_stopwords” como esta. ¿Cómo puedo hacer que se ejecute más rápido?

temp.reverse()

def drop_stopwords(text):

for x in temp:
elif len(x.split()) > 1:
text_list = text.split()
for y in range(len(text_list)-len(x.split())):
if ” “.join(text_list[y:y+len(x.split())]) == x:
del text_list[y:y+len(x.split())]
text = ” “.join(text_list)

else:
    text = " ".join(text for text in text.split() if text not in vietnamese)

return text

El tiempo que tarda en resolver un texto en mis datos es de 14 segundos y si tengo algún truco como este, el tiempo se reducirá a 3 segundos:

temp.reverse()

def drop_stopwords(text):

for x in temp:
if len(x.split()) > 2:
if x in text:
text = text.replace(x,”)

elif len(x.split()) > 1:
    text_list = text.split()  
    for y in range(len(text_list)-len(x.split())):
        if " ".join(text_list[y:y+len(x.split())]) == x:
            del text_list[y:y+len(x.split())]
            text = " ".join(text_list)

else:
    text = " ".join(text for text in text.split() if text not in vietnamese)

return text

Pero creo que podría haber algún error en mi idioma. ¿Cómo puedo reescribir esta función en Python para que sea más rápida (en C y C++ puedo resolverlo fácilmente con la función anterior :(( )

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay varias formas de optimizar la función remove_stopwords en Python:

    1. Utilizar un conjunto en lugar de una lista para temp y vietnamese para acelerar las pruebas de membresía.
    2. En lugar de iterar a través de temp para cada texto de entrada, preprocesar temp para agrupar las palabras de parada por longitud y solo iterar a través del grupo relevante para cada texto.
    3. Mantener un registro de las palabras de parada que ya han sido eliminadas del texto de entrada para evitar reemplazos innecesarios.

    Aquí tienes una versión actualizada de la función que incorpora estas optimizaciones:

    from collections import defaultdict
    
    temp_set = set(temp)
    vietnamese_set = set(vietnamese)
    temp_dict = defaultdict(list)
    for word in temp_set:
        temp_dict[len(word.split())].append(word)
    
    def remove_stopwords(text):
        removed = set()
        text_list = text.split()
        i = 0
        while i < len(text_list):
            word = text_list[i]
            if word in vietnamese_set:
                i += 1
            elif word in temp_set and word not in removed:
                length = len(word.split())
                if length == 1:
                    removed.add(word)
                    del text_list[i]
                else:
                    for j in range(i + 1, len(text_list) - length + 1):
                        phrase = " ".join(text_list[j:j+length])
                        if phrase == word:
                            removed.update(temp_dict[length])
                            del text_list[i:j+length]
                            i -= 1
                            break
                    else:
                        i += 1
            else:
                i += 1
        return " ".join(text_list)
    

    La función mantiene un conjunto llamado removed para realizar un seguimiento de las palabras de parada que ya se han eliminado del texto de entrada actual. También agrupa las palabras de parada en temp_dict según su longitud para evitar iterar a través de temp para cada texto. El bucle while itera a través de cada palabra en el texto de entrada y decide si se debe eliminar basándose en su membresía en vietnamese_set o temp_set, así como si ya ha sido eliminada. Si se encuentra una palabra de parada con una longitud > 1, el bucle busca una frase coincidente a partir de la siguiente palabra y elimina todas las palabras de parada con la misma longitud en caso de una coincidencia exitosa.

    Estas optimizaciones deberían ayudar a mejorar el rendimiento de la función, pero como siempre, es importante probarla en datos representativos para garantizar la corrección y medir la mejora real de velocidad.

Comments are closed.