bot-biblico / app.py
DHEIVER's picture
Update app.py
1255f71 verified
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)