import gradio as gr import torch import json import pandas as pd import numpy as np from transformers import AutoTokenizer, RobertaForTokenClassification from transformers import AutoTokenizer, AutoModelForTokenClassification from transformers import AutoModelForSequenceClassification, AutoTokenizer from json import JSONEncoder from faker import Faker from keras.utils import pad_sequences import calendar class out_json(): def __init__(self, w,l): self.word = w self.label = l class MyEncoder(json.JSONEncoder): def default(self, obj): return { 'word': obj.word, 'label': obj.label } class Model: def __init__(self): self.texto="" self.idioma="" self.modelo_ner="" self.categoria_texto="" ## ### Función que aplica el modelo e identifica su idioma ### def identificacion_idioma(self,text): self.texto=text tokenizer = AutoTokenizer.from_pretrained("papluca/xlm-roberta-base-language-detection") model = AutoModelForSequenceClassification.from_pretrained("papluca/xlm-roberta-base-language-detection") inputs = tokenizer(text, padding=True, truncation=True, return_tensors="pt") with torch.no_grad(): logits = model(**inputs).logits preds = torch.softmax(logits, dim=-1) id2lang = model.config.id2label vals, idxs = torch.max(preds, dim=1) #retorna el idioma con mayor porcentaje maximo=vals.max() idioma='' porcentaje=0 for k, v in zip(idxs, vals): if v.item()==maximo: idioma,porcentaje=id2lang[k.item()],v.item() if idioma=='es': self.idioma="es" self.modelo_ner='BSC-LT/roberta_model_for_anonimization' self.faker_ = Faker('es_MX') self.model = RobertaForTokenClassification.from_pretrained(self.modelo_ner) else: self.idioma="en" self.faker_ = Faker('en_US') self.modelo_ner="dayannex/distilbert-tuned-4labels" self.model = AutoModelForTokenClassification.from_pretrained(self.modelo_ner) self.categorizar_texto(self.texto) def reordenacion_tokens(self,tokens,caracter): i=0 new_tokens=[] ig_tokens=[] for token in tokens: #print('token_texto:',token,caracter) ind=len(new_tokens) if i0: print('text') model.identificacion_idioma(texto[:1700]) labels, textoProcesado, labels_fake, coincidencia= model.predict(etiquetas) return model.idioma + "/" + model.categoria_texto,labels, textoProcesado,gr.Dataframe(),gr.File(),labels_fake, coincidencia else: if archivo.name.split(".")[1]=="csv": print('csv') #df=pd.read_csv(archivo.name,delimiter=";",encoding='latin-1') df=pd.read_csv(archivo.name,delimiter=";") df_new = pd.DataFrame( columns=df.columns.values) model.identificacion_idioma(df.iloc[0][0]) modelo.idioma=model.idioma print(model.idioma) for item in df.columns.values: sentences=df[item] ides, predicted = modelo.aplicar_modelo(sentences,model.idioma,etiquetas) out=modelo.salida_texto2( ides,predicted,etiquetas) print('out csv:',out) df_new[item] = modelo.unir_array(out) return modelo.idioma,"","", df_new, df_new.to_csv(sep='\t', encoding='utf-8',index=False),"","" else: print('json') if archivo.name.split(".")[1]=="json": util = utilJSON(archivo.name) df=util.obtener_dataframe(util.data) df_new = pd.DataFrame( columns=df.columns.values) model.identificacion_idioma(df.iloc[0][0]) modelo.idioma=model.idioma for item in df.columns.values: sentences=df[item] print('sen') ides, predicted = modelo.aplicar_modelo(sentences,modelo.idioma,etiquetas) print('ap') out=modelo.salida_texto2( ides,predicted,etiquetas) print('sa') print('out json:',out) df_new[item] = modelo.unir_array(out) print('un') return modelo.idioma,"","", df_new, df_new.to_csv(sep='\t', encoding='utf-8',index=False),"","" demo = gr.Interface(fn=procesar,inputs=["text",gr.File(), "checkbox"] , outputs=[gr.Label(label="idioma/categoría"),gr.Textbox(label="etiquetas"),gr.Textbox(label="texto procesado"),gr.Dataframe(label="Datos procesados en dataframe",interactive=False),gr.Textbox(label="datos csv"),gr.Textbox(label="etiquetas anonimizadas"),gr.Label(label="coincidencia tokens originales vs anonimizados")]) # demo.launch(share=True)