Resumir textos con NLTK en Python

    Introducción

    Mientras escribo este artículo, 1.907.223.370 sitios web están activos en Internet y se envían 2.722.460 correos electrónicos por segundo. Ésta es una cantidad increíblemente enorme de datos. Es imposible para un usuario obtener información a partir de volúmenes tan grandes de datos. Además, una gran parte de estos datos es redundante o no contiene mucha información útil. La forma más eficiente de acceder a las partes más importantes de los datos, sin tener que examinar datos redundantes e insignificantes, es resumir los datos de manera que solo contengan información útil y no redundante. Los datos pueden estar en cualquier forma, como audio, video, imágenes y texto. En este artículo, veremos cómo podemos utilizar técnicas de resumen de texto automático para resumir datos de texto.

    El resumen de texto es un subdominio del procesamiento del lenguaje natural (PNL) que se ocupa de extraer resúmenes de grandes cantidades de textos. Hay dos tipos principales de técnicas que se utilizan para el resumen de texto: técnicas basadas en PNL y técnicas basadas en aprendizaje profundo. En este artículo, veremos una técnica simple basada en PNL para resumir textos. No usaremos ninguna biblioteca de aprendizaje automático en este artículo. Más bien, simplemente usaremos la biblioteca NLTK de Python para resumir los artículos de Wikipedia.

    Pasos para el resumen de texto

    Explicaré los pasos involucrados en el resumen de texto usando técnicas de PNL con la ayuda de un ejemplo.

    El siguiente es un párrafo de uno de los famosos discursos de Denzel Washington en los 48th NAACP Image Awards:

    Así que sigue trabajando. Sigue esforzándote. Nunca te rindas. Cáete siete veces, levántate ocho. La facilidad es una mayor amenaza para el progreso que las dificultades. La facilidad es una mayor amenaza para el progreso que las dificultades. Entonces, sigue moviéndote, sigue creciendo, sigue aprendiendo. Nos vemos en el trabajo.

    Podemos ver en el párrafo anterior que básicamente está motivando a otros a trabajar duro y nunca darse por vencidos. Para resumir el párrafo anterior utilizando técnicas basadas en PNL, debemos seguir una serie de pasos, que se describirán en las siguientes secciones.

    Convertir párrafos en oraciones

    Primero debemos convertir todo el párrafo en oraciones. La forma más común de convertir párrafos en oraciones es dividir el párrafo cada vez que se encuentra un punto. Entonces, si dividimos el párrafo en discusión en oraciones, obtenemos las siguientes oraciones:

    • Así que sigue trabajando
    • Sigue esforzándote
    • Nunca te rindas
    • Cáete siete veces, levántate ocho
    • La facilidad es una mayor amenaza para el progreso que las dificultades
    • La facilidad es una mayor amenaza para el progreso que las dificultades
    • Entonces, sigue moviéndote, sigue creciendo, sigue aprendiendo
    • Te veo en el trabajo

    Preprocesamiento de texto

    Después de convertir el párrafo en oraciones, debemos eliminar todos los caracteres especiales, detener palabras y números de todas las oraciones. Después del preprocesamiento, obtenemos las siguientes oraciones:

    • sigue trabajando
    • sigue esforzándote
    • nunca dar
    • caer siete veces conseguir ocho
    • aliviar las mayores dificultades de progreso de amenazas
    • aliviar las mayores dificultades de progreso de amenazas
    • sigue moviéndote sigue creciendo sigue aprendiendo
    • ver trabajo

    Tokenizando las sentencias

    Necesitamos tokenizar todas las oraciones para obtener todas las palabras que existen en las oraciones. Después de tokenizar las oraciones, obtenemos una lista de las siguientes palabras:

    ['keep',
     'working',
     'keep',
     'striving',
     'never',
     'give',
     'fall',
     'seven',
     'time',
     'get',
     'eight',
     'ease',
     'greater',
     'threat',
     'progress',
     'hardship',
     'ease',
     'greater',
     'threat',
     'progress',
     'hardship',
     'keep',
     'moving',
     'keep',
     'growing',
     'keep',
     'learning',
     'see',
     'work']
    

    Encuentre la frecuencia ponderada de ocurrencia

    A continuación, debemos encontrar la frecuencia ponderada de apariciones de todas las palabras. Podemos encontrar la frecuencia ponderada de cada palabra dividiendo su frecuencia por la frecuencia de la palabra más frecuente. La siguiente tabla contiene las frecuencias ponderadas para cada palabra:

    Frecuencia de palabras Frecuencia ponderada

    facilitar20.40
    ocho10.20
    otoño10.20
    obtener10.20
    dar10.20
    mayor20.40
    creciente10.20
    privación20.40
    mantener51.00
    aprendizaje10.20
    Moviente10.20
    Nunca10.20
    Progreso20.40
    ver10.20
    Siete10.20
    esforzarse10.20
    amenaza20.40
    hora10.20
    trabajo10.20
    trabajando10.20

    Dado que la palabra “mantener” tiene la frecuencia más alta de 5, por lo tanto, la frecuencia ponderada de todas las palabras se ha calculado dividiendo su número de ocurrencias por 5.

    Reemplazar palabras por frecuencia ponderada en oraciones originales

    El paso final es reemplazar la frecuencia ponderada en lugar de las palabras correspondientes en las oraciones originales y encontrar su suma. Es importante mencionar que la frecuencia ponderada para las palabras eliminadas durante el preprocesamiento (palabras vacías, puntuación, dígitos, etc.) será cero y, por lo tanto, no es necesario agregarlas, como se menciona a continuación:

    Suma de frases de frecuencias ponderadas

    Así que sigue trabajando1 + 0.20 = 1.20
    Sigue esforzándote1 + 0.20 = 1.20
    Nunca te rindas0.20 + 0.20 = 0.40
    Cáete siete veces, levántate ocho0.20 + 0.20 + 0.20 + 0.20 + 0.20 = 1.0
    La facilidad es una mayor amenaza para el progreso que las dificultades0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0
    La facilidad es una mayor amenaza para el progreso que las dificultades0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0
    Entonces, sigue moviéndote, sigue creciendo, sigue aprendiendo1 + 0.20 + 1 + 0.20 + 1 + 0.20 = 3.60
    Te veo en el trabajo0.20 + 0.20 = 0.40

    Ordenar oraciones en orden descendente de suma

    El paso final es ordenar las oraciones en orden inverso a su suma. Las frases con mayor frecuencia resumen el texto. Por ejemplo, observe la oración con la suma más alta de frecuencias ponderadas:

    Entonces, sigue moviéndote, sigue creciendo, sigue aprendiendo

    Puede juzgar fácilmente de qué trata el párrafo. De manera similar, puede agregar la oración con la segunda suma más alta de frecuencias ponderadas para tener un resumen más informativo. Eche un vistazo a las siguientes frases:

    Entonces, sigue moviéndote, sigue creciendo, sigue aprendiendo. La facilidad es una mayor amenaza para el progreso que las dificultades.

    Estas dos oraciones dan un resumen bastante bueno de lo que se dijo en el párrafo.

    Resumen de artículos de Wikipedia

    Ahora sabemos cómo funciona el proceso de resumen de texto utilizando una técnica de PNL muy simple. En esta sección, usaremos la biblioteca NLTK de Python para resumir un artículo de Wikipedia.

    Obtener artículos de Wikipedia

    Antes de que podamos resumir los artículos de Wikipedia, debemos buscarlos en la web. Para ello usaremos un par de bibliotecas. La primera biblioteca que necesitamos descargar es la hermosa sopa, que es una utilidad de Python muy útil para el raspado web. Ejecute el siguiente comando en el símbolo del sistema para descargar la utilidad Beautiful Soup.

    $ pip install beautifulsoup4
    

    Otra biblioteca importante que necesitamos para analizar XML y HTML es la biblioteca lxml . Ejecute el siguiente comando en el símbolo del sistema para descargar lxml:

    $ pip install lxml
    

    Ahora permite que un poco de código Python extraiga datos de la web. El artículo que vamos a raspar es el artículo de Wikipedia sobre Inteligencia Artificial . Ejecute el siguiente script:

    import bs4 as bs
    import urllib.request
    import re
    
    scraped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')
    article = scraped_data.read()
    
    parsed_article = bs.BeautifulSoup(article,'lxml')
    
    paragraphs = parsed_article.find_all('p')
    
    article_text = ""
    
    for p in paragraphs:
        article_text += p.text
    

    En el script anterior, primero importamos las bibliotecas importantes necesarias para extraer los datos de la web. Luego usamos la urlopenfunción de la urllib.requestutilidad para raspar los datos. A continuación, necesitamos llamar a la readfunción en el objeto devuelto por la urlopenfunción para leer los datos. Para analizar los datos, usamos el BeautifulSoupobjeto y le pasamos el objeto de datos raspados, es decir, articley el lxmlanalizador.

    En los artículos de Wikipedia, todo el texto del artículo se incluye dentro de las <p>etiquetas. Para recuperar el texto, necesitamos llamar a la find_allfunción en el objeto devuelto por BeautifulSoup. El nombre de la etiqueta se pasa como parámetro a la función. La find_allfunción devuelve todos los párrafos del artículo en forma de lista. Todos los párrafos se han combinado para recrear el artículo.

    Una vez que se raspa el artículo, necesitamos hacer un procesamiento previo.

    Preprocesamiento

    El primer paso de procesamiento previo es eliminar las referencias del artículo. Wikipedia, las referencias se incluyen entre corchetes. La siguiente secuencia de comandos elimina los corchetes y reemplaza los múltiples espacios resultantes por un solo espacio. Eche un vistazo al guión a continuación:

    # Removing Square Brackets and Extra Spaces
    article_text = re.sub(r'[[0-9]*]', ' ', article_text)
    article_text = re.sub(r's+', ' ', article_text)
    

    El article_textobjeto contiene texto sin corchetes. Sin embargo, no queremos eliminar nada más del artículo, ya que este es el artículo original. No eliminaremos otros números, signos de puntuación y caracteres especiales de este texto, ya que usaremos este texto para crear resúmenes y las frecuencias de palabras ponderadas se reemplazarán en este artículo.

    Para limpiar el texto y calcular las frecuencias ponderadas, crearemos otro objeto. Eche un vistazo al siguiente guión:

    # Removing special characters and digits
    formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text )
    formatted_article_text = re.sub(r's+', ' ', formatted_article_text)
    

    Ahora tenemos dos objetos article_text, que contiene el artículo original y formatted_article_textque contiene el artículo formateado. Usaremos formatted_article_textpara crear histogramas de frecuencia ponderada para las palabras y reemplazaremos estas frecuencias ponderadas con las palabras en el article_textobjeto.

    Conversión de texto en oraciones

    En este punto, hemos procesado previamente los datos. A continuación, necesitamos convertir el artículo en oraciones. Usaremos el article_textobjeto para convertir el artículo en una frase, ya que contiene puntos. El formatted_article_textno contiene ninguna puntuacion y por lo tanto no se pueden convertir en oraciones usando la parada completa como un parámetro.

    El siguiente script realiza la tokenización de oraciones:

    sentence_list = nltk.sent_tokenize(article_text)
    

    Encuentre la frecuencia ponderada de ocurrencia

    Para encontrar la frecuencia de aparición de cada palabra, usamos la formatted_article_textvariable. Usamos esta variable para encontrar la frecuencia de ocurrencia, ya que no contiene puntuación, dígitos u otros caracteres especiales. Eche un vistazo al siguiente guión:

    stopwords = nltk.corpus.stopwords.words('english')
    
    word_frequencies = {}
    for word in nltk.word_tokenize(formatted_article_text):
        if word not in stopwords:
            if word not in word_frequencies.keys():
                word_frequencies[word] = 1
            else:
                word_frequencies[word] += 1
    

    En el script anterior, primero almacenamos todas las palabras vacías en inglés de la nltkbiblioteca en una stopwordsvariable. A continuación, recorremos todas las oraciones y luego las palabras correspondientes para verificar primero si son palabras vacías. En caso contrario, procedemos a comprobar si las palabras existen en el word_frequencydiccionario word_frequencies, es decir , o no. Si la palabra se encuentra por primera vez, se agrega al diccionario como clave y su valor se establece en 1. De lo contrario, si la palabra ya existía en el diccionario, su valor simplemente se actualiza en 1.

    Finalmente, para encontrar la frecuencia ponderada, simplemente podemos dividir el número de ocurrencias de todas las palabras por la frecuencia de la palabra que más ocurre, como se muestra a continuación:

    maximum_frequncy = max(word_frequencies.values())
    
    for word in word_frequencies.keys():
        word_frequencies[word] = (word_frequencies[word]/maximum_frequncy)
    

    Cálculo de puntuaciones de oraciones

    Ahora hemos calculado las frecuencias ponderadas para todas las palabras. Ahora es el momento de calcular los puntajes de cada oración agregando frecuencias ponderadas de las palabras que aparecen en esa oración en particular. El siguiente guión calcula las puntuaciones de las oraciones:

    sentence_scores = {}
    for sent in sentence_list:
        for word in nltk.word_tokenize(sent.lower()):
            if word in word_frequencies.keys():
                if len(sent.split(' ')) < 30:
                    if sent not in sentence_scores.keys():
                        sentence_scores[sent] = word_frequencies[word]
                    else:
                        sentence_scores[sent] += word_frequencies[word]
    

    En el script anterior, primero creamos un sentence_scoresdiccionario vacío . Las claves de este diccionario serán las propias frases y los valores serán las puntuaciones correspondientes de las frases. A continuación, recorremos cada oración en el sentence_listy convertimos la oración en palabras.

    Luego verificamos si la palabra existe en el word_frequenciesdiccionario. Esta verificación se realiza ya que creamos la sentence_listlista a partir del article_textobjeto; por otro lado, las frecuencias de palabras se calcularon utilizando el formatted_article_textobjeto, que no contiene palabras vacías, números, etc.

    No queremos oraciones muy largas en el resumen, por lo tanto, calculamos la puntuación solo para oraciones con menos de 30 palabras (aunque puede ajustar este parámetro para su propio caso de uso). A continuación, comprobamos si la oración existe en el sentence_scoresdiccionario o no. Si la oración no existe, la agregamos al sentence_scoresdiccionario como clave y le asignamos la frecuencia ponderada de la primera palabra de la oración, como su valor. Por el contrario, si la oración existe en el diccionario, simplemente agregamos la frecuencia ponderada de la palabra al valor existente.

    Obteniendo el resumen

    Ahora tenemos el sentence_scoresdiccionario que contiene frases con su puntuación correspondiente. Para resumir el artículo, podemos tomar las primeras N oraciones con las puntuaciones más altas. El siguiente script recupera las 7 oraciones principales y las imprime en la pantalla.

    import heapq
    summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
    
    summary = ' '.join(summary_sentences)
    print(summary)
    

    En el script anterior, usamos la heapqbiblioteca y llamamos a su nlargestfunción para recuperar las 7 oraciones principales con las puntuaciones más altas.

    El resumen de salida se ve así:

    La inteligencia artificial (IA), a veces llamada inteligencia de la máquina, es la inteligencia demostrada por las máquinas, en contraste con la inteligencia natural que muestran los humanos y otros animales. En la IA se utilizan muchas herramientas, incluidas las versiones de búsqueda y optimización matemática, redes neuronales artificiales y métodos basados ​​en estadísticas, probabilidad y economía. Los problemas (u objetivos) tradicionales de la investigación de la IA incluyen el razonamiento, la representación del conocimiento, la planificación, el aprendizaje, el procesamiento del lenguaje natural, la percepción y la capacidad para mover y manipular objetos. Cuando el acceso a las computadoras digitales se hizo posible a mediados de la década de 1950, la investigación de la IA comenzó a explorar la posibilidad de que la inteligencia humana pudiera reducirse a la manipulación de símbolos. Una propuesta para lidiar con esto es asegurar que la primera IA generalmente inteligente sea la ‘IA amigable’, y luego podrá controlar las IA desarrolladas posteriormente. Hoy en día, la gran mayoría de los investigadores de IA actuales trabajan en cambio en aplicaciones manejables de “IA estrecha” (como diagnóstico médico o navegación en automóviles). El aprendizaje automático, un concepto fundamental de la investigación de la IA desde el inicio del campo, es el estudio de algoritmos informáticos que mejoran automáticamente a través de la experiencia.

    Recuerde, dado que los artículos de Wikipedia se actualizan con frecuencia, es posible que obtenga resultados diferentes según el tiempo de ejecución del script.

    Conclusión

    Este artículo explica el proceso de resumen de texto con la ayuda de la biblioteca Python NLTK. El proceso de raspado de artículos utilizando la BeautifulSoapbiblioteca también se ha cubierto brevemente en el artículo. Le recomendaré que elimine cualquier otro artículo de Wikipedia y vea si puede obtener un buen resumen del artículo o no.

     

    Etiquetas:

    Deja una respuesta

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