File size: 4,783 Bytes
d665c22
fcb0322
 
8bf558e
fcb0322
 
 
d665c22
fcb0322
 
 
 
 
 
 
 
b564db7
fcb0322
 
987baef
fcb0322
 
 
 
 
 
 
8bf558e
fcb0322
 
 
 
 
8bf558e
 
fcb0322
8bf558e
 
 
fcb0322
 
 
987baef
fcb0322
 
 
 
8bf558e
 
 
 
 
 
fcb0322
8bf558e
fcb0322
8bf558e
fcb0322
 
 
 
 
8bf558e
 
fcb0322
8bf558e
 
 
 
 
 
fcb0322
 
 
987baef
fcb0322
 
987baef
8bf558e
fcb0322
8bf558e
 
fcb0322
 
 
 
 
 
8bf558e
fcb0322
 
 
 
8bf558e
 
 
fcb0322
 
 
 
 
987baef
fcb0322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from transformers import (
    AutoTokenizer, 
    AutoModelForSeq2SeqLM,
    T5ForConditionalGeneration, 
    T5Tokenizer
)

# Initialize session state for models if not already done
if 'models_loaded' not in st.session_state:
    # Load the main T5 model and tokenizer (using t5-base for better quality)
    st.session_state.t5_tokenizer = T5Tokenizer.from_pretrained("t5-base")
    st.session_state.t5_model = T5ForConditionalGeneration.from_pretrained("t5-base")
    
    # Load the paraphrasing model and tokenizer
    st.session_state.paraphrase_tokenizer = AutoTokenizer.from_pretrained("facebook/bart-large-cnn")
    st.session_state.paraphrase_model = AutoModelForSeq2SeqLM.from_pretrained("facebook/bart-large-cnn")
    
    st.session_state.models_loaded = True

def paraphrase_text(text):
    """
    Apply paraphrasing to the input text using BART model
    """
    inputs = st.session_state.paraphrase_tokenizer.encode(
        text,
        return_tensors="pt",
        max_length=1024,  # Aumentado para textos maiores
        truncation=True
    )
    
    outputs = st.session_state.paraphrase_model.generate(
        inputs,
        max_length=1024,
        min_length=len(text.split()) - 10,  # Garante tamanho mínimo próximo ao original
        do_sample=True,
        temperature=0.3,  # Reduzido para manter mais fiel ao original
        top_p=0.95,      # Aumentado para mais diversidade controlada
        repetition_penalty=1.2  # Evita repetições
    )
    
    return st.session_state.paraphrase_tokenizer.decode(outputs[0], skip_special_tokens=True)

def humanize_text(text):
    """
    Humanize the input text using T5 model
    """
    # Modificado o prompt para enfatizar português e manter o contexto
    prompt = (
        f"reescreva o seguinte texto em português de forma mais natural e humana, "
        f"mantendo todas as informações originais: {text}"
    )
    
    input_ids = st.session_state.t5_tokenizer(
        prompt,
        return_tensors="pt",
        max_length=1024,
        truncation=True
    ).input_ids
    
    outputs = st.session_state.t5_model.generate(
        input_ids,
        max_length=1024,
        min_length=len(text.split()) - 10,  # Garante tamanho mínimo próximo ao original
        do_sample=True,
        temperature=0.3,  # Reduzido para manter mais fiel ao original
        top_p=0.95,      # Aumentado para mais diversidade controlada
        num_beams=5,     # Aumentado para melhor qualidade
        no_repeat_ngram_size=3,  # Evita repetições de trigramas
        repetition_penalty=1.2,  # Penalidade para repetições
        length_penalty=1.0   # Incentiva manter o tamanho similar
    )
    
    return st.session_state.t5_tokenizer.decode(outputs[0], skip_special_tokens=True)

# UI Components
st.set_page_config(page_title="Advanced Text Humanizer", page_icon="🤖")

st.title("🤖 → 🧑 Humanizador de Texto Avançado")
st.markdown("""
Este aplicativo transforma textos robotizados em linguagem mais natural e humana, 
mantendo todas as informações originais.
""")

# Input area with expanded capabilities
input_text = st.text_area(
    "Cole seu texto de robô aqui:",
    height=150,
    help="Cole seu texto aqui para transformá-lo em uma versão mais natural e humana."
)

# Advanced settings in sidebar
with st.sidebar:
    st.header("Configurações Avançadas")
    use_paraphrase = st.checkbox("Ativar Paráfrase", value=True)
    show_original = st.checkbox("Mostrar Texto Original", value=False)

# Process button with error handling
if st.button("Humanizar", type="primary"):
    if not input_text:
        st.warning("⚠️ Por favor, cole um texto de robô primeiro!")
    else:
        with st.spinner("Processando o texto..."):
            try:
                # First humanization pass
                humanized_text = humanize_text(input_text)
                
                # Optional paraphrasing pass
                if use_paraphrase:
                    final_text = paraphrase_text(humanized_text)
                else:
                    final_text = humanized_text
                
                # Display results
                st.success("✨ Texto humanizado:")
                if show_original:
                    st.text("Texto original:")
                    st.info(input_text)
                st.markdown("**Resultado:**")
                st.write(final_text)
                
            except Exception as e:
                st.error(f"❌ Ocorreu um erro durante o processamento: {str(e)}")

# Footer
st.markdown("---")
st.markdown(
    """
    <div style='text-align: center'>
        <small>Desenvolvido com ❤️ usando Streamlit e Transformers</small>
    </div>
    """,
    unsafe_allow_html=True
)