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.
Te puede interesar:Manejo de archivos en PythonConvertir 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
facilitar | 2 | 0.40 |
ocho | 1 | 0.20 |
otoño | 1 | 0.20 |
obtener | 1 | 0.20 |
dar | 1 | 0.20 |
mayor | 2 | 0.40 |
creciente | 1 | 0.20 |
privación | 2 | 0.40 |
mantener | 5 | 1.00 |
aprendizaje | 1 | 0.20 |
Moviente | 1 | 0.20 |
Nunca | 1 | 0.20 |
Progreso | 2 | 0.40 |
ver | 1 | 0.20 |
Siete | 1 | 0.20 |
esforzarse | 1 | 0.20 |
amenaza | 2 | 0.40 |
hora | 1 | 0.20 |
trabajo | 1 | 0.20 |
trabajando | 1 | 0.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.
Te puede interesar:Implementación de Word2Vec con la biblioteca Gensim en PythonReemplazar 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 trabajando | 1 + 0.20 = 1.20 |
Sigue esforzándote | 1 + 0.20 = 1.20 |
Nunca te rindas | 0.20 + 0.20 = 0.40 |
Cáete siete veces, levántate ocho | 0.20 + 0.20 + 0.20 + 0.20 + 0.20 = 1.0 |
La facilidad es una mayor amenaza para el progreso que las dificultades | 0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0 |
La facilidad es una mayor amenaza para el progreso que las dificultades | 0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0 |
Entonces, sigue moviéndote, sigue creciendo, sigue aprendiendo | 1 + 0.20 + 1 + 0.20 + 1 + 0.20 = 3.60 |
Te veo en el trabajo | 0.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.
Te puede interesar:Cómo formatear fechas en PythonEstas 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 urlopen
función de la urllib.request
utilidad para raspar los datos. A continuación, necesitamos llamar a la read
función en el objeto devuelto por la urlopen
función para leer los datos. Para analizar los datos, usamos el BeautifulSoup
objeto y le pasamos el objeto de datos raspados, es decir, article
y el lxml
analizador.
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_all
función en el objeto devuelto por BeautifulSoup
. El nombre de la etiqueta se pasa como parámetro a la función. La find_all
funció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_text
objeto 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_text
que contiene el artículo formateado. Usaremos formatted_article_text
para crear histogramas de frecuencia ponderada para las palabras y reemplazaremos estas frecuencias ponderadas con las palabras en el article_text
objeto.
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_text
objeto para convertir el artículo en una frase, ya que contiene puntos. El formatted_article_text
no 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_text
variable. 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 nltk
biblioteca en una stopwords
variable. 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_frequency
diccionario 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:
Te puede interesar:Introducción al módulo de Python Picklesentence_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_scores
diccionario 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_list
y convertimos la oración en palabras.
Luego verificamos si la palabra existe en el word_frequencies
diccionario. Esta verificación se realiza ya que creamos la sentence_list
lista a partir del article_text
objeto; por otro lado, las frecuencias de palabras se calcularon utilizando el formatted_article_text
objeto, 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_scores
diccionario o no. Si la oración no existe, la agregamos al sentence_scores
diccionario 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_scores
diccionario 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 heapq
biblioteca y llamamos a su nlargest
función para recuperar las 7 oraciones principales con las puntuaciones más altas.
El resumen de salida se ve así:
Te puede interesar:Cómo enviar correos electrónicos con Gmail usando PythonLa 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 BeautifulSoap
biblioteca 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.