alshehriamal1994/daleel2026-durham-jazan

Durham-Jazan at Daleel 2026 (ArabicNLP/EMNLP 2026): domain-routed Arabic argument mining — code + LLM-synthetic data (segment-concatenation span generation)

Python

0

61 commits

updated Sep 3, 2026

See the code

README

Durham-Jazan at Daleel 2026

This repository accompanies the Durham-Jazan system description paper for the Daleel 2026 shared task on Arabic Argumentative Discourse Mining (ArabicNLP 2026, held with EMNLP 2026). It contains our code, our synthetic training data, and the scripts behind every figure and analysis in the paper.

Paper: Durham-Jazan at Daleel 2026: Domain-Routed Ensembles, LLM Augmentation, and the Limits of Decision-Rule Tuning for Arabic Argument Mining. Amal Saad Alshehri, Nelly Bencomo, Housam Babiker, and Amir Atapour-Abarghouei.

A gold span annotation from the development set

The central finding of our participation is summarised in one figure. Changes to the model or its data delivered what validation promised, while tuning of the decision rules on top did not.

Promised and delivered gains for each intervention

Two further findings come from post-submission analysis. Per-label performance on editorials tracks how much of that label's training data came from editorials, which explains the editorial deficit every team suffered, and threshold recalibration gains measured on the tuning half do not survive on held-out data.

Genre skew and threshold transfer

A short demonstration

The paper introduces segment-concatenation generation, a recipe that lets a large language model produce span-annotated training data with exact character offsets and no alignment step. The following command builds and verifies one such paragraph from the data in this repository.

python demo_segment_concat.py

Final official results

Taken from the organisers' official results sheet. Ed and Db are the editorial and debate columns. The entrant count excludes the organisers' baseline.

TrackScoreEdDbRankWinner
Task 2 Closed0.729 overlap-F10.6100.7626th of 80.755
Task 2 Open0.736 overlap-F10.6270.7662nd of 20.755
Task 1 Closed0.657 macro-F10.5010.7415th of 100.712
Task 1 Open0.669 macro-F10.5010.7622nd of 30.712

In the development phase we finished first on both Open leaderboards. The evaluation-phase ranks above are the final official standings and include submissions made after ours.

Setup

pip install -r requirements.txt

The official task data and scoring scripts are not redistributed here. They are available from the organisers through the task pages at https://qatardebate.org/programs/academic-programs/daleel2026-shared-task and CodaBench. Place train_task_1.jsonl, train_task_2.jsonl, dev_in.jsonl, dev_task_1_ref.jsonl, dev_task_2_ref.jsonl, and related files under data/.

The scripts in paper_analysis/ and src/ resolve their paths against the repository root, so they can be run from any working directory and will look for their inputs in the data/, oof/, and preds/ layout used in the paper. DALEEL_ROOT overrides the repository root as a whole rather than the data directory alone, so point it only at a tree that also holds oof/, preds/ and configs/. To keep the organisers' files elsewhere, symlink them into data/ instead:

export DALEEL_ROOT=/path/to/a/full/copy/of/this/repository

Two further dependencies are on the organisers' Task 2 scorer, which we do not redistribute. Five scripts in src/ (ensemble_task2.py, ensemble_task2_camel.py, ensemble_task2_marbert.py, t2_open_eval.py, train_task2_cv.py) import it as task2_scoring, so place the organisers' task2_scoring.py inside src/. Three others (t2_blend_build.py, t2_blend_oof_exp.py, t2_closed_recal.py) invoke it as a file and read its location from DALEEL_SCORER:

export DALEEL_SCORER=/path/to/task2_scoring.py

What is included alongside the code

oof/ contains the model outputs behind the paper's analyses: out-of-fold probabilities and character offsets, and the saved seed-curve and genre-transfer results. These are our own numbers and carry no corpus text, so they are released in full.

preds/ holds our development-set predictions. The Task 1 files are label sets only. The Task 2 files carry labels and character offsets with the span text removed, because that text is the organisers' corpus and is theirs to distribute. Removing it changes no result: every analysis below works from labels and offsets.

Synthetic data

The data/ directory holds the synthetic training data generated with a proprietary large language model. All of it is machine-generated: the statistics inside synthetic ST spans are plausible but invented, so the files are unsuitable as factual text. It was used in training only, and thresholds and all held-out evaluation used real data exclusively. For Task 2 the paragraphs were authored as ordered labelled segments and joined with single spaces, so the character offsets are exact by construction (paper, Section 3.3).

FileTaskContents
synth_all.jsonl1171 multi-label paragraphs (development phase)
synth_v2/1 and 2evaluation-phase additions (Task 1 grows to 291 in total)
synth2_all.jsonl288 span-annotated paragraphs (development phase)
synth2_v2_built.jsonl270 further span-annotated paragraphs with verified offsets, giving 158 in total

The four systems at a glance (solid boxes are the Closed track, dashed the Open-track additions):

Pipeline diagram of the four systems

Post-submission analyses

The paper_analysis/ scripts are the code behind the paper's figures and appendix tables. Run them from anywhere, for example:

python paper_analysis/threshold_transfer.py

Six of them need nothing beyond this repository:

ScriptReproduces
synth_agreement.pythe blind re-annotation of the synthetic data: 79.0% exact agreement, micro-F1 0.94, per-label kappa 0.61 (TE) to 1.00 (ST) (Appendix B)
human_eval/score_human_eval.pythe blind human check of 30 synthetic paragraphs: micro-F1 0.84, kappa 1.00 (ST) and 0.93 (CO), naturalness 2.93 of 3 (Appendix B). The label-hidden sheet, the filled annotation, the key, and make_sheet_small.py sit beside it
ranking_analysis.pywhich domain decided the shared task, from the organisers' published ranking sheet (Appendix E)
transfer_plot.pyFigure 4, promised against delivered for all eighteen audited interventions
pipeline_fig.pyFigure 2, the pipeline diagram
demo_segment_concat.pythe segment-concatenation demonstration above

Three more need only the organisers' Task 1 files in data/, because the out-of-fold predictions they run on (oof/t1_recal_oof_closed.npy) are included here:

ScriptReproduces
threshold_transfer.pyTable 7, the controlled recalibration experiment
findings_fig.pyFigure 5, both post-submission findings
union_holdout_check.pythe post-submission check of the three-seed Qwen3-32B union on the controlled holdout, from the retained seed predictions in oof/ (Appendix A)

Four more need the organisers' files in data/, together with our dev predictions, which are now included under preds/:

ScriptReproduces
analysis.pyTable 2, per-class dev F1, and the bootstrap intervals
error_taxonomy.pyTables 8 and 9, the span and label error taxonomies
genre_gap.pyTable 10 and the editorial-share analysis behind Figure 5 (left)
mine_interesting.pythe exploratory scan that located the paper's Arabic examples

The last four need more than this repository provides:

ScriptReproducesAlso needs
make_figures.pyFigures 1, 3, 6, 7, 8, and 9, the Arabic examplesheadless Chrome and Ghostscript
threshold_transfer_t2.pythe Task 2 replication of Table 7oof/t2_gold_all.jsonl, which is organisers' gold and must be regenerated
ensemble_curve.pythe seed-variance figures of Appendix Aa GPU, and trains eight seeds
genre_transfer.pyTable 11, the size-matched genre experimenta GPU, and trains nine models

The dev predictions under preds/ are our own model outputs rather than task data. The Task 1 files are label sets. The Task 2 files keep labels and character offsets but not the span text, which belongs to the organisers' corpus. No analysis here reads that field, and removing it leaves every reported number unchanged. Figure output goes to figs/, and the Arabic examples to paper_analysis/.

Reproducing the final systems

SystemKey scripts
Task 2 Closed (0.729)dapt_v2.py and dapt_v2_marbert.py for the encoders, train_task2_cv.py with ensemble_task2_camel.py and ensemble_task2_marbert.py for the per-domain thresholds, then test_task2_closed_v3.py for the domain-routed decode, which it writes uncompacted. The span compaction that earned the submitted score is the decoder inside t2_closed_recal.py
Task 2 Open (0.736)the same encoders, then t2_open_recal_apply.py to add the synthetic spans and save test probabilities, then t2_blend_build.py for the char-level blend and the compaction
Task 1 Closed (0.657)dapt_v2.py for domain-adaptive pretraining, backtranslate.py, backtranslate_multi.py and dev_bt_gen.py for the back-translations, t1_recal.py closed for the encoder ensemble and its recalibrated thresholds, t1_marbert_route.py for the debate probability blend, and t1_llm_sft.py for one Qwen3-32B seed
Task 1 Open (0.669)the same, with t1_recal.py open adding the synthetic paragraphs, and per-class span fusion from Task 2 on the debates

The two Task 1 entries cannot be reproduced here. Their editorial predictions are the union of three Qwen3-32B seeds, and t1_llm_sft.py trains and predicts one seed at a fixed seed value, so the seed runs, the union, and the routing step are not released. The Task 1 Open span fusion is released as rule configurations only. The union rule can still be checked on the retained holdout predictions with paper_analysis/union_holdout_check.py.

The configs/ directory holds the evaluation-phase decoding thresholds and rule configurations referenced in the paper's Appendix A: the recalibrated Task 1 sets (t1_recal_ths_closed.json, t1_recal_ths_open.json), the routed Task 2 sets (task2_camel_ens.json for editorials, task2_marbert_deb.json for debates), the Open blend (t2_blend_cfg.json), and the fusion and per-label rules. The development-phase Task 1 thresholds quoted in the appendix are the BASE constant of paper_analysis/threshold_transfer.py (Closed) and the THS constant of src/test_task1_open.py (Open). Validation utilities include clean_holdout.py, model_search.py, dapt_eval.py, rare_aug_eval.py, and ens_check.py. PROMPTS.md documents the fine-tuning prompt and the synthetic-data generation templates.

Hardware

One RTX 4080 SUPER with 16 GB served all encoder work and models of up to 14B parameters. One A100 with 80 GB ran Qwen3-32B for about six GPU hours.

Licence

The code is released under the MIT licence (LICENSE) and the synthetic data under CC-BY-4.0 (LICENSE-DATA). The shared-task data released by the organisers is not redistributed here and remains subject to their terms. The official task data belongs to the Daleel 2026 organisers and is not included.

Citation

@inproceedings{durham-jazan-daleel2026,
  title  = "Durham-Jazan at Daleel 2026: Domain-Routed Ensembles, LLM Augmentation, and the Limits of Decision-Rule Tuning for Arabic Argument Mining",
  author = "Alshehri, Amal Saad and Bencomo, Nelly and Babiker, Housam and Atapour-Abarghouei, Amir",
  booktitle = "Proceedings of ArabicNLP 2026",
  year   = "2026"
}

alshehriamal1994/daleel2026-durham-jazan

Durham-Jazan at Daleel 2026 (ArabicNLP/EMNLP 2026): domain-routed Arabic argument mining — code + LLM-synthetic data (segment-concatenation span generation)

Python

0

61 commits

updated Sep 3, 2026

See the code

README

Durham-Jazan at Daleel 2026

This repository accompanies the Durham-Jazan system description paper for the Daleel 2026 shared task on Arabic Argumentative Discourse Mining (ArabicNLP 2026, held with EMNLP 2026). It contains our code, our synthetic training data, and the scripts behind every figure and analysis in the paper.

Paper: Durham-Jazan at Daleel 2026: Domain-Routed Ensembles, LLM Augmentation, and the Limits of Decision-Rule Tuning for Arabic Argument Mining. Amal Saad Alshehri, Nelly Bencomo, Housam Babiker, and Amir Atapour-Abarghouei.

A gold span annotation from the development set

The central finding of our participation is summarised in one figure. Changes to the model or its data delivered what validation promised, while tuning of the decision rules on top did not.

Promised and delivered gains for each intervention

Two further findings come from post-submission analysis. Per-label performance on editorials tracks how much of that label's training data came from editorials, which explains the editorial deficit every team suffered, and threshold recalibration gains measured on the tuning half do not survive on held-out data.

Genre skew and threshold transfer

A short demonstration

The paper introduces segment-concatenation generation, a recipe that lets a large language model produce span-annotated training data with exact character offsets and no alignment step. The following command builds and verifies one such paragraph from the data in this repository.

python demo_segment_concat.py

Final official results

Taken from the organisers' official results sheet. Ed and Db are the editorial and debate columns. The entrant count excludes the organisers' baseline.

TrackScoreEdDbRankWinner
Task 2 Closed0.729 overlap-F10.6100.7626th of 80.755
Task 2 Open0.736 overlap-F10.6270.7662nd of 20.755
Task 1 Closed0.657 macro-F10.5010.7415th of 100.712
Task 1 Open0.669 macro-F10.5010.7622nd of 30.712

In the development phase we finished first on both Open leaderboards. The evaluation-phase ranks above are the final official standings and include submissions made after ours.

Setup

pip install -r requirements.txt

The official task data and scoring scripts are not redistributed here. They are available from the organisers through the task pages at https://qatardebate.org/programs/academic-programs/daleel2026-shared-task and CodaBench. Place train_task_1.jsonl, train_task_2.jsonl, dev_in.jsonl, dev_task_1_ref.jsonl, dev_task_2_ref.jsonl, and related files under data/.

The scripts in paper_analysis/ and src/ resolve their paths against the repository root, so they can be run from any working directory and will look for their inputs in the data/, oof/, and preds/ layout used in the paper. DALEEL_ROOT overrides the repository root as a whole rather than the data directory alone, so point it only at a tree that also holds oof/, preds/ and configs/. To keep the organisers' files elsewhere, symlink them into data/ instead:

export DALEEL_ROOT=/path/to/a/full/copy/of/this/repository

Two further dependencies are on the organisers' Task 2 scorer, which we do not redistribute. Five scripts in src/ (ensemble_task2.py, ensemble_task2_camel.py, ensemble_task2_marbert.py, t2_open_eval.py, train_task2_cv.py) import it as task2_scoring, so place the organisers' task2_scoring.py inside src/. Three others (t2_blend_build.py, t2_blend_oof_exp.py, t2_closed_recal.py) invoke it as a file and read its location from DALEEL_SCORER:

export DALEEL_SCORER=/path/to/task2_scoring.py

What is included alongside the code

oof/ contains the model outputs behind the paper's analyses: out-of-fold probabilities and character offsets, and the saved seed-curve and genre-transfer results. These are our own numbers and carry no corpus text, so they are released in full.

preds/ holds our development-set predictions. The Task 1 files are label sets only. The Task 2 files carry labels and character offsets with the span text removed, because that text is the organisers' corpus and is theirs to distribute. Removing it changes no result: every analysis below works from labels and offsets.

Synthetic data

The data/ directory holds the synthetic training data generated with a proprietary large language model. All of it is machine-generated: the statistics inside synthetic ST spans are plausible but invented, so the files are unsuitable as factual text. It was used in training only, and thresholds and all held-out evaluation used real data exclusively. For Task 2 the paragraphs were authored as ordered labelled segments and joined with single spaces, so the character offsets are exact by construction (paper, Section 3.3).

FileTaskContents
synth_all.jsonl1171 multi-label paragraphs (development phase)
synth_v2/1 and 2evaluation-phase additions (Task 1 grows to 291 in total)
synth2_all.jsonl288 span-annotated paragraphs (development phase)
synth2_v2_built.jsonl270 further span-annotated paragraphs with verified offsets, giving 158 in total

The four systems at a glance (solid boxes are the Closed track, dashed the Open-track additions):

Pipeline diagram of the four systems

Post-submission analyses

The paper_analysis/ scripts are the code behind the paper's figures and appendix tables. Run them from anywhere, for example:

python paper_analysis/threshold_transfer.py

Six of them need nothing beyond this repository:

ScriptReproduces
synth_agreement.pythe blind re-annotation of the synthetic data: 79.0% exact agreement, micro-F1 0.94, per-label kappa 0.61 (TE) to 1.00 (ST) (Appendix B)
human_eval/score_human_eval.pythe blind human check of 30 synthetic paragraphs: micro-F1 0.84, kappa 1.00 (ST) and 0.93 (CO), naturalness 2.93 of 3 (Appendix B). The label-hidden sheet, the filled annotation, the key, and make_sheet_small.py sit beside it
ranking_analysis.pywhich domain decided the shared task, from the organisers' published ranking sheet (Appendix E)
transfer_plot.pyFigure 4, promised against delivered for all eighteen audited interventions
pipeline_fig.pyFigure 2, the pipeline diagram
demo_segment_concat.pythe segment-concatenation demonstration above

Three more need only the organisers' Task 1 files in data/, because the out-of-fold predictions they run on (oof/t1_recal_oof_closed.npy) are included here:

ScriptReproduces
threshold_transfer.pyTable 7, the controlled recalibration experiment
findings_fig.pyFigure 5, both post-submission findings
union_holdout_check.pythe post-submission check of the three-seed Qwen3-32B union on the controlled holdout, from the retained seed predictions in oof/ (Appendix A)

Four more need the organisers' files in data/, together with our dev predictions, which are now included under preds/:

ScriptReproduces
analysis.pyTable 2, per-class dev F1, and the bootstrap intervals
error_taxonomy.pyTables 8 and 9, the span and label error taxonomies
genre_gap.pyTable 10 and the editorial-share analysis behind Figure 5 (left)
mine_interesting.pythe exploratory scan that located the paper's Arabic examples

The last four need more than this repository provides:

ScriptReproducesAlso needs
make_figures.pyFigures 1, 3, 6, 7, 8, and 9, the Arabic examplesheadless Chrome and Ghostscript
threshold_transfer_t2.pythe Task 2 replication of Table 7oof/t2_gold_all.jsonl, which is organisers' gold and must be regenerated
ensemble_curve.pythe seed-variance figures of Appendix Aa GPU, and trains eight seeds
genre_transfer.pyTable 11, the size-matched genre experimenta GPU, and trains nine models

The dev predictions under preds/ are our own model outputs rather than task data. The Task 1 files are label sets. The Task 2 files keep labels and character offsets but not the span text, which belongs to the organisers' corpus. No analysis here reads that field, and removing it leaves every reported number unchanged. Figure output goes to figs/, and the Arabic examples to paper_analysis/.

Reproducing the final systems

SystemKey scripts
Task 2 Closed (0.729)dapt_v2.py and dapt_v2_marbert.py for the encoders, train_task2_cv.py with ensemble_task2_camel.py and ensemble_task2_marbert.py for the per-domain thresholds, then test_task2_closed_v3.py for the domain-routed decode, which it writes uncompacted. The span compaction that earned the submitted score is the decoder inside t2_closed_recal.py
Task 2 Open (0.736)the same encoders, then t2_open_recal_apply.py to add the synthetic spans and save test probabilities, then t2_blend_build.py for the char-level blend and the compaction
Task 1 Closed (0.657)dapt_v2.py for domain-adaptive pretraining, backtranslate.py, backtranslate_multi.py and dev_bt_gen.py for the back-translations, t1_recal.py closed for the encoder ensemble and its recalibrated thresholds, t1_marbert_route.py for the debate probability blend, and t1_llm_sft.py for one Qwen3-32B seed
Task 1 Open (0.669)the same, with t1_recal.py open adding the synthetic paragraphs, and per-class span fusion from Task 2 on the debates

The two Task 1 entries cannot be reproduced here. Their editorial predictions are the union of three Qwen3-32B seeds, and t1_llm_sft.py trains and predicts one seed at a fixed seed value, so the seed runs, the union, and the routing step are not released. The Task 1 Open span fusion is released as rule configurations only. The union rule can still be checked on the retained holdout predictions with paper_analysis/union_holdout_check.py.

The configs/ directory holds the evaluation-phase decoding thresholds and rule configurations referenced in the paper's Appendix A: the recalibrated Task 1 sets (t1_recal_ths_closed.json, t1_recal_ths_open.json), the routed Task 2 sets (task2_camel_ens.json for editorials, task2_marbert_deb.json for debates), the Open blend (t2_blend_cfg.json), and the fusion and per-label rules. The development-phase Task 1 thresholds quoted in the appendix are the BASE constant of paper_analysis/threshold_transfer.py (Closed) and the THS constant of src/test_task1_open.py (Open). Validation utilities include clean_holdout.py, model_search.py, dapt_eval.py, rare_aug_eval.py, and ens_check.py. PROMPTS.md documents the fine-tuning prompt and the synthetic-data generation templates.

Hardware

One RTX 4080 SUPER with 16 GB served all encoder work and models of up to 14B parameters. One A100 with 80 GB ran Qwen3-32B for about six GPU hours.

Licence

The code is released under the MIT licence (LICENSE) and the synthetic data under CC-BY-4.0 (LICENSE-DATA). The shared-task data released by the organisers is not redistributed here and remains subject to their terms. The official task data belongs to the Daleel 2026 organisers and is not included.

Citation

@inproceedings{durham-jazan-daleel2026,
  title  = "Durham-Jazan at Daleel 2026: Domain-Routed Ensembles, LLM Augmentation, and the Limits of Decision-Rule Tuning for Arabic Argument Mining",
  author = "Alshehri, Amal Saad and Bencomo, Nelly and Babiker, Housam and Atapour-Abarghouei, Amir",
  booktitle = "Proceedings of ArabicNLP 2026",
  year   = "2026"
}