Ejercicio misceláneo: NLP, Web Scrapping (otra resolución)

Ejercicio misceláneo: NLP, Web Scrapping (otra resolución)

La prueba consiste en completar el código marcado con #FIXME para obtener automáticamente el resumen de un texto.

La decripción general de las reglas/algoritmo:

  • Identificar las frecuencias de las palabras en el texto.

  • Obtener las oraciones/párrafos en el texto.

  • Obtener un score para cada oración/párrafo que indique su importancia en el texto, tendrán mayor score aquellas oraciones que incluyan las palabras con mayor frecuencia.

  • Seleccionar las 3 oraciones con el score más alto para construir el resumen.

import urllib3
from bs4 import BeautifulSoup
from nltk.tokenize import sent_tokenize,word_tokenize
from nltk.corpus import stopwords
from nltk.probability import FreqDist
from string import punctuation
from collections import defaultdict
import collections
from heapq import nlargest
import unicodedata

http = urllib3.PoolManager()
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Input In [1], in <module>
      1 import urllib3
      2 from bs4 import BeautifulSoup
----> 3 from nltk.tokenize import sent_tokenize,word_tokenize
      4 from nltk.corpus import stopwords
      5 from nltk.probability import FreqDist

ModuleNotFoundError: No module named 'nltk'
articleURL = "https://www.muyinteresante.es/naturaleza/video/objetivo-2030-proteger-el-30-de-la-tierra-751579255112"
import requests
respuesta = requests.get(articleURL) 
soup = BeautifulSoup(respuesta.text,"html.parser")
text_containers = soup.body.find_all(name='div', class_='paragraph--text')
#El valor de la variable text debe ser una cadena con los párrafos separados por '\n'
text = '';
for tc in text_containers:
    p_containers = tc.find_all(name='p')
    for p in p_containers:
        text = text + p.text + '\n'
text = text[26:]
text
'El Convenio de la Organización de las Naciones Unidas (ONU) sobre Diversidad Biológica acaba de presentar el primer borrador de lo que será su hoja de ruta para los próximos diez años. El objetivo es tan ambicioso como necesario: proteger cerca de un tercio de la superficie total del planeta, incluyendo ecosistemas tanto terrestres como acuáticos.\nEn 2019, la Plataforma Intergubernamental sobre la Biodiversidad y los Servicios Ecosistémicos (IPBES) presentaba un demoledor informe sobre el estado de la biodiversidad a nivel mundial que indicaba que en el mundo hay en torno a un millón de especies en peligro, y que las tasas de extinción se están acelerando a un ritmo sin precedentes como consecuencia de las actividades humanas. Algunos expertos ya consideran, de hecho, de que estamos viviendo la sexta extinción masiva.\nEsta enorme pérdida de biodiversidad tiene consecuencias graves para los ecosistemas, pero también para el bienestar humano. Por ejemplo, un artículo publicado en la revista Nature en el año 2010 alertaba de que la desaparición de especies eleva la aparición y transmisión de enfermedades infecciosas. Los autores mencionaban el caso de la enfermedad de Lyme, cuya incidencia es mayor en los ecosistemas en los que se ha reducido la biodiversidad.\nEl denominado “borrador preliminar del marco mundial de la diversidad biológica posterior a 2020” que acaba de ser presentado por la ONU incluye veinte metas orientadas a la acción para 2030 orientadas a objetivos como reducir las amenazas a la biodiversidad y satisfacer las necesidades de las personas a través de la utilización sostenible y la participación en los beneficios.\nAdemás de proteger al menos el 30% de la superficie terrestre y marina, el documento indica que al menos un 10% de la misma debería estar sujeta a protección estricta. Otras de las metas enunciadas se refieren al control de las vías de introducción de especies exóticas invasoras, a la reducción de la contaminación por exceso de nutrientes, biocidas y deshechos plásticos, a la mitigación y adaptación al cambio climático y a la regulación de la recolección y comercio de especies.\n\xa0\nEn octubre de 2020 tendrá lugar en Kunming (China) la COP15 del Convenio de las Naciones Unidas sobre Diversidad Biológica, en la que se revisará el resultado de las acciones encaminadas a cumplir los objetivos para el decenio 2010-2020 y se adoptarán decisiones en función de las recomendaciones del borrador marco, que se irá actualizando a lo largo de este año en sucesivas reuniones del grupo de trabajo.\n“Este acuerdo global ofrecerá una oportunidad incomparable para avanzar en el progreso en la conservación, restauración y uso sostenible de la biodiversidad, al tiempo que fortalecerá los vínculos existentes entre biodiversidad, cambio climático y desarrollo sostenible”, indicaba una nota de prensa publicada por el organismo en diciembre de 2019.\nA largo plazo, “la visión del Marco es la de un mundo en el que se vive en armonía con la naturaleza donde, para 2050, la diversidad biológica se valora, conserva, restaura y utiliza en forma racional, manteniendo los servicios de los ecosistemas, sosteniendo un planeta sano y brindando beneficios esenciales para todas las personas”, indica el documento.\nQueda por ver si, más allá de las intenciones y las palabras bonitas, los objetivos de este documento se plasman en hechos reales. Como sucede con todos los acuerdos internacionales, el Convenio sobre Diversidad Biológica (CDB) es una herramienta con un funcionamiento institucional muy complejo. “Se da el hecho que en los procesos de toma de decisiones a menudo los representantes de los Estados son personas de perfil político con un conocimiento técnico escaso de la situación de la biodiversidad y las consecuencias de no actuar, cuando no son representantes de Ministerios de asuntos exteriores, economía o comercio de sus respectivos países”, reflexionaba \xa0Jaume Grau López, biólogo y Coordinador del Área de Conservación de la Naturaleza de Ecologistas en Acción, en una artículo publicado en 2013 en la revista Ecología Política. “Asimismo, la capacidad de influencia y negociación en el seno del CDB se ve condicionada por los recursos económicos y humanos que cada país puede disponer para la participación en las múltiples reuniones que se producen por los cinco continentes cada año”.\nEl tiempo apremia, y la sociedad civil espera resultados concretos de estas grandes reuniones. Veremos qué sucede en los próximos años.\n\xa0\n'
text = unicodedata.normalize("NFKD",text) #replace \xa0 with regular space
print(text)
El Convenio de la Organización de las Naciones Unidas (ONU) sobre Diversidad Biológica acaba de presentar el primer borrador de lo que será su hoja de ruta para los próximos diez años. El objetivo es tan ambicioso como necesario: proteger cerca de un tercio de la superficie total del planeta, incluyendo ecosistemas tanto terrestres como acuáticos.
En 2019, la Plataforma Intergubernamental sobre la Biodiversidad y los Servicios Ecosistémicos (IPBES) presentaba un demoledor informe sobre el estado de la biodiversidad a nivel mundial que indicaba que en el mundo hay en torno a un millón de especies en peligro, y que las tasas de extinción se están acelerando a un ritmo sin precedentes como consecuencia de las actividades humanas. Algunos expertos ya consideran, de hecho, de que estamos viviendo la sexta extinción masiva.
Esta enorme pérdida de biodiversidad tiene consecuencias graves para los ecosistemas, pero también para el bienestar humano. Por ejemplo, un artículo publicado en la revista Nature en el año 2010 alertaba de que la desaparición de especies eleva la aparición y transmisión de enfermedades infecciosas. Los autores mencionaban el caso de la enfermedad de Lyme, cuya incidencia es mayor en los ecosistemas en los que se ha reducido la biodiversidad.
El denominado “borrador preliminar del marco mundial de la diversidad biológica posterior a 2020” que acaba de ser presentado por la ONU incluye veinte metas orientadas a la acción para 2030 orientadas a objetivos como reducir las amenazas a la biodiversidad y satisfacer las necesidades de las personas a través de la utilización sostenible y la participación en los beneficios.
Además de proteger al menos el 30% de la superficie terrestre y marina, el documento indica que al menos un 10% de la misma debería estar sujeta a protección estricta. Otras de las metas enunciadas se refieren al control de las vías de introducción de especies exóticas invasoras, a la reducción de la contaminación por exceso de nutrientes, biocidas y deshechos plásticos, a la mitigación y adaptación al cambio climático y a la regulación de la recolección y comercio de especies.
 
En octubre de 2020 tendrá lugar en Kunming (China) la COP15 del Convenio de las Naciones Unidas sobre Diversidad Biológica, en la que se revisará el resultado de las acciones encaminadas a cumplir los objetivos para el decenio 2010-2020 y se adoptarán decisiones en función de las recomendaciones del borrador marco, que se irá actualizando a lo largo de este año en sucesivas reuniones del grupo de trabajo.
“Este acuerdo global ofrecerá una oportunidad incomparable para avanzar en el progreso en la conservación, restauración y uso sostenible de la biodiversidad, al tiempo que fortalecerá los vínculos existentes entre biodiversidad, cambio climático y desarrollo sostenible”, indicaba una nota de prensa publicada por el organismo en diciembre de 2019.
A largo plazo, “la visión del Marco es la de un mundo en el que se vive en armonía con la naturaleza donde, para 2050, la diversidad biológica se valora, conserva, restaura y utiliza en forma racional, manteniendo los servicios de los ecosistemas, sosteniendo un planeta sano y brindando beneficios esenciales para todas las personas”, indica el documento.
Queda por ver si, más allá de las intenciones y las palabras bonitas, los objetivos de este documento se plasman en hechos reales. Como sucede con todos los acuerdos internacionales, el Convenio sobre Diversidad Biológica (CDB) es una herramienta con un funcionamiento institucional muy complejo. “Se da el hecho que en los procesos de toma de decisiones a menudo los representantes de los Estados son personas de perfil político con un conocimiento técnico escaso de la situación de la biodiversidad y las consecuencias de no actuar, cuando no son representantes de Ministerios de asuntos exteriores, economía o comercio de sus respectivos países”, reflexionaba  Jaume Grau López, biólogo y Coordinador del Área de Conservación de la Naturaleza de Ecologistas en Acción, en una artículo publicado en 2013 en la revista Ecología Política. “Asimismo, la capacidad de influencia y negociación en el seno del CDB se ve condicionada por los recursos económicos y humanos que cada país puede disponer para la participación en las múltiples reuniones que se producen por los cinco continentes cada año”.
El tiempo apremia, y la sociedad civil espera resultados concretos de estas grandes reuniones. Veremos qué sucede en los próximos años.
 
def summarize(text, n):
    sentences = sent_tokenize(text)
    assert n <= len(sentences)
    words = word_tokenize(text.lower())
    
    our_stopwords = set(stopwords.words('spanish') + list(punctuation) + ['“', '”'])
    
    words_without_stops=[word for word in words if word not in our_stopwords]
    
    #obtener un diccionario con la frecuencia de las palabras en words_without_stops
    word_frequencies = collections.Counter(words_without_stops)
    
    #Obtener los scores para cada oración de acuerdo a la reglas anteriormente descritas
    #sentence_scores es un diccionario con la posición/indice de cada párrafo y su score
    
    sentence_scores = defaultdict(int)
    for i, sentence in enumerate(sentences):
        peso = 0
        for word in word_tokenize(sentence.lower()):
            peso = peso + word_frequencies[word]
        sentence_scores[i] = peso

    sorted_sentence_scores = sorted(sentence_scores.items(), key=lambda item: item[1], reverse=True)
    sentences_with_score = [{'index': k, 'score': v} for k, v in sorted_sentence_scores]
    
    best_sentences = sentences_with_score[:n]
    indexes_of_the_highest_scores = [s['index'] for s in best_sentences]
    
    summary_sentences = []
    for index in indexes_of_the_highest_scores:
        summary_sentences.append(sentences[index])
    return summary_sentences
summarize(text,3)
['El denominado “borrador preliminar del marco mundial de la diversidad biológica posterior a 2020” que acaba de ser presentado por la ONU incluye veinte metas orientadas a la acción para 2030 orientadas a objetivos como reducir las amenazas a la biodiversidad y satisfacer las necesidades de las personas a través de la utilización sostenible y la participación en los beneficios.',
 '“Se da el hecho que en los procesos de toma de decisiones a menudo los representantes de los Estados son personas de perfil político con un conocimiento técnico escaso de la situación de la biodiversidad y las consecuencias de no actuar, cuando no son representantes de Ministerios de asuntos exteriores, economía o comercio de sus respectivos países”, reflexionaba  Jaume Grau López, biólogo y Coordinador del Área de Conservación de la Naturaleza de Ecologistas en Acción, en una artículo publicado en 2013 en la revista Ecología Política.',
 'En octubre de 2020 tendrá lugar en Kunming (China) la COP15 del Convenio de las Naciones Unidas sobre Diversidad Biológica, en la que se revisará el resultado de las acciones encaminadas a cumplir los objetivos para el decenio 2010-2020 y se adoptarán decisiones en función de las recomendaciones del borrador marco, que se irá actualizando a lo largo de este año en sucesivas reuniones del grupo de trabajo.']