import gradio as gr
from transformers import AutoModelForTokenClassification,AutoModelForSequenceClassification, AutoTokenizer, pipeline
from sentence_transformers import SentenceTransformer, util
title = "Modelo Jurídico Mexicano"
description = """
Este demo permite utilizar los modelos:
- hackathon-pln-es/jurisbert-finetuning-ner
- hackathon-pln-es/jurisbert-class-tratados-internacionales-sistema-universal
- hackathon-pln-es/jurisbert-clas-art-convencion-americana-dh
- hackathon-pln-es/jurisbert-tsdae-sentence-transformer
entrenados para el hackathon por el equipo compuesto por: gpalomeque, aureliopvs, ceciliamacias, giomadariaga y cattsytabla
"""
examples =[
["El articulo 55, ultimo párrafo , de la ley de Navegación y Comercio Marítimo no vulnera el principio de igualdad y no discriminación, pues la norma no contempla una autorización a los pilotos de puerto para prestar el servicio de lanchaje sin un permiso para ello."],
["Una persona promovió juicio de amparo indirecto contra el auto por el cual el presidente de la Junta fijó fecha lejana para llevar a cabo su reinstalación, ordenada en el laudo que le fue favorable, pues en su opinión, ello constituía una tardanza excesiva de proveer adecuadamente. Por su parte, el Juez Federal negó la suspensión provisional, al considerar que de concederse, los efectos dejarían sin materia una eventual sentencia protectora, dado que la restitución que aquél solicita coincidiría exactamente, en su caso, con los del fallo protector"],
["En un juicio ordinario civil, una persona moral ejerció acción reivindicatoria respecto de una fracción de un bien inmueble que refiere es de su propiedad, mientras que su contraparte aduce que es un bien del dominio público, al tratarse de un anexo que forma parte de un monumento histórico"],
["El artículo 47 DE LA LEY DEL REGISTRO CIVIL del menor a que se le registre inmediatamente después de su nacimiento, se le asigne un nombre y apellidos, se le respete su derecho a la identidad y filiación en un sentido de pertenencia con sus progenitores biológicos y se protejan su desarrollo y bienestar integral, al garantizársele y reconocérsele sus lazos familiares, prerrogativas que salvaguardan los artículos de la Carta Magna y de los tratados internacionales invocados."],
["Diversas personas, físicas y morales, promovieron juicio de amparo indirecto en contra de la imposición de un mecanismo de votación por cédula secreta sobre un dictamen de reforma constitucional local, atribuible a diversas autoridades adscritas al Poder Legislativo de una entidad federativa, al considerarlo violatorio de, entre otros, el derecho a la libertad de expresión, el acceso a la información pública y la transparencia parlamentaria."]
]
examples2 =[
["El articulo 55, ultimo párrafo , de la ley de Navegación y Comercio Marítimo no vulnera el principio de igualdad y no discriminación, pues la norma no contempla una autorización a los pilotos de puerto para prestar el servicio de lanchaje sin un permiso para ello."]
]
def get_entities(example):
model_name = "hackathon-pln-es/jurisbert-finetuning-ner"
tokenizer = AutoTokenizer.from_pretrained(model_name, add_prefix_space=True)
model = AutoModelForTokenClassification.from_pretrained(model_name)
token_classifier = pipeline("token-classification", aggregation_strategy="simple", model=model, tokenizer=tokenizer)
results = token_classifier(example.lower())
output = []
i=0
item = None
prev_item = None
next_item = None
while i < (len(results)):
item = results[i]
p=i-1
n=i+1
if p > 0:
prev_item = results[p]
if n<(len(results)):
next_item = results[n]
if (i==0):
if item["start"]>0:
output.extend([(example[0:item["start"]], None)])
output.extend([(example[item["start"]:item["end"]], item["entity_group"])])
if (next_item!=None):
##verificar el tramo entre actual y siguiente
if(item["end"]!=next_item["start"]):
output.extend([(example[item["end"]:next_item["start"]], None)])
i=i+1
if (item!=None):
if (item["end"] < len(example)):
output.extend([(example[item["end"]:len(example)], None)])
return output
def clasifica_sistema_universal(example):
tokenizer = AutoTokenizer.from_pretrained("hackathon-pln-es/jurisbert-class-tratados-internacionales-sistema-universal")
model = AutoModelForSequenceClassification.from_pretrained("hackathon-pln-es/jurisbert-class-tratados-internacionales-sistema-universal")
text_classifier = pipeline("text-classification", model=model, tokenizer=tokenizer)
results= text_classifier (example)
salida=[]
for i in results:
salida.append({i["label"]:i["score"]})
#return results[0]["label"], round(results[0]["score"], 5)
return {i["label"]: float(i["score"]) for i in results}
def clasifica_conv_americana(example):
tokenizer = AutoTokenizer.from_pretrained("hackathon-pln-es/jurisbert-clas-art-convencion-americana-dh")
model = AutoModelForSequenceClassification.from_pretrained("hackathon-pln-es/jurisbert-clas-art-convencion-americana-dh")
text_classifier = pipeline("text-classification", model=model, tokenizer=tokenizer)
results= text_classifier (example)
return {i["label"]: float(i["score"]) for i in results}
def similitud(example,example2):
model = SentenceTransformer("hackathon-pln-es/jurisbert-tsdae-sentence-transformer")
#Compute embedding for both lists
embeddings1 = model.encode(sentences1, convert_to_tensor=True)
embeddings2 = model.encode(sentences2, convert_to_tensor=True)
#Compute cosine-similarits
cosine_scores = util.cos_sim(embeddings1, embeddings2)
return float(cosine_scores[0])*100
def process(example,example2):
entidades = get_entities(example)
class_sistema_universal = clasifica_sistema_universal(example)
class_conv_americana = clasifica_conv_americana(example)
score_similitud = similitud(example,example2)
return entidades,class_sistema_universal, class_conv_americana, score_similitud
input_sen = gr.inputs.Textbox(lines=10, label="Proporcione el texto a analizar:")
input_sen2 = gr.inputs.Textbox(lines=10, label="Proporcione el texto a comparar:")
output_lbl1= gr.outputs.Label(label="Clasificación modelo convención americana:")
output_lbl2= gr.outputs.Label(label="Clasificación modelo sistema universal:")
output_txt= gr.outputs.Textbox(label="Porcentaje de similitud:")
#iface = gr.Interface(fn=process, inputs=input_sen, outputs=["highlight","label","label"], examples=examples, title=title, description = description)
iface = gr.Interface(fn=process, inputs=[input_sen, input_sen2], outputs=["highlight",output_lbl2,output_lbl2,output_txt], examples=examples, title=title, description = description)
iface.launch()