guicybercode commited on
Commit
0b9aac3
·
verified ·
1 Parent(s): ae1d7d1

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +81 -0
  2. 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