cmbtest/trendtopics
0
1import gradio as gr2import pandas as pd3import requests4import os5import time6from collections import Counter7from io import StringIO8 9# =====================================================10# CONFIGURAÇÃO11# =====================================================12MODEL_ID = "dslim/bert-base-NER"13API_URL = f"https://router.huggingface.co/{MODEL_ID}"14 15HF_API_TOKEN = os.getenv("HF_API_TOKEN")16if not HF_API_TOKEN:17 raise RuntimeError("HF_API_TOKEN não encontrado. Configure em Settings → Secrets.")18 19HEADERS = {20 "Authorization": f"Bearer {HF_API_TOKEN}",21 "Content-Type": "application/json"22}23 24# =====================================================25# FUNÇÃO PRINCIPAL26# =====================================================27def analyze_abstracts(csv_text):28 29 # ---------- Ler CSV ----------30 try:31 df = pd.read_csv(StringIO(csv_text))32 except Exception as e:33 return pd.DataFrame(34 [["Erro ao ler CSV", str(e), ""]],35 columns=["Term", "Frequency", "Hot"]36 )37 38 if "abstract" not in df.columns:39 return pd.DataFrame(40 [["Erro", "Coluna 'abstract' não encontrada", ""]],41 columns=["Term", "Frequency", "Hot"]42 )43 44 all_terms = []45 46 # ---------- Processar abstracts ----------47 for abstract in df["abstract"].dropna():48 49 payload = {50 "inputs": abstract,51 "parameters": {52 "aggregation_strategy": "simple"53 },54 "options": {55 "wait_for_model": True56 }57 }58 59 try:60 response = requests.post(API_URL, headers=HEADERS, json=payload, timeout=60)61 result = response.json()62 63 # Caso modelo ainda esteja carregando64 if isinstance(result, dict) and "error" in result:65 print("Aviso da API:", result)66 continue67 68 # Caso correto69 if isinstance(result, list):70 for ent in result:71 term = ent.get("word", "").strip().lower()72 if len(term) > 2:73 all_terms.append(term)74 75 except Exception as e:76 print("Erro na requisição:", e)77 continue78 79 if not all_terms:80 return pd.DataFrame(81 [["Nenhum termo médico encontrado (verifique logs da API)", "", ""]],82 columns=["Term", "Frequency", "Hot"]83 )84 85 # ---------- Frequência ----------86 term_counts = Counter(all_terms)87 df_terms = (88 pd.DataFrame(term_counts.items(), columns=["Term", "Frequency"])89 .sort_values(by="Frequency", ascending=False)90 .reset_index(drop=True)91 )92 93 # ---------- Hot terms ----------94 threshold = df_terms["Frequency"].quantile(0.90)95 df_terms["Hot"] = df_terms["Frequency"] >= threshold96 97 return df_terms98 99# =====================================================100# INTERFACE101# =====================================================102interface = gr.Interface(103 fn=analyze_abstracts,104 inputs=gr.Textbox(105 lines=18,106 placeholder="Cole aqui seu CSV com colunas: date,abstract"107 ),108 outputs=gr.Dataframe(),109 title="Medical Hot Terms Analyzer",110 description=(111 "Extrai termos médicos de abstracts usando PubMedBERT (NER) "112 "e identifica hot terms (top 10%)."113 ),114)115 116if __name__ == "__main__":117 interface.launch()