Spaces:
Running on Zero
Running on Zero
Download app.py from guicybercode/nl2bash-pt-explorer: direct link, hf CLI and curl.
- Browser
- Download file 3.27 kB
-
https://huggingface.co/spaces/guicybercode/nl2bash-pt-explorer/resolve/main/app.py
- Command line
-
hf download hf://spaces/guicybercode/nl2bash-pt-explorer/app.py
-
curl -L -o app.py https://huggingface.co/spaces/guicybercode/nl2bash-pt-explorer/resolve/main/app.py
3.27 kB
| import spaces | |
| def _zerogpu_noop(): | |
| # ZeroGPU exige uma função decorada; o app roda todo em CPU. | |
| return None | |
| """Explorador da amostra rotulada de nl2bash-pt (200 linhas, seed 42).""" | |
| from pathlib import Path | |
| import gradio as gr | |
| import pandas as pd | |
| DADOS = Path(__file__).parent / "dados" | |
| FONTES = ["nl2bash", "nl2sh-alfa"] | |
| CLASSES = ["OK", "ERRO_LEVE", "ERRO_GRAVE"] | |
| COLUNAS = { | |
| "en": "Original (inglês)", | |
| "pt": "Tradução", | |
| "comando": "Comando", | |
| "classe": "Classe", | |
| } | |
| def carregar(): | |
| return pd.read_csv(DADOS / "amostra_rotulada.csv", dtype=str, keep_default_na=False) | |
| def numeros_do_arquivo(): | |
| """Linhas de resultados.txt até antes das colunas de validação, sem alteração.""" | |
| linhas = (DADOS / "resultados.txt").read_text(encoding="utf-8").splitlines() | |
| fim = next(i for i, l in enumerate(linhas) if l.startswith("is_valid=")) | |
| return "\n".join(linhas[:fim]) | |
| def filtrar(fontes, classes, df=None): | |
| d = carregar() if df is None else df | |
| d = d[d["fonte"].isin(fontes) & d["classe"].isin(classes)] | |
| return d[list(COLUNAS)].rename(columns=COLUNAS).reset_index(drop=True) | |
| def contagem(fontes, classes): | |
| return f"{len(filtrar(fontes, classes))} de 200 linhas" | |
| TOPO = """ | |
| # nl2bash-pt: explorador da medição de erro de tradução | |
| Abaixo, o texto de `resultados.txt` exatamente como saiu da análise. Os percentuais e os | |
| intervalos de Wilson (IC 95%) usam ponto decimal, como no arquivo. Em resumo: 52 de 200 linhas | |
| (26,0%) com erro grave, IC 95% Wilson de 20,4% a 32,5%. | |
| """ | |
| METODO = """ | |
| ## Como a medição foi feita | |
| - A amostra tem 200 linhas aleatórias do split train, com seed 42 (`random_state=42`). | |
| - Os rótulos (OK, ERRO_LEVE, ERRO_GRAVE) são automatizados, sem revisão linha a linha. | |
| - A fronteira entre erro leve e erro grave é subjetiva. Traduzir literais de arquivo, caminho, | |
| string ou flag foi contado como grave, e um critério mais brando reduziria a taxa de grave. | |
| - A amostra não diz nada sobre cada linha individual: o rótulo de uma linha pode estar errado. | |
| ## Licença e créditos | |
| Licença do dataset: cc-by-4.0 (linhas de tldr-pages). Avisos MIT de NL2Bash e NL2SH-ALFA mantidos. | |
| - NL2Bash (Lin et al., LREC 2018): https://github.com/TellinaTool/nl2bash. Dados em MIT. | |
| - NL2SH-ALFA (MIT-ALFA, NAACL 2025): https://huggingface.co/datasets/westenfelder/NL2SH-ALFA. | |
| Licença MIT declarada. O NL2SH-ALFA agrega fontes com licenças diversas, entre elas | |
| tldr-pages (CC BY 4.0, com atribuição obrigatória) e fontes sem licença declarada. Não foi | |
| possível determinar quais linhas vieram de qual fonte. | |
| """ | |
| with gr.Blocks(title="nl2bash-pt: explorador") as demo: | |
| gr.Markdown(TOPO) | |
| gr.Code(value=numeros_do_arquivo(), language=None, interactive=False, label="resultados.txt") | |
| gr.Markdown(METODO) | |
| with gr.Row(): | |
| f = gr.CheckboxGroup(FONTES, value=FONTES, label="Fonte") | |
| c = gr.CheckboxGroup(CLASSES, value=CLASSES, label="Classe") | |
| n = gr.Markdown(contagem(FONTES, CLASSES)) | |
| t = gr.Dataframe(value=filtrar(FONTES, CLASSES), interactive=False, wrap=True) | |
| for comp in (f, c): | |
| comp.change(filtrar, [f, c], t) | |
| comp.change(contagem, [f, c], n) | |
| if __name__ == "__main__": | |
| demo.launch() | |