File size: 4,335 Bytes
243307b
d787566
 
243307b
8eb0b06
243307b
 
 
 
fa49f33
243307b
 
 
 
 
 
 
f1decb3
 
 
c3eabb9
2ce2556
 
 
 
 
 
 
 
c3eabb9
2ce2556
 
ebe7859
2ce2556
 
 
ebe7859
 
 
 
2ce2556
 
 
 
f1decb3
 
ebe7859
243307b
 
8eb0b06
 
243307b
 
8eb0b06
243307b
 
 
 
 
 
8eb0b06
243307b
 
 
 
 
 
 
 
ebe7859
f1decb3
243307b
8eb0b06
f1decb3
 
ebe7859
243307b
f1decb3
 
 
 
 
 
 
 
 
ebe7859
 
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
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import gradio as gr

import torch

first_generation = True
prefix = ''
device = 'cuda' if torch.cuda.is_available() else 'cpu'

model_checkpoint = "hackathon-pln-es/es_text_neutralizer"

tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)

model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)
# TODO: jarl!! check this for avoiding short segments
model.config.max_length = 512
model.to(device)



def postproc(input_sentence, preds):
    try:
        preds = preds.replace('De el', 'Del').replace('de el', 'del').replace('  ', ' ')
        if preds[0].islower():
            preds = preds.capitalize()
        preds = preds.replace(' . ', '. ').replace(' , ', ', ')

        # Nombres en mayusculas
        prev_letter = ''
        for word in input_sentence.split(' '):
            if word:
                if word[0].isupper():
                    if word.lower() in preds and word != input_sentence.split(' ')[0]:
                        if prev_letter == '.':
                            preds = preds.replace('. ' + word.lower() + ' ', '. ' + word + ' ')
                        else:
                            if word[-1] == '.':
                                preds = preds.replace(word.lower(), word)
                            else:
                                preds = preds.replace(word.lower() + ' ', word + ' ')
                prev_letter = word[-1]
        preds = preds.strip()  # quitar ultimo espacio
    except:
        pass
    return preds


# sentences = ["El libro relata las aventuras y desventuras de un hidalgo de 50 años llamado Alonso Quijano, quien decide ser un caballero andante como aquellos que aparecen en sus libros de caballerías favoritos.Las hazañas de don Quijote están contenidas en dos tomos que narran tres salidas. Por un lado, la “Primera parte” denominada como El ingenioso Hidalgo Don Quijote de la Mancha está formada por 52 capítulos y en ella se encuentran la primera salida y la segunda salida."]
# sentences = ['De acuerdo con las informaciones anteriores , las alumnas se han quejado de la actitud de los profesores en los exámenes finales. Los representantes estudiantiles son los alumnos Juanju y Javi.']
def get_output(sentence, first_generation=True):
    inputs = tokenizer([prefix + sentence], return_tensors="pt", padding=True)
    with torch.no_grad():
        if first_generation:
            output_sequence = model.generate(
                input_ids=inputs["input_ids"].to(device),
                attention_mask=inputs["attention_mask"].to(device),
                do_sample=False,  # disable sampling to test if batching affects output
            )
        else:

            output_sequence = model.generate(
                input_ids=inputs["input_ids"].to(device),
                attention_mask=inputs["attention_mask"].to(device),
                do_sample=False,  
                num_beams=2,
                repetition_penalty=2.5, 
                # length_penalty=1.0, 
                early_stopping=True# disable sampling to test if batching affects output
            )
    preds = postproc(sentence,
                     preds=tokenizer.decode(output_sequence[0], skip_special_tokens=True, clean_up_tokenization_spaces=True))
    return preds

examples=['De acuerdo con las informaciones anteriores , las alumnas se han quejado de la actitud de los profesores en los exámenes finales. Los representantes estudiantiles son los alumnos Juanju y Javi.',
          'Durante su ingreso no debe tomar agua que no le sea suministrada por los especialistas en su cirujía',
          'Debido a esto ,  el premio se asignará  a los candidatos seleccionados en tres pagos']

iface = gr.Interface(fn=get_output, 
                     title="Spanish Text Neutralization app",
                     description="The purpose of this app is to transform Spanish gendered text into a neutral version, suitable for an unbiased environment",
                     examples=examples,
                     # inputs="text",
                     inputs=gr.inputs.Textbox(label="Introduce some Spanish text here"),
                     # outputs="text",
                     outputs=gr.outputs.Textbox(label="Neutral version of your text")
                    )

iface.launch()