| --- |
| language: zh |
| license: mit |
| library_name: wapic |
| pipeline_tag: token-classification |
| tags: |
| - chinese-word-segmentation |
| - crf |
| - sequence-labeling |
| - chinese |
| --- |
| |
| # Wapic 中文分词模型 (wapic-cws) |
|
|
| 线性链 CRF(L-BFGS / OWL-QN 训练)中文分词模型,采用 BMES 标注。 |
| 遵循现代中文标准:**人名保持整体**(李镇全、林强峰)、标点独立、数字/英文按字符类型边界切分。 |
|
|
| 代码与训练框架:<https://github.com/Ismantic/Wapic>(C++17 重构的 [Wapiti](https://wapiti.limsi.fr/))。 |
|
|
| ## 分词规范(retag2) |
|
|
| 模型的训练数据与评测集都按同一套现代中文分词口径重新标注,项目内代号 **retag2** |
| ("第 2 版重新打标签")。三条规则: |
|
|
| 1. **人名保持整体** —— 姓名不拆开。`李镇全` → `李镇全`(而非 `李 镇全` / `李 镇 全`)。 |
| 2. **标点独立成词** —— 每个标点单独切出。`你好,世界。` → `你好 , 世界 。` |
| 3. **数字 / 英文按字符类型边界切** —— 汉字、数字、拉丁字母交界处一律切开。 |
| `2015年` → `2015 年`;`GDP增长3.5%` → `GDP 增长 3 . 5 %`。 |
|
|
| 因此模型只在**纯汉字序列**上做真正的分词决策;数字、英文、标点是按字符类型 |
| 先切出来的。使用时若输入含中英数字混排,应先做同样的预切分再喂给模型 |
| (GitHub 仓库 REPL 与 Python 绑定的 `cut` 已内置该预处理)。评测的 gold 数据 |
| 也必须是 retag2 口径,否则字符类型边界对不上、F1 会偏低。 |
|
|
| ## 文件 |
|
|
| | 文件 | 说明 | |
| |---|---| |
| | `model/wapic-cws.wac` | **主模型**(发布代号 i60-p004,50 MB,二进制格式) | |
| | `model/wapic-cws-base.wac` | Stage-1 base,warm-start 锚点(仅复现训练时需要) | |
| | `model/pattern.txt` | 特征模板(unigram + bigram) | |
|
|
| ## 指标 |
|
|
| 在 retag2 gold 测试集上(见 `Ismantic/wapic-cws-data`,已去污染——剔除了 |
| 与训练数据逐字重合的句子,F1 反映真实泛化): |
|
|
| | 测试集 | F1 | P | R | |
| |---|---|---|---| |
| | PD-1998 (modern+punct) | **98.01** | 97.88 | 98.14 | |
| | 12M 泛化集 | **97.95** | 97.98 | 97.92 | |
|
|
| 人名切分抽查全过(李镇全 / 林强峰 / 王小明 / 屠呦呦 / 王毅 / 布林肯 等)。 |
|
|
| ## 用法 |
|
|
| 需先从源码编译 `wapic`(见 GitHub 仓库): |
|
|
| ```bash |
| # 交互式分词 |
| ./build/wapic -m model/wapic-cws.wac |
| # >>> 李镇全今天接受了记者的采访 |
| # 李镇全 今天 接受 了 记者 的 采访 |
| |
| # 批量标注:输入为每行一个字符、空行分句 |
| ./build/wapic test -m model/wapic-cws.wac input_nolabel.txt output_tags.txt |
| ``` |
|
|
| Python 绑定(pybind11,见仓库 `build_py`): |
|
|
| ```python |
| import wapic |
| seg = wapic.Segmenter("model/wapic-cws.wac") |
| seg.cut("中华人民共和国是一个伟大的国家") |
| ``` |
|
|
| ## 训练 |
|
|
| 两阶段 warm-start:`model/wapic-cws-base.wac`(Stage-1,12M LTP 语料) |
| → 在 badcase 增强数据(`wapic-cws-data-2`)上 `--init-from` 链式 fine-tune |
| 共 60 迭代(3×20,禁用早停)→ 剪枝 `--prune-threshold 0.04`: |
|
|
| ```bash |
| ./build/wapic fit -p pattern.txt --init-from wapic-cws-base.wac \ |
| -a l-bfgs -i 20 -e 0.0000001 -1 0.005 -2 0.0001 --histsz 5 \ |
| --save-binary wapic-cws-data-2.txt ck20.wac |
| # 再以 ck20 → ck40 → ck60 链式重复两次,然后: |
| ./build/wapic convert -m ck60.wac --save-binary --save-prune \ |
| --prune-threshold 0.04 wapic-cws.wac |
| ``` |
|
|
| 训练量选择依据迭代-F1 曲线:60–80 迭代为峰值平台,100 迭代起过拟合。 |
| 完整配方与数据见数据集仓库 |
| [Ismantic/wapic-cws-data](https://huggingface.co/datasets/Ismantic/wapic-cws-data)。 |
|
|
| ## 许可 |
|
|
| MIT(代码/模型权重)。训练语料源自人民日报 1998、LTP 标注及公开新闻语料, |
| 原始语料版权归各自所有者。 |
|
|