File size: 8,070 Bytes
24c0918
 
8fb93f3
017bc4b
 
8fb93f3
24c0918
 
 
354f3df
64014ce
 
8fb93f3
 
 
 
1255f71
 
 
 
24c0918
8fb93f3
 
 
017bc4b
f5cd824
1255f71
 
 
 
 
 
f5cd824
 
 
8fb93f3
f5cd824
8fb93f3
017bc4b
8fb93f3
f5cd824
017bc4b
8fb93f3
017bc4b
f5cd824
017bc4b
 
 
 
 
 
 
 
8fb93f3
017bc4b
8fb93f3
 
 
 
 
 
017bc4b
8fb93f3
 
 
3f283be
24c0918
8fb93f3
24c0918
 
 
8fb93f3
 
 
 
 
24c0918
 
8fb93f3
 
3f283be
8fb93f3
24c0918
 
 
8fb93f3
 
24c0918
 
017bc4b
8fb93f3
24c0918
8fb93f3
 
3f283be
24c0918
 
8fb93f3
 
 
24c0918
 
 
 
 
8fb93f3
24c0918
8fb93f3
 
24c0918
 
1255f71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fb93f3
 
 
 
 
 
 
 
24c0918
8fb93f3
 
24c0918
3f283be
24c0918
 
8fb93f3
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
import gradio as gr
import re
from typing import List, Dict, Set
from difflib import SequenceMatcher
from datetime import datetime, timedelta
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class AssistenteBiblico:
    def __init__(self):
        self.dados_biblia = [
            {"referencia": "Filipenses 4:6-7", "texto": "Não andeis ansiosos por coisa alguma...", "palavras_chave": ["ansiedade", "paz"], "topicos": ["Ansiedade", "Paz"]},
            {"referencia": "1 Pedro 5:7", "texto": "Lancem sobre ele toda a sua ansiedade...", "palavras_chave": ["ansiedade", "cuidado"], "topicos": ["Ansiedade", "Confiança"]},
            {"referencia": "Efésios 6:4", "texto": "E vós, pais, não provoqueis vossos filhos...", "palavras_chave": ["filhos", "família"], "topicos": ["Família", "Educação"]},
            {"referencia": "1 Coríntios 13:4-7", "texto": "O amor é paciente, o amor é bondoso...", "palavras_chave": ["amor", "relacionamento"], "topicos": ["Amor", "Relacionamentos"]},
            {"referencia": "Efésios 5:25", "texto": "Maridos, amai vossas mulheres, como também Cristo amou a igreja...", "palavras_chave": ["casamento", "amor"], "topicos": ["Casamento", "Amor"]},
            {"referencia": "Gênesis 2:24", "texto": "Por isso, deixa o homem pai e mãe e se une à sua mulher, tornando-se os dois uma só carne.", "palavras_chave": ["casamento", "união"], "topicos": ["Casamento", "União"]},
            {"referencia": "Provérbios 31:10", "texto": "Mulher virtuosa, quem a achará? O seu valor muito excede o de rubis.", "palavras_chave": ["casamento", "virtude"], "topicos": ["Casamento", "Virtude"]}
        ]
        self.cache_pesquisa = {}
        self.max_cache_size = 100
        self.cache_expiry = timedelta(hours=24)
        
    def _expandir_palavras_chave(self, palavras: List[str]) -> Set[str]:
        sinonimos = {
            "ansiedade": ["preocupação", "aflição"], 
            "amor": ["afeição", "carinho"], 
            "família": ["parentes", "lar"],
            "casamento": ["matrimônio", "união", "casal", "cônjuge"]
        }
        expandidas = set(palavra.lower() for palavra in palavras)
        for palavra in palavras:
            if palavra in sinonimos:
                expandidas.update(sinonimos[palavra])
        return expandidas
        
    def calcular_relevancia(self, texto_busca: str, versiculo: Dict) -> float:
        if not texto_busca or not versiculo: return 0.0
        texto_busca = texto_busca.lower().strip()
        palavras_busca = set(re.findall(r'\w+', texto_busca))
        pesos = {'palavras_chave': 1.0, 'topicos': 0.8, 'texto': 0.3}
        pontuacao = 0.0
        matches_palavras = palavras_busca.intersection(set(v.lower() for v in versiculo['palavras_chave']))
        pontuacao += len(matches_palavras) * pesos['palavras_chave']
        matches_topicos = palavras_busca.intersection(set(v.lower() for v in versiculo['topicos']))
        pontuacao += len(matches_topicos) * pesos['topicos']
        similaridade_texto = SequenceMatcher(None, texto_busca, versiculo['texto'].lower()).ratio()
        pontuacao += similaridade_texto * pesos['texto']
        return pontuacao

    def buscar_versiculos(self, texto: str, max_versiculos: int = 3) -> List[Dict]:
        if not texto or max_versiculos < 1: return []
        cache_key = texto.lower().strip()
        if cache_key in self.cache_pesquisa and datetime.now() - self.cache_pesquisa[cache_key]['timestamp'] < self.cache_expiry:
            return self.cache_pesquisa[cache_key]['resultados']
        resultados = [(self.calcular_relevancia(texto, v), v) for v in self.dados_biblia]
        resultados.sort(reverse=True)
        versiculos = [v[1] for v in resultados[:max_versiculos]]
        self.cache_pesquisa[cache_key] = {'timestamp': datetime.now(), 'resultados': versiculos}
        if len(self.cache_pesquisa) > self.max_cache_size:
            chaves_antigas = sorted(self.cache_pesquisa.keys(), key=lambda k: self.cache_pesquisa[k]['timestamp'])[:-self.max_cache_size]
            for k in chaves_antigas: del self.cache_pesquisa[k]
        return versiculos

    def gerar_resposta(self, pergunta: str) -> str:
        if not pergunta: return "Por favor, forneça uma pergunta válida."
        try:
            versiculos = self.buscar_versiculos(pergunta)
            if not versiculos:
                return "🤔 Não encontrei versículos específicos para sua pergunta."
            resposta = "📖 Encontrei estas palavras de sabedoria:\n\n"
            for i, v in enumerate(versiculos, 1):
                resposta += f"#{i} {v['referencia']}\n{v['texto']}\n\n"
            resposta += "🙏 Reflita sobre estas palavras."
            return resposta
        except Exception as e:
            logger.error(f"Erro: {str(e)}")
            return "Desculpe, ocorreu um erro. Tente novamente."

def criar_interface():
    assistente = AssistenteBiblico()
    
    def processar_prompt(prompt: str, historico: List) -> List:
        if not prompt or len(prompt.strip()) < 3:
            return historico + [(prompt, "Por favor, digite uma pergunta mais detalhada.")]
        try:
            resposta = assistente.gerar_resposta(prompt)
            novo_historico = historico + [(prompt, resposta)]
            return novo_historico[-10:]  # Mantém últimas 10 interações
        except Exception as e:
            logger.error(f"Erro: {str(e)}")
            return historico + [(prompt, "Erro ao processar pergunta.")]

    with gr.Blocks(title="Assistente Bíblico") as demo:
        gr.HTML("""
            <div style="text-align:center; padding:20px; background:linear-gradient(135deg,#f0f8ff 0%,#e6f3ff 100%); border-radius:10px">
                <h1 style="color:#2c3e50">🙏 Conselheiro Bíblico</h1>
                <p style="color:#34495e">Encontre orientação nas Escrituras</p>
            </div>
        """)
        
        with gr.Row():
            with gr.Column(scale=2):
                chatbot = gr.Chatbot(height=500, label="Diálogo")
                with gr.Row():
                    msg = gr.Textbox(show_label=False, placeholder="Digite sua dúvida...")
                    clear = gr.Button("🔄 Recomeçar")
            
            with gr.Column(scale=1):
                gr.Markdown("### 📚 Perguntas sobre Casamento")
                perguntas_casamento = [
                    "Como ter um casamento abençoado?",
                    "Qual o papel do marido no casamento?",
                    "Qual o papel da esposa no casamento?",
                    "Como resolver conflitos no casamento?",
                    "O que a Bíblia diz sobre amor conjugal?",
                    "Como manter a união no casamento?",
                    "Como superar crises no casamento?",
                    "Como ter um casamento segundo Deus?",
                    "Como perdoar no casamento?",
                    "Como cultivar intimidade no casamento?"
                ]
                
                for pergunta in perguntas_casamento:
                    gr.Button(pergunta).click(
                        fn=processar_prompt,
                        inputs=[gr.Textbox(value=pergunta, visible=False), chatbot],
                        outputs=[chatbot]
                    )

                gr.Markdown("### 💡 Outras Sugestões")
                sugestoes = ["Como encontrar paz?", "Orientação para família", "Sobre amor e relacionamentos"]
                for sugestao in sugestoes:
                    gr.Button(sugestao).click(
                        fn=processar_prompt,
                        inputs=[gr.Textbox(value=sugestao, visible=False), chatbot],
                        outputs=[chatbot]
                    )

        msg.submit(processar_prompt, [msg, chatbot], [chatbot])
        clear.click(lambda: [], None, chatbot, queue=False)

    return demo

if __name__ == "__main__":
    demo = criar_interface()
    demo.launch(share=True, server_name="0.0.0.0", server_port=7860)