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.

Como traductor de español especializado en documentos de tecnología de la información, estoy aquí para ayudarte. ¿Podrías proporcionarme el texto que deseas traducir y las palabras fuera de vocabulario que necesitas traducir? Estoy listo para ayudarte con cualquier traducción que necesites.

Tengo algunos textos en un pandas dataframe df['mytext']. También tengo un vocabulario vocab (lista de palabras).

Estoy intentando enumerar y contar las palabras que no están en el vocabulario para cada documento.

He intentado lo siguiente, pero es bastante lento para 10k documentos.

¿Cómo cuantificar de manera rápida y eficiente los tokens fuera del vocabulario en una colección de textos en pandas?

OOV_text = df['mytext'].apply(lambda s: ' '.join([word for word in s.split() if (word not in vocab)]))
OOV = df['mytext'].apply(lambda s: sum([(word in vocab) for word in s.split()]) / len(s.split()))

df.shape[0] es bastante grande
len(vocab) es grande
len(palabras únicas en df.mytext) << len(vocab)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de cuantificar rápidamente y eficientemente los tokens fuera del vocabulario en una colección de textos en pandas es utilizando operaciones de conjuntos. Primero, convierte la lista de vocabulario en un conjunto para una verificación de pertenencia más rápida. Luego, divide cada texto en palabras y conviértelas en un conjunto. Finalmente, calcula la intersección del conjunto de vocabulario y el conjunto de palabras del texto para obtener el conjunto de palabras en el vocabulario y réstalo del conjunto de palabras del texto para obtener el conjunto de palabras fuera del vocabulario. Luego puedes contar el número de palabras fuera del vocabulario y dividirlo por el número total de palabras para obtener la proporción de palabras fuera del vocabulario.

    Aquí tienes un ejemplo de implementación:

    vocab_set = set(vocab)
    
    def count_oov_words(text):
        words = set(text.split())
        oov_words = words - vocab_set
        return len(oov_words)
    
    df['oov_count'] = df['mytext'].apply(count_oov_words)
    df['oov_ratio'] = df['oov_count'] / df['mytext'].str.split().apply(len)
    

    Esto debería ser más rápido que el enfoque anterior, ya que la intersección y la resta de conjuntos son operaciones muy rápidas, y solo estamos iterando sobre las palabras de cada texto una vez. Ten en cuenta que esto asume que los textos son relativamente cortos (es decir, no libros completos o documentos) y que el vocabulario es razonablemente pequeño en comparación con el número de palabras únicas en los textos.

Comments are closed.