# 文本建置:wiki → 對白 建置流水線的第一段。這些腳本不屬於插件執行期;原文與輸出放在 repo 之外,不入版本控制。 ## 1. 讀取 wiki 用 tea 的驗證讀取 Gitea wiki 全部頁面,存成 markdown: ```bash python3 -I tools/corpus/fetch_wiki.py jiantw83/sao ~/anime-companion-data/sao/wiki ``` ## 2. 抽出對白 抽出所有「」對白與前後文,並用規則判定明確的說話者: ```bash python3 -I tools/corpus/extract_dialogues.py ~/anime-companion-data/sao/wiki ~/anime-companion-data/sao/dialogues.jsonl ``` 輸出每個對白一行 JSON: | 欄位 | 說明 | | --- | --- | | `id` | `v{冊}c{章}-{章內序號}` | | `volume`、`chapter`、`page`、`para` | 位置;`page` 是分頁,`para` 是章內段落序號 | | `text` | 對白內容(不含「」) | | `before`、`after` | 同段落中對白前後的敘述 | | `prev_par`、`next_par` | 前後段落 | | `speaker` | 規則判定的角色代號,無法判定為 `null` | | `alias` | 判定依據的名字(例如「莉法」或「直葉」) | | `mode` | 由別名推得的模式:`ingame`、`real`、`leafa` | | `confidence` | `high`:句中只有一個候選且有說話動詞;`medium`:多個候選取句首第一個,需 W4 覆核 | | `rule` | `lead_in`(同段落「…說:」)、`lead_in_prev`(前一段以「:」結尾)、`trail`(對白後接「某某說」) | | `candidates` | 句中出現的所有候選名字 | | `suspect_duplicate` | 同一章 6 段內出現相同的長對白,疑為 wiki 頁面銜接的重複 | ## 規則的邊界 這個譯本很少直接寫「某某說」,多數對白靠上下文(「他這麼說」「她點了點頭」)或輪流發言判斷,所以規則只涵蓋約一成的對白。其餘由 W4 的 sub-agent 標註。 別名表在 `characters.json`,新增角色或別名時改它。 ## 測試 ```bash cd tools/corpus && python3 -m unittest -q test_extract_dialogues ```