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)