Spaces:
Sleeping
Sleeping
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) |