File size: 5,550 Bytes
f676a94
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12c2eae
f676a94
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5bdd2ef
f676a94
 
 
 
 
 
 
 
 
351daea
f676a94
 
 
 
 
5bdd2ef
f676a94
5bdd2ef
f676a94
 
 
 
 
 
 
 
 
5bdd2ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

import PyPDF2
import gradio as gr
from langchain.prompts import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
from huggingface_hub import login
from pathlib import Path
from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
import os

huggingface_token = os.getenv('HUGGINGFACE_TOKEN')

# Realizar el inicio de sesi贸n de Hugging Face solo si el token est谩 disponible
if huggingface_token:
    login(token=huggingface_token)

# Configuraci贸n del modelo LLM
llm = HuggingFaceEndpoint(
    repo_id="mistralai/Mistral-7B-Instruct-v0.3",
    task="text-generation",
    max_new_tokens=4096,
    temperature=0.5,
    do_sample=False,
    return_full_text=True,
)
llm_engine_hf = ChatHuggingFace(llm=llm)

# Configuraci贸n del modelo de clasificaci贸n
tokenizer = AutoTokenizer.from_pretrained("mrm8488/legal-longformer-base-8192-spanish")
model = AutoModelForSequenceClassification.from_pretrained("mrm8488/legal-longformer-base-8192-spanish")

id2label = {0: "multas", 1: "politicas_de_privacidad", 2: "contratos", 3: "denuncias", 4: "otros"}

def read_file(file):
    file_path = file.name
    if file_path.endswith('.pdf'):
        return read_pdf(file_path)
    else:
        with open(file_path, 'r', encoding='utf-8') as f:
            return f.read()

def read_pdf(file_path):
    pdf_reader = PyPDF2.PdfReader(file_path)
    text = ""
    for page in range(len(pdf_reader.pages)):
        text += pdf_reader.pages[page].extract_text()
    return text

def summarize(text, summary_length):
    if summary_length == 'Corto':
        length_instruction = "El resumen debe tener un m谩ximo de 100 palabras."
    elif summary_length == 'Medio':
        length_instruction = "El resumen debe tener un m谩ximo de 500 palabras."
    else:
        length_instruction = "El resumen debe tener un m谩ximo de 1000 palabras."
    
    template = f'''
    Por favor, lea detenidamente el siguiente documento:
<document>
{{TEXT}}
</document>
Despu茅s de leer el documento, identifique los puntos clave y las ideas principales cubiertas en el texto. {length_instruction}
Su objetivo es ser exhaustivo en la captura del contenido central del documento, mientras que tambi茅n es conciso en la expresi贸n de cada punto del resumen. Omita los detalles menores y conc茅ntrese en los temas centrales y hechos importantes.
    '''
    
    prompt = PromptTemplate(
        template=template,
        input_variables=['TEXT']    
    )
    
    formatted_prompt = prompt.format(TEXT=text)
    output_summary = llm_engine_hf.invoke(formatted_prompt)
    
    return output_summary.content

def classify_text(text):
    inputs = tokenizer(text, return_tensors="pt", max_length=4096, truncation=True, padding="max_length")
    model.eval()
    with torch.no_grad():
        outputs = model(**inputs)
    logits = outputs.logits
    predicted_class_id = logits.argmax(dim=-1).item()
    predicted_label = id2label[predicted_class_id]
    return f"Clasificaci贸n: {predicted_label}"

def translate(text, target_language):
    template = '''
    Por favor, traduzca el siguiente documento al {LANGUAGE}:
<document>
{TEXT}
</document>
Aseg煤rese de que la traducci贸n sea precisa y conserve el significado original del documento.
    '''
    
    prompt = PromptTemplate(
        template=template,
        input_variables=['TEXT', 'LANGUAGE']    
    )
    
    formatted_prompt = prompt.format(TEXT=text, LANGUAGE=target_language)
    translated_text = llm_engine_hf.invoke(formatted_prompt)
    
    return translated_text.content

def process_file(file, action, target_language=None, summary_length=None):
    text = read_file(file)
    if action == "Resumen":
        return summarize(text, summary_length)
    elif action == "Clasificar":
        return classify_text(text)
    elif action == "Traducir":
        return translate(text, target_language)
    else:
        return "Acci贸n no v谩lida"

# Crear la interfaz de Gradio
with gr.Blocks() as demo:
    gr.Markdown("## LexAIcon: Traducci贸n Resumen y Clasificaci贸n de textos legales.")

    with gr.Row():
        with gr.Column():
            file = gr.File(label="Subir un archivo")
            action = gr.Radio(label="Seleccione una acci贸n", choices=["Resumen", "Clasificar", "Traducir"])
            summary_length = gr.Radio(label="Seleccione la longitud del resumen", choices=["Corto", "Medio", "Largo"], visible=False)
            target_language = gr.Dropdown(label="Seleccionar idioma de traducci贸n", choices=["en", "fr", "de"], visible=False)
        
        with gr.Column():
            output_text = gr.Textbox(label="Resultado", lines=20)

    def update_ui(action):
        if action == "Traducir":
            return gr.update(visible=False), gr.update(visible=True)
        elif action == "Resumen":
            return gr.update(visible=True), gr.update(visible=False)
        elif action == "Clasificar":
            return gr.update(visible=False), gr.update(visible(False))
        else:
            return gr.update(visible=False), gr.update(visible(False))
    
    action.change(update_ui, inputs=action, outputs=[summary_length, target_language])
    
    submit_button = gr.Button("Procesar")
    submit_button.click(process_file, inputs=[file, action, target_language, summary_length], outputs=output_text)
    
# Ejecutar la aplicaci贸n Gradio
demo.launch(share=True)