{
  "id": 685251,
  "title": "160th Place Solution: +218 Shake Up",
  "url": "/competitions/deep-past-initiative-machine-translation/discussion/685251",
  "author_name": "Taimo",
  "post_date": "2026-03-27T13:29:54.736000",
  "votes": 6,
  "comment_count": 0,
  "views": 0,
  "content": "<p>Thank you to the competition hosts for this fascinating challenge and to all participants for the insightful discussions throughout.</p>\n<hr>\n<p><strong>Private LB: 36</strong> | <strong>+222 shake-up (382nd public -&gt; 160th private)</strong></p>\n<p>The core of this solution was <strong>data engineering</strong> -- extracting parallel corpora from scholarly PDFs using Gemini Vision, which expanded the training set from ~1,500 to ~36,750 rows. On the modeling side: mT5-large 4-fold ensemble with MBR decoding.</p>\n<hr>\n<h2>Data Engineering</h2>\n<p>With only ~1,500 document-level pairs, the competition was a <strong>data problem</strong>. The AKT publication PDFs contained thousands of transliteration-translation pairs buried in scholarly text.</p>\n<p><strong>Sentence-first extraction</strong>: Gemini extracted each PDF page as a list of sentence-level pairs, not a single document blob. From these, I produced two views:</p>\n<ul>\n<li><strong>Sentence rows</strong>: individual pairs (the biggest data multiplier -- 1 tablet becomes ~8 rows)</li>\n<li><strong>Document rows</strong>: sentences concatenated back into a single row</li>\n</ul>\n<p>Both views were concatenated into a single training set. <code>&lt;eos&gt;</code> separators were replaced with periods so the model could leverage its English sentence boundary understanding.</p>\n<h3>Pipeline</h3>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F4004698%2Fdcaf9313ee33874e6ee4b32d6398a8dd%2FSCR-20260327-tjze.png?generation=1774618029414321&amp;alt=media\" alt=\"url\"></p>\n<h3>Final Dataset Breakdown</h3>\n<table>\n<thead>\n<tr>\n<th>Source</th>\n<th>Rows</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>AKT volumes (12 vols, sentence+doc split)</td>\n<td>23,963</td>\n</tr>\n<tr>\n<td>CAD dictionary (13 volumes)</td>\n<td>4,059</td>\n</tr>\n<tr>\n<td>Secondary scholarly sources</td>\n<td>3,630</td>\n</tr>\n<tr>\n<td>ICK IV 1998</td>\n<td>1,857</td>\n</tr>\n<tr>\n<td>Larsen 2002</td>\n<td>1,681</td>\n</tr>\n<tr>\n<td><strong>Subtotal (publications_csv)</strong></td>\n<td><strong>35,190</strong></td>\n</tr>\n<tr>\n<td>Competition train.csv</td>\n<td>1,561</td>\n</tr>\n<tr>\n<td><strong>Total training pool</strong></td>\n<td><strong>~36,750</strong></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Model &amp; Training</h2>\n<p>Started with <strong>ByT5-base</strong> (byte-level, no OOV issues) but switched to <strong>mT5</strong> for speed and vocabulary coverage. mT5's subword tokenizer produces ~4x shorter sequences than ByT5's byte-level encoding, enabling ensemble + MBR within Kaggle's 9-hour time limit.</p>\n<p><strong>Scale-up</strong>: mT5-base (LB 33.1) -&gt; mT5-large (LB 34.6 single, 36.0 ensemble). BF16 on vast.ai GPUs.</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Model</td>\n<td>mT5-large</td>\n</tr>\n<tr>\n<td>Optimizer</td>\n<td>AdamW, cosine LR 5e-5, 5% warmup</td>\n</tr>\n<tr>\n<td>Batch</td>\n<td>8</td>\n</tr>\n<tr>\n<td>Epochs</td>\n<td>20-40, early stopping patience 5</td>\n</tr>\n<tr>\n<td>Label smoothing</td>\n<td>0.1</td>\n</tr>\n<tr>\n<td>Precision</td>\n<td>BF16</td>\n</tr>\n<tr>\n<td>Validation</td>\n<td>series_group_kfold (5 folds, leave-series-out)</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Validation strategy</strong>: <code>series_group_kfold</code> (5 folds, leave-series-out) -- a GroupKFold where each fold holds out an entire publication series (e.g., AKT 6a). This prevents series-level data leakage, since documents within the same series share vocabulary, formulaic expressions, and proper nouns.</p>\n<hr>\n<h2>Inference Pipeline</h2>\n<h3>MBR Decoding</h3>\n<p>For each source, generated 10 candidates per model:</p>\n<ul>\n<li><strong>4 beam search</strong> (num_beams=4, length_penalty=1.08)</li>\n<li><strong>6 sampling</strong> (temperatures 0.60/0.80/1.05, 2 each, top_p=0.92)</li>\n</ul>\n<p><code>GeoMeanMBRSelector</code> picks the candidate with highest average pairwise <code>sqrt(BLEU * chrF++)</code> against all others.</p>\n<h3>4-Fold Ensemble + Char Constraint</h3>\n<p>5-fold CV but only 4 folds used for ensemble -- 5 models × 10 candidates × ~4,000 sentences exceeded Kaggle's 9-hour time limit. Merged pools from 4 mT5-large folds (40 candidates total). <code>CharConstraintProcessor</code> masks disallowed characters during beam search (prevents CJK/Cyrillic generation from mT5).</p>\n<h2>Preprocessing</h2>\n<p><strong>Source (Akkadian):</strong></p>\n<ul>\n<li>ATF to Unicode: <code>sz</code>-&gt;<code>š</code>, <code>s,</code>-&gt;<code>ṣ</code>, <code>t,</code>-&gt;<code>ṭ</code>, vowel+index to accents (<code>a2</code>-&gt;<code>á</code>, <code>a3</code>-&gt;<code>à</code>)</li>\n<li><code>ḫ</code>/<code>Ḫ</code> -&gt; <code>h</code>/<code>H</code> (confirmed by host)</li>\n<li>Gap unification: <code>[...]</code>, <code>[x x x]</code>, <code>...</code> -&gt; <code>&lt;gap&gt;</code>, with deduplication</li>\n<li>Determinative conversion: <code>(d)</code> -&gt; <code>{d}</code></li>\n<li>Remove scribal notation (<code>!</code>, <code>?</code>) and brackets (keep content)</li>\n<li>Decimal to fraction: <code>0.5</code> -&gt; <code>1/2</code></li>\n</ul>\n<p><strong>Target (English):</strong></p>\n<ul>\n<li>Gap normalization, fraction canonicalization (shekel-specific rules from host)</li>\n<li>Commodity replacement (<code>-gold</code> -&gt; <code>pasallum gold</code>), grammar marker removal</li>\n</ul>\n<h3>Post-Processing</h3>\n<ul>\n<li>Gap unification, <code>PN</code> -&gt; <code>&lt;gap&gt;</code></li>\n<li>Commodity replacement (<code>-gold</code> -&gt; <code>pasallum gold</code>)</li>\n<li>Fraction canonicalization (shekel-specific rules)</li>\n<li>UNK character replacement and fraction rendering normalization to match test format</li>\n<li>PN fuzzy matching against onomasticon</li>\n</ul>",
  "messages": [
    {
      "id": 3429875,
      "postDate": "2026-03-27T13:29:54.737Z",
      "content": "<p>Thank you to the competition hosts for this fascinating challenge and to all participants for the insightful discussions throughout.</p>\n<hr>\n<p><strong>Private LB: 36</strong> | <strong>+222 shake-up (382nd public -&gt; 160th private)</strong></p>\n<p>The core of this solution was <strong>data engineering</strong> -- extracting parallel corpora from scholarly PDFs using Gemini Vision, which expanded the training set from ~1,500 to ~36,750 rows. On the modeling side: mT5-large 4-fold ensemble with MBR decoding.</p>\n<hr>\n<h2>Data Engineering</h2>\n<p>With only ~1,500 document-level pairs, the competition was a <strong>data problem</strong>. The AKT publication PDFs contained thousands of transliteration-translation pairs buried in scholarly text.</p>\n<p><strong>Sentence-first extraction</strong>: Gemini extracted each PDF page as a list of sentence-level pairs, not a single document blob. From these, I produced two views:</p>\n<ul>\n<li><strong>Sentence rows</strong>: individual pairs (the biggest data multiplier -- 1 tablet becomes ~8 rows)</li>\n<li><strong>Document rows</strong>: sentences concatenated back into a single row</li>\n</ul>\n<p>Both views were concatenated into a single training set. <code>&lt;eos&gt;</code> separators were replaced with periods so the model could leverage its English sentence boundary understanding.</p>\n<h3>Pipeline</h3>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F4004698%2Fdcaf9313ee33874e6ee4b32d6398a8dd%2FSCR-20260327-tjze.png?generation=1774618029414321&amp;alt=media\" alt=\"url\"></p>\n<h3>Final Dataset Breakdown</h3>\n<table>\n<thead>\n<tr>\n<th>Source</th>\n<th>Rows</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>AKT volumes (12 vols, sentence+doc split)</td>\n<td>23,963</td>\n</tr>\n<tr>\n<td>CAD dictionary (13 volumes)</td>\n<td>4,059</td>\n</tr>\n<tr>\n<td>Secondary scholarly sources</td>\n<td>3,630</td>\n</tr>\n<tr>\n<td>ICK IV 1998</td>\n<td>1,857</td>\n</tr>\n<tr>\n<td>Larsen 2002</td>\n<td>1,681</td>\n</tr>\n<tr>\n<td><strong>Subtotal (publications_csv)</strong></td>\n<td><strong>35,190</strong></td>\n</tr>\n<tr>\n<td>Competition train.csv</td>\n<td>1,561</td>\n</tr>\n<tr>\n<td><strong>Total training pool</strong></td>\n<td><strong>~36,750</strong></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Model &amp; Training</h2>\n<p>Started with <strong>ByT5-base</strong> (byte-level, no OOV issues) but switched to <strong>mT5</strong> for speed and vocabulary coverage. mT5's subword tokenizer produces ~4x shorter sequences than ByT5's byte-level encoding, enabling ensemble + MBR within Kaggle's 9-hour time limit.</p>\n<p><strong>Scale-up</strong>: mT5-base (LB 33.1) -&gt; mT5-large (LB 34.6 single, 36.0 ensemble). BF16 on vast.ai GPUs.</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Model</td>\n<td>mT5-large</td>\n</tr>\n<tr>\n<td>Optimizer</td>\n<td>AdamW, cosine LR 5e-5, 5% warmup</td>\n</tr>\n<tr>\n<td>Batch</td>\n<td>8</td>\n</tr>\n<tr>\n<td>Epochs</td>\n<td>20-40, early stopping patience 5</td>\n</tr>\n<tr>\n<td>Label smoothing</td>\n<td>0.1</td>\n</tr>\n<tr>\n<td>Precision</td>\n<td>BF16</td>\n</tr>\n<tr>\n<td>Validation</td>\n<td>series_group_kfold (5 folds, leave-series-out)</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Validation strategy</strong>: <code>series_group_kfold</code> (5 folds, leave-series-out) -- a GroupKFold where each fold holds out an entire publication series (e.g., AKT 6a). This prevents series-level data leakage, since documents within the same series share vocabulary, formulaic expressions, and proper nouns.</p>\n<hr>\n<h2>Inference Pipeline</h2>\n<h3>MBR Decoding</h3>\n<p>For each source, generated 10 candidates per model:</p>\n<ul>\n<li><strong>4 beam search</strong> (num_beams=4, length_penalty=1.08)</li>\n<li><strong>6 sampling</strong> (temperatures 0.60/0.80/1.05, 2 each, top_p=0.92)</li>\n</ul>\n<p><code>GeoMeanMBRSelector</code> picks the candidate with highest average pairwise <code>sqrt(BLEU * chrF++)</code> against all others.</p>\n<h3>4-Fold Ensemble + Char Constraint</h3>\n<p>5-fold CV but only 4 folds used for ensemble -- 5 models × 10 candidates × ~4,000 sentences exceeded Kaggle's 9-hour time limit. Merged pools from 4 mT5-large folds (40 candidates total). <code>CharConstraintProcessor</code> masks disallowed characters during beam search (prevents CJK/Cyrillic generation from mT5).</p>\n<h2>Preprocessing</h2>\n<p><strong>Source (Akkadian):</strong></p>\n<ul>\n<li>ATF to Unicode: <code>sz</code>-&gt;<code>š</code>, <code>s,</code>-&gt;<code>ṣ</code>, <code>t,</code>-&gt;<code>ṭ</code>, vowel+index to accents (<code>a2</code>-&gt;<code>á</code>, <code>a3</code>-&gt;<code>à</code>)</li>\n<li><code>ḫ</code>/<code>Ḫ</code> -&gt; <code>h</code>/<code>H</code> (confirmed by host)</li>\n<li>Gap unification: <code>[...]</code>, <code>[x x x]</code>, <code>...</code> -&gt; <code>&lt;gap&gt;</code>, with deduplication</li>\n<li>Determinative conversion: <code>(d)</code> -&gt; <code>{d}</code></li>\n<li>Remove scribal notation (<code>!</code>, <code>?</code>) and brackets (keep content)</li>\n<li>Decimal to fraction: <code>0.5</code> -&gt; <code>1/2</code></li>\n</ul>\n<p><strong>Target (English):</strong></p>\n<ul>\n<li>Gap normalization, fraction canonicalization (shekel-specific rules from host)</li>\n<li>Commodity replacement (<code>-gold</code> -&gt; <code>pasallum gold</code>), grammar marker removal</li>\n</ul>\n<h3>Post-Processing</h3>\n<ul>\n<li>Gap unification, <code>PN</code> -&gt; <code>&lt;gap&gt;</code></li>\n<li>Commodity replacement (<code>-gold</code> -&gt; <code>pasallum gold</code>)</li>\n<li>Fraction canonicalization (shekel-specific rules)</li>\n<li>UNK character replacement and fraction rendering normalization to match test format</li>\n<li>PN fuzzy matching against onomasticon</li>\n</ul>",
      "rawMarkdown": "Thank you to the competition hosts for this fascinating challenge and to all participants for the insightful discussions throughout.\n\n---\n\n**Private LB: 36** | **+222 shake-up (382nd public -> 160th private)**\n\nThe core of this solution was **data engineering** -- extracting parallel corpora from scholarly PDFs using Gemini Vision, which expanded the training set from ~1,500 to ~36,750 rows. On the modeling side: mT5-large 4-fold ensemble with MBR decoding.\n\n---\n\n## Data Engineering\n\nWith only ~1,500 document-level pairs, the competition was a **data problem**. The AKT publication PDFs contained thousands of transliteration-translation pairs buried in scholarly text.\n\n\n**Sentence-first extraction**: Gemini extracted each PDF page as a list of sentence-level pairs, not a single document blob. From these, I produced two views:\n- **Sentence rows**: individual pairs (the biggest data multiplier -- 1 tablet becomes ~8 rows)\n- **Document rows**: sentences concatenated back into a single row\n\nBoth views were concatenated into a single training set. `<eos>` separators were replaced with periods so the model could leverage its English sentence boundary understanding.\n\n### Pipeline\n![url](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F4004698%2Fdcaf9313ee33874e6ee4b32d6398a8dd%2FSCR-20260327-tjze.png?generation=1774618029414321&alt=media)\n\n### Final Dataset Breakdown\n\n| Source | Rows |\n|--------|------|\n| AKT volumes (12 vols, sentence+doc split) | 23,963 |\n| CAD dictionary (13 volumes) | 4,059 |\n| Secondary scholarly sources | 3,630 |\n| ICK IV 1998 | 1,857 |\n| Larsen 2002 | 1,681 |\n| **Subtotal (publications_csv)** | **35,190** |\n| Competition train.csv | 1,561 |\n| **Total training pool** | **~36,750** |\n\n\n---\n\n## Model & Training\n\nStarted with **ByT5-base** (byte-level, no OOV issues) but switched to **mT5** for speed and vocabulary coverage. mT5's subword tokenizer produces ~4x shorter sequences than ByT5's byte-level encoding, enabling ensemble + MBR within Kaggle's 9-hour time limit.\n\n**Scale-up**: mT5-base (LB 33.1) -> mT5-large (LB 34.6 single, 36.0 ensemble). BF16 on vast.ai GPUs.\n\n| Parameter | Value |\n|-----------|-------|\n| Model | mT5-large |\n| Optimizer | AdamW, cosine LR 5e-5, 5% warmup |\n| Batch | 8 |\n| Epochs | 20-40, early stopping patience 5 |\n| Label smoothing | 0.1 |\n| Precision | BF16 |\n| Validation | series_group_kfold (5 folds, leave-series-out) |\n\n**Validation strategy**: `series_group_kfold` (5 folds, leave-series-out) -- a GroupKFold where each fold holds out an entire publication series (e.g., AKT 6a). This prevents series-level data leakage, since documents within the same series share vocabulary, formulaic expressions, and proper nouns.\n\n---\n\n## Inference Pipeline\n\n### MBR Decoding\n\nFor each source, generated 10 candidates per model:\n- **4 beam search** (num_beams=4, length_penalty=1.08)\n- **6 sampling** (temperatures 0.60/0.80/1.05, 2 each, top_p=0.92)\n\n`GeoMeanMBRSelector` picks the candidate with highest average pairwise `sqrt(BLEU * chrF++)` against all others.\n\n### 4-Fold Ensemble + Char Constraint\n\n5-fold CV but only 4 folds used for ensemble -- 5 models × 10 candidates × ~4,000 sentences exceeded Kaggle's 9-hour time limit. Merged pools from 4 mT5-large folds (40 candidates total). `CharConstraintProcessor` masks disallowed characters during beam search (prevents CJK/Cyrillic generation from mT5).\n\n## Preprocessing\n**Source (Akkadian):**\n- ATF to Unicode: `sz`->`š`, `s,`->`ṣ`, `t,`->`ṭ`, vowel+index to accents (`a2`->`á`, `a3`->`à`)\n- `ḫ`/`Ḫ` -> `h`/`H` (confirmed by host)\n- Gap unification: `[...]`, `[x x x]`, `...` -> `<gap>`, with deduplication\n- Determinative conversion: `(d)` -> `{d}`\n- Remove scribal notation (`!`, `?`) and brackets (keep content)\n- Decimal to fraction: `0.5` -> `1/2`\n\n**Target (English):**\n- Gap normalization, fraction canonicalization (shekel-specific rules from host)\n- Commodity replacement (`-gold` -> `pasallum gold`), grammar marker removal\n\n### Post-Processing\n- Gap unification, `PN` -> `<gap>`\n- Commodity replacement (`-gold` -> `pasallum gold`)\n- Fraction canonicalization (shekel-specific rules)\n- UNK character replacement and fraction rendering normalization to match test format\n- PN fuzzy matching against onomasticon",
      "votes": 6
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "3429875": "Thank you to the competition hosts for this fascinating challenge and to all participants for the insightful discussions throughout.\n\n---\n\n**Private LB: 36** | **+222 shake-up (382nd public -> 160th private)**\n\nThe core of this solution was **data engineering** -- extracting parallel corpora from scholarly PDFs using Gemini Vision, which expanded the training set from ~1,500 to ~36,750 rows. On the modeling side: mT5-large 4-fold ensemble with MBR decoding.\n\n---\n\n## Data Engineering\n\nWith only ~1,500 document-level pairs, the competition was a **data problem**. The AKT publication PDFs contained thousands of transliteration-translation pairs buried in scholarly text.\n\n\n**Sentence-first extraction**: Gemini extracted each PDF page as a list of sentence-level pairs, not a single document blob. From these, I produced two views:\n- **Sentence rows**: individual pairs (the biggest data multiplier -- 1 tablet becomes ~8 rows)\n- **Document rows**: sentences concatenated back into a single row\n\nBoth views were concatenated into a single training set. `<eos>` separators were replaced with periods so the model could leverage its English sentence boundary understanding.\n\n### Pipeline\n![url](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F4004698%2Fdcaf9313ee33874e6ee4b32d6398a8dd%2FSCR-20260327-tjze.png?generation=1774618029414321&alt=media)\n\n### Final Dataset Breakdown\n\n| Source | Rows |\n|--------|------|\n| AKT volumes (12 vols, sentence+doc split) | 23,963 |\n| CAD dictionary (13 volumes) | 4,059 |\n| Secondary scholarly sources | 3,630 |\n| ICK IV 1998 | 1,857 |\n| Larsen 2002 | 1,681 |\n| **Subtotal (publications_csv)** | **35,190** |\n| Competition train.csv | 1,561 |\n| **Total training pool** | **~36,750** |\n\n\n---\n\n## Model & Training\n\nStarted with **ByT5-base** (byte-level, no OOV issues) but switched to **mT5** for speed and vocabulary coverage. mT5's subword tokenizer produces ~4x shorter sequences than ByT5's byte-level encoding, enabling ensemble + MBR within Kaggle's 9-hour time limit.\n\n**Scale-up**: mT5-base (LB 33.1) -> mT5-large (LB 34.6 single, 36.0 ensemble). BF16 on vast.ai GPUs.\n\n| Parameter | Value |\n|-----------|-------|\n| Model | mT5-large |\n| Optimizer | AdamW, cosine LR 5e-5, 5% warmup |\n| Batch | 8 |\n| Epochs | 20-40, early stopping patience 5 |\n| Label smoothing | 0.1 |\n| Precision | BF16 |\n| Validation | series_group_kfold (5 folds, leave-series-out) |\n\n**Validation strategy**: `series_group_kfold` (5 folds, leave-series-out) -- a GroupKFold where each fold holds out an entire publication series (e.g., AKT 6a). This prevents series-level data leakage, since documents within the same series share vocabulary, formulaic expressions, and proper nouns.\n\n---\n\n## Inference Pipeline\n\n### MBR Decoding\n\nFor each source, generated 10 candidates per model:\n- **4 beam search** (num_beams=4, length_penalty=1.08)\n- **6 sampling** (temperatures 0.60/0.80/1.05, 2 each, top_p=0.92)\n\n`GeoMeanMBRSelector` picks the candidate with highest average pairwise `sqrt(BLEU * chrF++)` against all others.\n\n### 4-Fold Ensemble + Char Constraint\n\n5-fold CV but only 4 folds used for ensemble -- 5 models × 10 candidates × ~4,000 sentences exceeded Kaggle's 9-hour time limit. Merged pools from 4 mT5-large folds (40 candidates total). `CharConstraintProcessor` masks disallowed characters during beam search (prevents CJK/Cyrillic generation from mT5).\n\n## Preprocessing\n**Source (Akkadian):**\n- ATF to Unicode: `sz`->`š`, `s,`->`ṣ`, `t,`->`ṭ`, vowel+index to accents (`a2`->`á`, `a3`->`à`)\n- `ḫ`/`Ḫ` -> `h`/`H` (confirmed by host)\n- Gap unification: `[...]`, `[x x x]`, `...` -> `<gap>`, with deduplication\n- Determinative conversion: `(d)` -> `{d}`\n- Remove scribal notation (`!`, `?`) and brackets (keep content)\n- Decimal to fraction: `0.5` -> `1/2`\n\n**Target (English):**\n- Gap normalization, fraction canonicalization (shekel-specific rules from host)\n- Commodity replacement (`-gold` -> `pasallum gold`), grammar marker removal\n\n### Post-Processing\n- Gap unification, `PN` -> `<gap>`\n- Commodity replacement (`-gold` -> `pasallum gold`)\n- Fraction canonicalization (shekel-specific rules)\n- UNK character replacement and fraction rendering normalization to match test format\n- PN fuzzy matching against onomasticon"
  },
  "complete": true,
  "source": "existing_discussion",
  "competition_id": 121150,
  "competition_slug": "deep-past-initiative-machine-translation",
  "team_id": 15193272,
  "solution_url": "/competitions/deep-past-initiative-machine-translation/writeups/164th-place-solution-218-shake-up"
}