hedtorresca's picture
Update app.py
651eafe verified
import gradio as gr
from newspaper import Article
import openai
import re
import pandas as pd
import os
# Configurar la clave API de OpenAI
openai.api_key = 'sk-proj-bA6Kvo487XPtUpE8xjtTT3BlbkFJ1RitWdAJT06qCJ5GG9Ys'
# Simulación de la función get_final_url debido a falta de definición
def get_final_url(url):
return url
# Función para limpiar URL (del script proporcionado)
def clean_url(url):
cleaned_url2 = re.sub(r'&ved=.*', '', url)
cleaned_url = get_final_url(cleaned_url2)
return cleaned_url
# Función para extraer detalles del artículo
def get_article_details(url):
clean_url_processed = clean_url(url)
try:
article = Article(clean_url_processed)
article.download()
article.parse()
article.nlp()
return {
'Título': article.title,
'Fecha Publicacion': article.publish_date,
'Fuente': article.source_url,
'Link': clean_url_processed,
'Texto completo': article.text,
'Resumen': article.summary
}
except Exception as e:
print(f'Failed to process article at {clean_url_processed}: {e}')
return None
# Función para extraer detalles adicionales usando OpenAI
def extract_additional_details(text):
message = [
{"role": "system", "content": "Eres un asistente que ayuda a extraer e inferir información específica de textos de noticias."},
{"role": "user", "content": (
f"Extrae la siguiente información del texto: \n"
f"- Nombre de la víctima\n- Género de la víctima\n- Nacionalidad de la víctima\n- Ciudad de nacimiento de la víctima\n- Rango de edad de la víctima\n- Fecha corta de los hechos\n- Hora de los hechos\n"
f"- Lugar específico de los hechos\n- Municipio de los hechos\n- Departamento de los hechos\n- País de los hechos\n- Tipo específico de entorno\n"
f"- Profesión de la víctima\n- Tipo de muerte\n- Tipo de arma o medio\n- Descripción de los hechos\n- Presunto responsable\n"
f"- Relación víctima-responsable\n- Presunta relación con grupos armados o bandas delincuenciales del presunto responsable\n- Previa existencia de medida cautelar\n"
f"- Grupo étnico de la víctima\n- La víctima es LGBT\n- La víctima es lideresa\n- Tipo de lideresa\n- Otras víctimas mortales o heridas en los hechos\n- Feminicidio u Homicidio\n- Fuente\n- Medio de comunicación\n- Formato temático o formato episódico\n- Atribución de responsabilidad sobre el hecho\n "
f"- Texto\n{text}"
)}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0125",
messages=message,
max_tokens=600,
n=1,
stop=None,
temperature=0.2,
)
return response.choices[0].message['content'].strip()
def parse_details(details):
fields = [
'Nombre de la víctima', 'Género de la víctima', 'Nacionalidad de la víctima', 'Rango de edad de la víctima', 'Fecha corta de los hechos', 'Hora de los hechos',
'Lugar específico de los hechos', 'Municipio de los hechos', 'Departamento de los hechos', 'País de los hechos', 'Ciudad de nacimiento de la víctima','Tipo específico de entorno',
'Profesión de la víctima', 'Tipo de muerte', 'Tipo de arma o medio', 'Descripción de los hechos',
'Presunto responsable', 'Relación víctima-responsable', 'Presunta relación con grupos armados o bandas delincuenciales del presunto responsable',
'Previa existencia de medida cautelar', 'Grupo étnico de la víctima', 'La víctima es LGBT', 'La víctima es lideresa', 'Tipo de lideresa',
'Otras víctimas mortales o heridas en los hechos', 'Feminicidio u Homicidio', 'Fuente', 'Medio de comunicación', 'Formato temático o formato episódico','Atribución de responsabilidad sobre el hecho'
]
parsed_details = {}
for field in fields:
pattern = rf"{field}:\s*(.*)"
match = re.search(pattern, details)
parsed_details[field] = match.group(1).strip() if match else None
return parsed_details
# Función para generar el archivo Excel
def generate_excel(details, additional_details):
#combined_details = {**details, **eval(additional_details)}
df = pd.concat([details, additional_details], axis=1)
output_dir = 'data'
os.makedirs(output_dir, exist_ok=True)
output_file_path = os.path.join(output_dir, 'detalles_articulo.xlsx')
df['Fecha Publicacion'] = pd.to_datetime(df['Fecha Publicacion'], utc=True)
df['Fecha Publicacion'] = df['Fecha Publicacion'].dt.strftime('%d/%m/%Y')
df.to_excel(output_file_path, index=False)
return output_file_path
# Función del interfaz de Gradio
def extract_article_info(url):
details = get_article_details(url)
if details:
additional_details = extract_additional_details(details['Título'] + "\n Fecha de publicación: "+ str(pd.to_datetime(details['Fecha Publicacion'], utc=True)) + "\n" + details['Texto completo'] + "\n Fuente: " + details['Fuente'] )
parsed_details = parse_details(additional_details.replace('**', ''))
details2 = pd.DataFrame([details])
details_df = pd.DataFrame([parsed_details])
excel_path = generate_excel(details2, details_df)
return details['Título'], details['Fecha Publicacion'], details['Fuente'], details['Link'], details['Texto completo'], details['Resumen'], parsed_details['Nombre de la víctima'], parsed_details['Género de la víctima'], parsed_details['Nacionalidad de la víctima'], parsed_details['Rango de edad de la víctima'], parsed_details['Fecha corta de los hechos'], parsed_details['Hora de los hechos'], parsed_details['Lugar específico de los hechos'], parsed_details['Municipio de los hechos'], parsed_details['Departamento de los hechos'], parsed_details['País de los hechos'], parsed_details['Ciudad de nacimiento de la víctima'],parsed_details['Tipo específico de entorno'], parsed_details['Profesión de la víctima'], parsed_details['Tipo de muerte'], parsed_details['Tipo de arma o medio'], parsed_details['Descripción de los hechos'], parsed_details['Presunto responsable'], parsed_details['Relación víctima-responsable'], parsed_details['Presunta relación con grupos armados o bandas delincuenciales del presunto responsable'],parsed_details['Previa existencia de medida cautelar'], parsed_details['Grupo étnico de la víctima'], parsed_details['La víctima es LGBT'], parsed_details['La víctima es lideresa'], parsed_details['Tipo de lideresa'],parsed_details['Otras víctimas mortales o heridas en los hechos'], parsed_details['Feminicidio u Homicidio'], parsed_details['Medio de comunicación'], parsed_details['Formato temático o formato episódico'],parsed_details['Atribución de responsabilidad sobre el hecho'], excel_path
else:
return "Error procesando el artículo", "", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
# Diseño de la interfaz de Gradio
iface = gr.Interface(
fn=extract_article_info,
inputs=gr.Textbox(lines=2, placeholder="Ingresa la URL del artículo"),
outputs=[
gr.Textbox(label="Título"),
gr.Textbox(label="Fecha de Publicación"),
gr.Textbox(label="Fuente"),
gr.Textbox(label="Link"),
gr.Textbox(label="Texto Completo"),
gr.Textbox(label="Resumen"),
gr.Textbox(label="Nombre de la víctima"),
gr.Textbox(label="Género de la víctima"),
gr.Textbox(label="Nacionalidad de la víctima"),
gr.Textbox(label="Rango de edad de la víctima"),
gr.Textbox(label="Fecha corta de los hechos"),
gr.Textbox(label="Hora de los hechos"),
gr.Textbox(label="Lugar específico de los hechos"),
gr.Textbox(label="Municipio de los hechos"),
gr.Textbox(label="Departamento de los hechos"),
gr.Textbox(label="País de los hechos"),
gr.Textbox(label="Ciudad de nacimiento de la víctima"),
gr.Textbox(label="Tipo específico de entorno"),
gr.Textbox(label="Profesión de la víctima"),
gr.Textbox(label="Tipo de muerte"),
gr.Textbox(label="Tipo de arma o medio"),
gr.Textbox(label="Descripción de los hechos"),
gr.Textbox(label="Presunto responsable"),
gr.Textbox(label="Relación víctima-responsable"),
gr.Textbox(label="Presunta relación con grupos armados o bandas delincuenciales del presunto responsable"),
gr.Textbox(label="Previa existencia de medida cautelar"),
gr.Textbox(label="Grupo étnico de la víctima"),
gr.Textbox(label="La víctima es LGBT"),
gr.Textbox(label="La víctima es lideresa"),
gr.Textbox(label="Tipo de lideresa"),
gr.Textbox(label="Otras víctimas mortales o heridas en los hechos"),
gr.Textbox(label="Feminicidio u Homicidio"),
gr.Textbox(label="Medio de comunicación"),
gr.Textbox(label="Formato temático o formato episódico"),
gr.Textbox(label="Atribución de responsabilidad sobre el hecho"),
gr.File(label="Descargar detalles como Excel")
],
title="Extracción de Detalles de Noticias",
description="Ingresa la URL de un artículo de noticias y obtén los detalles extraídos."
)
iface.launch(share=True, debug= True)