CoolFace
Apppublic

cmbtest/trendtopics

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
app.py117 linesDownload Raw Back to root
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()