Spaces:
Running on Zero
Running on Zero
Upload 2 files
Browse files- app.py +81 -0
- requirements.txt +2 -0
app.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Explorador da amostra rotulada de nl2bash-pt (200 linhas, seed 42)."""
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
|
| 4 |
+
import gradio as gr
|
| 5 |
+
import pandas as pd
|
| 6 |
+
|
| 7 |
+
DADOS = Path(__file__).parent / "dados"
|
| 8 |
+
FONTES = ["nl2bash", "nl2sh-alfa"]
|
| 9 |
+
CLASSES = ["OK", "ERRO_LEVE", "ERRO_GRAVE"]
|
| 10 |
+
COLUNAS = {
|
| 11 |
+
"en": "Original (inglês)",
|
| 12 |
+
"pt": "Tradução",
|
| 13 |
+
"comando": "Comando",
|
| 14 |
+
"classe": "Classe",
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def carregar():
|
| 19 |
+
return pd.read_csv(DADOS / "amostra_rotulada.csv", dtype=str, keep_default_na=False)
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def numeros_do_arquivo():
|
| 23 |
+
"""Linhas de resultados.txt até antes das colunas de validação, sem alteração."""
|
| 24 |
+
linhas = (DADOS / "resultados.txt").read_text(encoding="utf-8").splitlines()
|
| 25 |
+
fim = next(i for i, l in enumerate(linhas) if l.startswith("is_valid="))
|
| 26 |
+
return "\n".join(linhas[:fim])
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def filtrar(fontes, classes, df=None):
|
| 30 |
+
d = carregar() if df is None else df
|
| 31 |
+
d = d[d["fonte"].isin(fontes) & d["classe"].isin(classes)]
|
| 32 |
+
return d[list(COLUNAS)].rename(columns=COLUNAS).reset_index(drop=True)
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
def contagem(fontes, classes):
|
| 36 |
+
return f"{len(filtrar(fontes, classes))} de 200 linhas"
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
TOPO = """
|
| 40 |
+
# nl2bash-pt: explorador da medição de erro de tradução
|
| 41 |
+
|
| 42 |
+
Abaixo, o texto de `resultados.txt` exatamente como saiu da análise. Os percentuais e os
|
| 43 |
+
intervalos de Wilson (IC 95%) usam ponto decimal, como no arquivo. Em resumo: 52 de 200 linhas
|
| 44 |
+
(26,0%) com erro grave, IC 95% Wilson de 20,4% a 32,5%.
|
| 45 |
+
"""
|
| 46 |
+
|
| 47 |
+
METODO = """
|
| 48 |
+
## Como a medição foi feita
|
| 49 |
+
|
| 50 |
+
- A amostra tem 200 linhas aleatórias do split train, com seed 42 (`random_state=42`).
|
| 51 |
+
- Os rótulos (OK, ERRO_LEVE, ERRO_GRAVE) são automatizados, sem revisão linha a linha.
|
| 52 |
+
- A fronteira entre erro leve e erro grave é subjetiva. Traduzir literais de arquivo, caminho,
|
| 53 |
+
string ou flag foi contado como grave, e um critério mais brando reduziria a taxa de grave.
|
| 54 |
+
- A amostra não diz nada sobre cada linha individual: o rótulo de uma linha pode estar errado.
|
| 55 |
+
|
| 56 |
+
## Licença e créditos
|
| 57 |
+
|
| 58 |
+
Licença declarada: MIT, sujeita a verificação.
|
| 59 |
+
|
| 60 |
+
- NL2Bash (Lin et al., LREC 2018): https://github.com/TellinaTool/nl2bash. Dados em MIT.
|
| 61 |
+
- NL2SH-ALFA (MIT-ALFA, NAACL 2025): https://huggingface.co/datasets/westenfelder/NL2SH-ALFA.
|
| 62 |
+
Licença MIT declarada. O NL2SH-ALFA agrega fontes com licenças diversas, entre elas
|
| 63 |
+
tldr-pages (CC BY 4.0, com atribuição obrigatória) e fontes sem licença declarada. Não foi
|
| 64 |
+
possível determinar quais linhas vieram de qual fonte.
|
| 65 |
+
"""
|
| 66 |
+
|
| 67 |
+
with gr.Blocks(title="nl2bash-pt: explorador") as demo:
|
| 68 |
+
gr.Markdown(TOPO)
|
| 69 |
+
gr.Code(value=numeros_do_arquivo(), language=None, interactive=False, label="resultados.txt")
|
| 70 |
+
gr.Markdown(METODO)
|
| 71 |
+
with gr.Row():
|
| 72 |
+
f = gr.CheckboxGroup(FONTES, value=FONTES, label="Fonte")
|
| 73 |
+
c = gr.CheckboxGroup(CLASSES, value=CLASSES, label="Classe")
|
| 74 |
+
n = gr.Markdown(contagem(FONTES, CLASSES))
|
| 75 |
+
t = gr.Dataframe(value=filtrar(FONTES, CLASSES), interactive=False, wrap=True)
|
| 76 |
+
for comp in (f, c):
|
| 77 |
+
comp.change(filtrar, [f, c], t)
|
| 78 |
+
comp.change(contagem, [f, c], n)
|
| 79 |
+
|
| 80 |
+
if __name__ == "__main__":
|
| 81 |
+
demo.launch()
|
requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio>=5.0
|
| 2 |
+
pandas
|