Pipeline reprodutível de Language Identification (LID) cobrindo 22+ línguas, com foco em simplicidade, robustez e rastreabilidade. O projeto entrega um fluxo completo: EDA, split estratificado por grupos (hash do texto normalizado, para evitar vazamento), seleção de modelos via GridSearchCV / HalvingGridSearchCV, diagnósticos anti-overfitting (OOF, learning curve, Y‑scramble), métricas por classe e por grupo de script (Latin/CJK/Árabe etc.), Top‑3 accuracy, salvamento de artefatos e metadados.
Código principal:
lid22.py(executável direto)
Dataset: Kaggle — language-identification-datasst (Zara Jamshaid). O download é automático via kagglehub ou você pode definir o caminho manualmente viaLANGID_CSV.
- Python 3.9+
- Núcleo:
pandas,numpy,scikit-learn,matplotlib,joblib,kagglehub - Opcionais (ativados automaticamente se instalados):
gensim→ Word2Vec/Doc2Vecxgboost→ XGBoost (comXGB_USE_GPU=1paragpu_hist, se houver GPU)
Ao rodar o script, a pasta artifacts/ é criada com:
artifacts/
├── run_YYYYmmdd-HHMMSS.txt # log completo da execução
├── plots_YYYYmmdd-HHMMSS/ # todas as figuras geradas (EDA, matrizes, etc.)
├── cv_results_<experimento>.csv # resultados do GridSearch por experimento
├── validation_results.csv # leaderboard de validação (macro‑F1)
├── classification_report_test_<best>.json # relatório no TEST
├── errors_test_<best>.csv # amostras de erros (por par y_true/y_pred)
├── best_langid_<best>.joblib # pipeline final salvo (train+val → test)
├── diag_text_leakage.json # duplicatas e *leakage* entre splits
├── oof_report_<best>.json # OOF (F1 macro + relatório)
├── learning_curve_<best>.csv # learning curve (F1 macro) + figura
├── diag_y_scramble_<best>.csv # distribuição de scores com rótulos embaralhados
└── metadata_ext.json # metadados consolidados do experimento
As figuras (EDA, matrizes de confusão “bruta” e normalizada, confusão por script, barras de F1 etc.) entram em
plots_*automaticamente.
Sempre disponíveis
- TF‑IDF (caracteres 2–5) + LinearSVC
- TF‑IDF (palavras 1–2) + LogisticRegression
Se as libs estiverem instaladas
- CountVectorizer (caracteres) + MultinomialNB
- Word2Vec/Doc2Vec (via
gensim) + LogisticRegression - TF‑IDF (palavras) → SVD → XGBoost (multi‑classe), com suporte a GPU
Cada experimento é ajustado por grid e comparado por macro‑F1 na validação. O melhor é refit em train+val e avaliado no TEST.
- Accuracy, F1 macro/micro (val/test)
- Top‑3 accuracy
- Relatório por classe + matriz de confusão (bruta e normalizada)
- Métricas agregadas por script (Latin, CJK, Árabe etc.) e confusão por script
- Anti-overfitting: OOF (out‑of‑fold), learning curve, Y‑scramble (múltiplas repetições)
# 1) Crie um ambiente
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activate
# 2) Instale dependências
pip install -U pandas numpy scikit-learn matplotlib joblib kagglehub
# (opcionais)
pip install -U gensim xgboostPara baixar do Kaggle via
kagglehub, configure suas credenciais do Kaggle (ou baixe o CSV manualmente e aponteLANGID_CSV).
python lid22.py# Windows (PowerShell)
$env:LANGID_CSV="C:\caminho\para\language.csv"; python lid22.py
# macOS/Linux
LANGID_CSV=/caminho/para/language.csv python lid22.pyDurante a execução você verá: amostras, colunas detectadas, EDA, grid por experimento, leaderboard de validação, avaliação final no TEST, diagnósticos anti‑overfitting e caminhos dos artefatos salvos.
| Variável | Default | Descrição |
|---|---|---|
LANGID_CSV |
— | Caminho para o CSV (se não quiser usar kagglehub). |
RUN_HEAVY |
1 |
Ativa modelos “pesados”/extras (NB, W2V/D2V, XGB…). Use 0 p/ rodar só o essencial. |
SKIP_EDA |
0 |
Pula as análises/plots exploratórios. |
CV_FOLDS |
3 |
Número de dobras no CV. |
SEARCH_SUBSAMPLE |
0 |
Se >0, usa apenas N exemplos do train no grid (rápido p/ smoke test). |
GS_N_JOBS |
CPU |
Workers no grid. (loky) |
USE_HALVING |
0 |
Usa HalvingGridSearchCV (se disponível). |
SPLIT_BY_GROUPS |
1 |
Split 80/10/10 estratificado por grupos (hash do texto) → evita vazamento. |
ANTI_OVERFITTING |
1 |
Executa OOF, learning curve e Y‑scramble. |
Y_SCRAMBLE_N |
5 |
Nº de repetições no Y‑scramble. |
CALIB_AT_END |
0 |
Calibra LinearSVC com CalibratedClassifierCV (sigmoid, cv=3). |
XGB_USE_GPU |
0 |
Define gpu_hist/gpu_predictor no XGBoost (se GPU disponível). |
W2V_WORKERS |
1 |
Workers para treinar Word2Vec/Doc2Vec. |
SKL_CACHE |
— | Cache do Pipeline. No Windows é desabilitado por padrão p/ evitar PicklingError. |
Depois de uma execução, carregue o melhor pipeline salvo:
import joblib
pipe = joblib.load("artifacts/best_langid_<melhor_experimento>.joblib")
textos = [
"A vida é bela e a modelagem de dados é fascinante.",
"The quick brown fox jumps over the lazy dog.",
"هذا مثال لجملة قصيرة باللغة العربية."
]
preds = pipe.predict(textos)
print(list(zip(textos, preds)))O script também imprime predições em 5 frases de exemplo ao final do
main.
- Normalização NFKC + casefold heurístico (para textos latinos)
- Padronização de rótulos (ex.: “Portugese” → “Portuguese”)
- Split por grupos (hash de texto normalizado) para evitar duplicatas cruzando splits
- Relatórios detalhados + amostras de erros por par (y_true/y_pred)
- Métricas por script para entender confusões entre famílias de escrita
- Falha no download Kaggle (
kagglehub) → Baixe manualmente e definaLANGID_CSV. - Sem
xgboost/gensim→ Eles são opcionais; o script executa os básicos (TF‑IDF + LinearSVC/LogReg). - Windows / erro de pickle no cache → O cache do
Pipelineé desligado automaticamente no Windows. - Execução rápida:
SKIP_EDA=1 RUN_HEAVY=0 SEARCH_SUBSAMPLE=5000 python lid22.py.
Respeita a licença e termos do dataset no Kaggle.
Baseado no script lid22.py com foco em reprodutibilidade, diagnóstico anti‑overfitting e rastreabilidade de artefatos.