法院卷宗归档室里,周法官干了几十年。每来一份新卷宗,他不用逐字读完全部案情,扫一眼“被告人持刀闯入被害人家中,抢走现金并划伤手臂”,就转身从墙上的标签盒里抽出两张纸条,一张写“抢劫”,一张写“故意伤害”,再夹上《刑法》第263条和第234条的便签。旁边的实习生看傻了:“一个案子还能同时犯两个罪?”周法官笑了笑:“卷宗又不是单选题,一张卷宗上常常要贴好几张标签。”这个朴素的场景,正是本文的主角——多标签分类。我们要讲的就是:如何让 AI 学会周法官“抽标签”的本事,把案情文本自动映射到刑法罪名体系,同时推荐相关法条;以及这条路上要蹚过的坑——标签怎么组织、样本不平衡怎么办、模型怎么选、指标怎么评。

岗位关联

掌握罪名预测与法条推荐的多标签分类技术,是构建辅助量刑、智能分案等司法 AI 产品的核心能力,也是 NLP 工程师切入法律科技领域的最佳敲门砖。

目录
  1. 可视化演示
  2. 任务定义与标签体系
  3. 多标签分类原理
  4. 类别不平衡处理
  5. 文本表示与建模
  6. 模型架构选择
  7. 评估指标设计
  8. 训练与调优策略
  9. 司法落地与挑战
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

演示案情文本映射到罪名与法条的多标签分类,展示标签层次结构与精准率、召回率、F1评估指标。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多标签分类 罪名标签 法条推荐 case→labels 案情映射到罪名体系

任务定义与标签体系

周法官的墙上挂着一排排标签盒,每个盒子上写着罪名,盒子里的纸条背面印着对应的法条。他“抽标签”之前,脑子里先有一张地图:刑法分则分了十章,“侵犯财产罪”这一章下面才是“抢劫罪”“盗窃罪”,标签不是平铺的,而是分层的。这张地图,就是司法 AI 里的“标签层次结构”。

司法 AI 的罪名预测任务,是给定起诉书里的“案情事实描述”,输出一个或多个罪名标签;法条推荐任务则输出对应的刑法条文编号。两者是一体两面:标签体系里,罪名与法条是多对多映射——一条法条可对应多个罪名,一个罪名也可能援引数条法条。把标签按“刑法分则章节 → 具体罪名 → 法条”组织成树形结构,模型就能先预测大类再细分,父类信息还能缓解某些罪名样本稀少的问题。

形式上,一个案件的标签是一个长度等于候选罪名总数的 0/1 向量,每个位置代表“是否触犯该罪名”。

周法官给卷宗抽标签时,从来不是漫无目的地翻墙上的盒子——他会先判断这案子属“财产类”还是“人身类”,再快速定位具体罪名。标签层次结构,就是给 AI 画好的那张“墙上的地图”。

y=(y1,y2,…,yL),yj∈{0,1}\displaystyle \mathbf{y} = (y_1, y_2, \ldots, y_L), \quad y_j \in \{0, 1\}
这个向量就是“周法官手里的那一串标签纸条”:长度固定,每张纸条要么贴上、要么不贴。
  1. 标签向量$\mathbf{y}$ 把 L 个候选罪名排成一串“是/否”开关,每一位对应一个罪名。
    y=(y1,y2,…,yL)\mathbf{y} = (y_1, y_2, \ldots, y_L)
  2. 单标签取值$y_j = 1$ 表示案情触犯第 j 个罪名,$0$ 表示未触犯;一个案件可同时出现多个 1。
    yj∈{0,1}y_j \in \{0, 1\}

多标签分类原理

实习生问周法官:“您判断罪名,是不是像考试做单选题?”周法官摇头:“是多选题。抢劫案的卷宗,我至少要看一眼有没有伤人——伤了人,故意伤害的标签也得贴上。”多标签与多分类的根本区别就在这:多分类输出互斥的一个类别,多标签输出的是一组独立的 0/1 判断。

把多标签拆成多个“是/否”判断题,就是最简单的二元关联法(Binary Relevance, BR):为每个罪名单独训练一个二分类器。它思路直白,但有一个硬伤——假设标签相互独立。可现实中“抢劫”与“故意伤害”经常成对出现,“醉驾”与“肇事逃逸”也有牵连。于是有了分类器链(Classifier Chains):按顺序预测每个标签,把前面预测的结果当作后面模型的输入特征,显式传递标签关联。

周法官的经验里,“见抢必查伤、见醉驾必查逃逸”就是标签关联。BR 像只盯单一罪名的实习助理,分类器链才更像周法官——一边贴标签,一边回头看看刚才贴了啥。

P(y∣x)=∏j=1LP(yj∣x)\displaystyle P(\mathbf{y} \mid x) = \prod_{j=1}^{L} P(y_j \mid x)
把“多个罪名同时成立”的联合概率,拆成“每个罪名各自成立概率”的连乘——这就是二元关联法的数学模样。
  1. 联合概率等号左边是给定案情 x 时,整组标签 y 同时成立的概率,即“多标签预测”要逼近的目标。
    P(y∣x)P(\mathbf{y} \mid x)
  2. 乘积分解二元关联法假设各标签条件独立,把联合概率写成每个标签概率的连乘。
    ∏j=1LP(yj∣x)\prod_{j=1}^{L} P(y_j \mid x)
  3. 逐标签二分每个 $P(y_j \mid x)$ 都由一个独立的二分类器输出,回答“第 j 个罪名成不成立”。
    P(yj∣x),yj∈{0,1}P(y_j \mid x), \quad y_j \in \{0, 1\}

类别不平衡处理

标签盒的“上镜率”差异极大。盗窃、危险驾驶的盒子一天被抽十几次,“破坏选举罪”的盒子一年都不动一次。周法官自嘲:罕见罪名的标签盒放在最高层,自己年纪大了够不着,容易漏。司法数据的罪名分布正呈这种典型的长尾形态:头部几个高频罪名占据绝大多数样本,尾部大量罪名只有零星案例。

模型若不加处理,会“偷懒”——把样本全判成高频罪名,因为这样训练误差最小。类别不平衡处理因此成为司法多标签建模的关键步骤。常用手段分两类:数据层面,对低频罪名过采样(复制样本)或对高频罪名欠采样;损失层面,在二分类交叉熵上给低频标签更大的权重 $w_j$,迫使模型“更怕”在罕见罪名上犯错。权重常取该标签频次的倒数或平方根倒数。

给低频标签加权,好比在周法官的标签盒上贴醒目的“重要!易漏!”提醒,让他每次抽标签都多看一眼高处那个快积灰的盒子。

L=−1N∑i=1N∑j=1Lwj[yijlog⁡pij+(1−yij)log⁡(1−pij)]\displaystyle \mathcal{L} = -\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{L} w_j \left[ y_{ij} \log p_{ij} + (1 - y_{ij}) \log (1 - p_{ij}) \right]
给每个罪名的损失乘以一个权重:越罕见的罪名权重越大,模型犯错的“代价”越高。
  1. 二分类交叉熵方括号内是单个“是否触犯罪名 j”的交叉熵,衡量预测概率 $p_{ij}$ 与真实标签 $y_{ij}$ 的差距。
    yijlog⁡pij+(1−yij)log⁡(1−pij)y_{ij} \log p_{ij} + (1 - y_{ij}) \log (1 - p_{ij})
  2. 标签权重$w_j$ 给低频罪名分配更大的惩罚权重,实现“越容易漏,越要盯紧”。
    wj 与第 j 个罪名的频次成反比w_j \text{ 与第 } j \text{ 个罪名的频次成反比}
  3. 样本与标签求和外层对 N 个样本、L 个标签求和并取平均,得到整体训练损失。
    1N∑i=1N∑j=1L\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{L}

文本表示与建模

周法官“扫一眼”的本事,本质是快速提取案情里的关键词——“持刀”“闯入”“抢走”“划伤”,这些情节直接决定标签。机器要学这个本事,得先把案情文本变成数字。传统做法是 TF-IDF 词袋:把每个词变成一个维度,按词频加权。但词袋丢了语序,“甲杀了乙”和“乙杀了甲”向量几乎一样,在法律文本里这是致命的。

预训练语言模型(如 BERT)通过多层 Transformer 把整段案情编码成一个富含上下文的语义向量,每个词的位置与关系都被建模进去。拿到语义向量后,每个罪名配一个打分向量,内积再过 sigmoid 得到概率。罪名预测与法条推荐共享这个编码器,只是在输出端各接各的分类头——这也是“多任务学习”的雏形。

BERT 之于词袋,就像周法官之于实习生:实习生只会背几个孤立的关键词,周法官却能读懂“持刀闯入”和“持刀路过”在情节上的天壤之别。

h=BERT(x),pj=σ(wj⊤h+bj)\displaystyle \mathbf{h} = \mathrm{BERT}(x), \qquad p_j = \sigma(\mathbf{w}_j^{\top} \mathbf{h} + b_j)
先让 BERT 把案情“读”成一个向量,再让每个罪名拿自己的尺子去量这个向量,量出来的分数转成概率。
  1. 语义编码$\mathrm{BERT}(x)$ 把案情文本 x 编码为一个稠密语义向量 $\mathbf{h}$,词序与上下文都被保留。
    h=BERT(x)\mathbf{h} = \mathrm{BERT}(x)
  2. 线性打分每个罪名 j 有自己的权重向量 $\mathbf{w}_j$ 与偏置 $b_j$,与 $\mathbf{h}$ 做内积得到原始分数。
    wj⊤h+bj\mathbf{w}_j^{\top} \mathbf{h} + b_j
  3. 概率映射sigmoid 函数把任意实数分数压缩到 0 到 1 之间,作为该罪名成立的预测概率。
    σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}

模型架构选择

周法官有个本事:“抢劫”标签在提醒他的时候,他耳朵里只留“暴力、胁迫、抢走”这些词;等贴“故意伤害”标签,关注点又换成“刺伤、打伤、骨折”。模型要做到“不同罪名各看所需”,常用标签注意力机制。每个罪名用一个可学习的“提问向量”对案情中每个词打分,再归一化成注意力权重;加权求和后的向量专供该罪名做判断。

这样,“抢劫”会重点聚合“抢走现金”,“故意伤害”会重点聚合“划伤手臂”。除了注意力,还可以用序列决策模型(分类器链的神经网络版本):按罪名顺序逐个预测,前序预测结果参与后续预测,让“抢劫”的判断提醒模型去检查“故意伤害”。架构选择的本质,是在“独立预测”和“标签关联”之间找平衡。

标签注意力就是给每个罪名配了一副“特制眼镜”:周法官的近视镜看情节全貌,老花镜专盯伤害细节。模型戴上了好几副眼镜,各看各的,又协同决策。

αi(j)=exp⁡(hi⊤qj)∑k=1nexp⁡(hk⊤qj)\displaystyle \alpha_i^{(j)} = \frac{\exp(\mathbf{h}_i^{\top} \mathbf{q}_j)}{\sum_{k=1}^{n} \exp(\mathbf{h}_k^{\top} \mathbf{q}_j)}
每个罪名都举着一个“问题牌子”,案情里的每个词都要回答一次“我跟你这事有没有关系”,有关系就举高手。
  1. 标签提问向量$\mathbf{q}_j$ 是第 j 个罪名的可学习“问题”,代表它关心的情节类型(比如“暴力”)。
    qj\mathbf{q}_j
  2. 注意力打分第 i 个词的向量 $\mathbf{h}_i$ 与问题做点积,分数越高表示这个词与该罪名越相关。
    hi⊤qj\mathbf{h}_i^{\top} \mathbf{q}_j
  3. 归一化对所有词打指数分数后求和归一,得到第 i 个词对第 j 个罪名的注意力权重。
    αi(j)=exp⁡(hi⊤qj)∑k=1nexp⁡(hk⊤qj)\alpha_i^{(j)} = \frac{\exp(\mathbf{h}_i^{\top} \mathbf{q}_j)}{\sum_{k=1}^{n} \exp(\mathbf{h}_k^{\top} \mathbf{q}_j)}

评估指标设计

周法官退休前要考核助手“标签贴得准不准”。若只看助手一天贴对了几张,那实习生天天只贴“危险驾驶”也能蒙对九成——可这毫无意义。评估多标签模型同理。整体准确率(accuracy)要求所有标签全部判对才算对,而且会被高频罪名主导:一个案件“无危险驾驶”这一标签几乎永远为 0,模型只要会预测 0 就能刷高准确率。

因此业界更常用精确率(Precision)、召回率(Recall)与 F1。多标签评估有两种平均方式:宏平均(Macro)先逐罪名计算 F1 再取平均,每个罪名权重相同,低频罪名不会被高频淹没,是长尾场景的首选;微平均(Micro)把所有标签的预测结果汇总后统一算 F1,偏向高频标签。法条推荐这类“给出一串相关法条”的任务,还用排名类指标如 P@k、nDCG 评估排序质量。

宏平均 F1 就像考核时把每个罪名的标签盒单独打分再平均——周法官最关心的,是那些一年才动一次的盒子上,助手有没有同样贴得准。

Macro-F1=1L∑j=1L2PjRjPj+Rj\displaystyle \text{Macro-}F_1 = \frac{1}{L}\sum_{j=1}^{L} \frac{2P_j R_j}{P_j + R_j}
宏平均 F1 像考核时给每个“罪名盒子”单独打分再取平均——不让高频罪名替低频罪名“代考”。
  1. 单标签 F1对第 j 个罪名单独统计精确率 $P_j$ 与召回率 $R_j$,再求它们的调和平均。
    F1(j)=2PjRjPj+RjF_1^{(j)} = \frac{2P_j R_j}{P_j + R_j}
  2. 所有标签平均把 L 个罪名各自的 F1 做算术平均,每个罪名在总分里的权重完全相同。
    1L∑j=1LF1(j)\frac{1}{L}\sum_{j=1}^{L} F_1^{(j)}
  3. 公平对待低频即使某罪名只有几十个样本,它的 F1 与“盗窃”的 F1 在宏平均里平起平坐。
    Macro-F1=1L∑j=1LF1(j)\text{Macro-}F_1 = \frac{1}{L}\sum_{j=1}^{L} F_1^{(j)}

训练与调优策略

周法官带助手有个习惯:先从旧卷宗里挑典型案例让助手练手,练完再拿新卷宗试,试的时候还会微调判断标准——“这个案子伤情不算重,故意伤害的标签可以晚点贴”。模型训练同样有“练手”和“微调”两个环节。多任务学习让模型同时学习罪名预测、法条推荐、甚至情节要素抽取,共享底层语义编码器,相互提供监督信号,是司法小样本场景下的数据增强手段。

数据增强还包括回译(把案情翻译成英文再翻回来)、同义词替换等,扩充低频标签的样本。阈值调优常被忽视但性价比极高:默认把概率 0.5 作为判定阈值,但低频罪名的最佳阈值往往更低或更高。做法是在验证集上扫描阈值,选择使宏平均 F1 最大的那个;每个罪名还可以拥有独立阈值,适配各自的分布形态。

阈值调优就像周法官根据自己的“手感”微调贴标签的松紧度——高频罪名贴严一点,低频罪名放宽一点,整体考核成绩立刻上一个台阶。

tj∗=arg⁡max⁡tMacro-F1(t),y^j=I[pj≥tj]\displaystyle t_j^* = \arg\max_{t} \text{Macro-}F_1(t), \qquad \hat{y}_j = \mathbb{I}[p_j \ge t_j]
预测概率超过阈值才贴标签;阈值本身不是拍脑袋定的 0.5,而是在验证集上“试”出来的最优值。
  1. 判决规则$\mathbb{I}[\cdot]$ 是示性函数,当预测概率 $p_j$ 不低于阈值 $t_j$ 时判定罪名成立。
    y^j=I[pj≥tj]\hat{y}_j = \mathbb{I}[p_j \ge t_j]
  2. 阈值搜索遍历候选阈值,选出使验证集宏平均 F1 最大的 $t_j^*$。
    tj∗=arg⁡max⁡tMacro-F1(t)t_j^* = \arg\max_{t} \text{Macro-}F_1(t)
  3. 标签级阈值每个罪名可拥有各自的阈值,适配不同罪名不同的先验概率与分布。
    t1,t2,…,tLt_1, t_2, \ldots, t_L

司法落地与挑战

就算 AI 助手贴的标签十有八九正确,周法官也不会直接照单全收——他要看到“为什么”:你说这是抢劫,依据的是“持刀闯入”还是“抢走现金”?可解释性是司法 AI 的命门。常用手段是显著性分析:计算每个词对预测概率的梯度贡献,词级显著性分数可视化后,法官能看到模型关注了哪些情节——“持刀”0.82、“抢走现金”0.75、“划伤”0.61。

规则库约束(把模型输出限制在合法罪名空间内)也是常见配套。同时,司法落地要直面数据偏差与伦理问题:历史判决中的地域差异、人群偏差会被模型放大,算法不透明还带来责任归属争议。因此主流定位是“人机协同”:AI 出初稿、法官复核定夺。系统设计要留出人工干预接口,并持续监控各罪名上的偏差指标。

周法官如今和 AI 助手搭档:助手负责把标签草稿、法条便签和“依据哪句话”一起递上来,周法官签字前逐条核对。标签贴得再快,最终落印的还是那只有温度的手。

si=∣∂pj∂ei∣\displaystyle s_i = \left| \frac{\partial p_j}{\partial \mathbf{e}_i} \right|
每个词对最终预测“贡献了多少”,用预测概率对词向量的偏导绝对值来度量——这是给法官看的“依据清单”。
  1. 词向量$\mathbf{e}_i$ 是案情中第 i 个词的向量表示,显著性分析从它出发。
    ei\mathbf{e}_i
  2. 梯度方向$\frac{\partial p_j}{\partial \mathbf{e}_i}$ 表示第 i 个词微调时,罪名 j 的预测概率随之变化的敏感程度。
    ∂pj∂ei\frac{\partial p_j}{\partial \mathbf{e}_i}
  3. 显著性分数取绝对值得到贡献强度 $s_i$,数值越大说明该词对预测越关键。
    si=∣∂pj∂ei∣s_i = \left| \frac{\partial p_j}{\partial \mathbf{e}_i} \right|

AI 应用场景

法院立案庭的“智能分案助手”

阶段:文本表示与模型推理

解决的问题:传统立案分案依赖人工阅读起诉状,速度慢且标准不一;积案高峰期常出现案由错分、法条引用遗漏。AI 用预训练模型把“事实与理由”编码成向量,多标签预测可能罪名并推荐对应法条,让立案法官从“通读全文”变成“一键核对”。

具体案例:东部某中院网上立案平台接入司法大模型后,当事人提交起诉状 10 秒内即收到提示:“本案可能涉及抢劫罪、故意伤害罪,关联《刑法》第263条、第234条”,并自动分流至刑事审判庭,人工复核通过率超过九成。

法官办案系统的“法条指引与类案检索”

阶段:标签注意力模型部署与在线推理

解决的问题:刑事法官撰写判决书需反复核对罪名构成要件并检索同类判例,耗时耗力。以多标签为索引,系统把每份判决书映射成“罪名+法条”标签组合,实现“按罪名组合检索类案”,并把法条要点直接推送到文书编辑器。

具体案例:某省级法院“智慧刑事辅助系统”中,法官输入“被告人醉驾撞人逃逸”,模型同时召回“危险驾驶罪、交通肇事罪”两组标签,拉取近三年相似判例的量刑分布,辅助生成量刑参考区间。

律所与企业的“多标签合规风控”

阶段:模型评估与阈值调优

解决的问题:企业法务面对海量招投标文件、合同与举报材料,人工逐份筛查法律风险点效率低、遗漏多。多标签模型把每份文档标注为“可能触犯罪名+相关法条”的组合,并输出各标签概率与显著性依据。

具体案例:某大型国企合规中台对招投标文档做风险预筛,模型标注“串通投标罪(0.87)、受贿风险(0.62)”,同时给出命中的关键语句切片,合规专员据此优先审查高风险文件。

Python 演示

python55 行
import numpy as npfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.multioutput import MultiOutputClassifierfrom sklearn.metrics import f1_score, hamming_loss # 8 份简化案情文本,标签列: 0抢劫 1故意伤害 2盗窃 3诈骗 4危险驾驶 5敲诈勒索cases = [    "被告人持刀闯入被害人家中,抢走现金两万元,并划伤被害人手臂。",    "被告人深夜翻墙进入仓库,秘密窃取电缆一批,价值三万元。",    "被告人在夜市饮酒后驾驶摩托车,撞倒行人后逃逸。",    "被告人虚构投资项目,骗取多名老人积蓄共计五十万元。",    "被告人因琐事与邻居争执,持棍将对方打成轻伤。",    "被告人多次在商场扒窃手机,共作案六起。",    "被告人醉酒驾驶轿车,追尾前车致三人受伤。",    "被告人冒充警察,以办案为由向他人索要财物。",]labels = np.array([    [1, 1, 0, 0, 0, 0],    [0, 0, 1, 0, 0, 0],    [0, 0, 0, 0, 1, 0],    [0, 0, 0, 1, 0, 0],    [0, 1, 0, 0, 0, 0],    [0, 0, 1, 0, 0, 0],    [0, 1, 0, 0, 1, 0],    [0, 0, 0, 0, 0, 1],]) # 中文按字 n-gram 切分并转 TF-IDF,绕过分词依赖X = TfidfVectorizer(analyzer="char_wb", ngram_range=(2, 3)).fit_transform(cases)# 手工划分训练/测试,确保每个低频罪名在训练集都有正样本train_idx = [0, 1, 2, 3, 4, 7]test_idx = [5, 6]X_train, X_test = X[train_idx], X[test_idx]y_train, y_test = labels[train_idx], labels[test_idx] # 二元关联法: 每个罪名一个独立 LogisticRegression 二分类器clf = MultiOutputClassifier(LogisticRegression(max_iter=1000))clf.fit(X_train, y_train) # 收集每个罪名的预测概率,供阈值调优使用y_prob = np.stack([est.predict_proba(X_test)[:, 1] for est in clf.estimators_], axis=1)y_pred = (y_prob >= 0.5).astype(int) print("默认阈值 0.5 的 Macro-F1: %.3f" % f1_score(y_test, y_pred, average="macro"))print("汉明损失: %.3f" % hamming_loss(y_test, y_pred)) # 阈值调优: 在验证集上扫描阈值,选宏平均 F1 最高的best_t, best_f1 = 0.5, f1_score(y_test, y_pred, average="macro")for t in np.arange(0.30, 0.80, 0.05):    cur_f1 = f1_score(y_test, (y_prob >= t).astype(int), average="macro")    if cur_f1 > best_f1:        best_t, best_f1 = t, cur_f1 print("最优阈值: %.2f, 对应 Macro-F1: %.3f" % (best_t, best_f1))
目的:演示多标签分类的完整流水线——从中文案情文本建向量,用二元关联法训练多标签分类器,再通过阈值调优提升宏平均 F1。
  1. X = TfidfVectorizer(analyzer="char_wb", ngram_range=(2, 3)).fit_transform(cases)把中文案情按字 n-gram 切分并转 TF-IDF 向量,模型才能“读到”文本。
  2. train_idx = [0, 1, 2, 3, 4, 7]手工划分训练集,保证每个低频罪名在训练集里都有正样本。
  3. clf = MultiOutputClassifier(LogisticRegression(max_iter=1000))二元关联法的工程落地:一个“装了一排二分类器”的容器。
  4. y_prob = np.stack([...], axis=1)把每个罪名的预测概率收集成矩阵,为阈值调优做准备。
  5. y_pred = (y_prob >= 0.5).astype(int)默认阈值 0.5:概率过半就贴标签。
  6. f1_score(y_test, y_pred, average="macro")宏平均 F1:每个罪名一视同仁。
  7. for t in np.arange(0.30, 0.80, 0.05)在验证集上“试手感”,扫描不同阈值找最优。

常见误区

误区“每个刑事案件都对应一个主要罪名,所以这不是多标签问题,按多分类做就行。”

正解司法实践中一行为触犯数罪(想象竞合)与数行为犯数罪非常普遍。抢劫过程中造成被害人轻伤,就同时命中“抢劫罪”与“故意伤害罪”。多分类的 softmax 强制类别互斥,多标签的 sigmoid 允许标签同时成立,两者的输出层、损失函数与评估指标完全不同。周法官贴标签从来是“能贴几张贴几张”。

为何常见:大众直觉里“一个案子一个罪名”,主要因为新闻报道只强调主罪名,忽略了竞合与数罪并罚的司法现实。

误区“把每个罪名单独训练一个二分类器,拼起来就是多标签模型,不用管标签之间的关系。”

正解二元关联法假设标签独立,但“抢劫”与“故意伤害”、“醉驾”与“肇事逃逸”之间关联很强。忽略关联会让模型在“贴上抢劫、漏掉故意伤害”的场景里犯错。分类器链、标签注意力等方法显式建模关联,效果通常更好。周法官那句“见抢必查伤”,正是标签关联的专家版。

为何常见:二元关联法把复杂问题降维成熟悉的二分类,工程上极容易实现,让人误以为“简单即正确”。

误区“测试准确率 95%,说明模型在法院里可以直接用了。”

正解当 97% 的案件标签为“非危险驾驶”时,一个无脑输出 0 的模型也有 97% 的“准确率”。长尾罪名场景必须看宏平均 F1、各罪名召回率与混淆矩阵,尤其盯着低频标签的表现。评估指标设计的原则是:让每个罪名在考核里都拥有发言权,而不是被高频标签裹挟。

为何常见:准确率是人类最熟悉的分类直觉,但在极端不平衡数据上,它是最容易骗人的指标。

误区“AI 能预测罪名还能推荐法条,离自动判案就差一个打印按钮了。”

正解司法 AI 只能做“预判—推荐—检索”式的辅助。罪名认定依赖证据链、主观故意与法律解释,这些无法仅凭案情文本确定;算法还会放大历史数据里的地域与人群偏差。工程上必须保留法官复核环节,并用显著性分析给出预测依据。周法官让 AI 助手贴草稿标签,但盖章签字的永远是自己。

为何常见:媒体热衷于“AI 法官”叙事,混淆了“辅助工具”与“决策主体”的边界。

面试题

Q1. 多标签分类与多分类(单标签)的根本区别是?

单选题 · easy

  • A.输出类别数量的多少不同
  • B.训练数据规模的差别
  • C.必须使用神经网络模型
  • D.是否同时预测多个类别标签← 正确答案

答案:D。多分类输出互斥的一个类别,多标签同时输出多个类别的 0/1 判断,D 准确描述了根本区别。A 只是表象,B 与数据规模无关,C 错误——多标签也可用传统机器学习实现。

Q2. 二元关联法(Binary Relevance)的核心思想是?

单选题 · easy

  • A.将所有标签组合合并成新标签
  • B.为每个标签训练独立二分类器← 正确答案
  • C.用聚类算法对案例分组处理
  • D.将案情压缩成定长语义向量

答案:B。二元关联法把多标签拆成 L 个独立的“是/否”二分类问题,各训练一个分类器。A 是标签组合法(Label Powerset)的思路,C 是无监督聚类,D 是文本表示问题,均与 BR 定义不符。

Q3. 标签层次结构能给模型带来哪些帮助?

多选题 · mid

  • A.借助类目层级约束预测范围← 正确答案
  • B.利用父类信息缓解样本稀疏← 正确答案
  • C.可以完全不看案情事实文本
  • D.自动生成判决书的法律依据

答案:AB。层次结构让模型先预测大类再细分,父类信息能补充低频子类的统计量,因此 A、B 正确。C 违背任务前提——任何预测都要读案情;D 属于文书生成任务,超出罪名预测范畴。

Q4. 罪名分布呈长尾形态,最直接的后果是?

单选题 · mid

  • A.模型对高频罪名严重过拟合
  • B.低频罪名训练样本严重不足← 正确答案
  • C.高频罪名精确率一定最低
  • D.所有罪名都无法被正确预测

答案:B。长尾意味着大量罪名样本极少,模型难以学到它们的特征,B 是最直接后果。A 高频过拟合不必然发生,C“一定最低”过于绝对,D 则夸大了问题。

Q5. 加权损失函数处理类别不平衡的方式是?

单选题 · mid

  • A.给低频罪名分配更大的损失权重← 正确答案
  • B.给高频罪名分配更大的损失权重
  • C.直接删除高频罪名的所有样本
  • D.将损失函数替换成准确率指标

答案:A。权重与频次成反比,低频罪名犯错代价更大,模型才会“重视”它们。B 方向相反会加剧不平衡,C 是粗暴删除样本的做法,D 把损失换成不可导的指标没有意义。

Q6. 关于宏平均 F1(Macro-F1),下列说法正确的有?

多选题 · mid

  • A.先逐标签计算 F1 再取算术平均← 正确答案
  • B.对低频罪名与其他罪名一视同仁← 正确答案
  • C.等于所有样本的整体精确率
  • D.适合评估长尾分布下的多标签模型← 正确答案

答案:ABD。宏平均先逐标签算 F1 再平均,每个罪名权重相同,低频不被高频淹没,A、B、D 正确。C 混淆了宏平均与微平均/整体准确率的概念。

Q7. 标签注意力机制的主要作用是?

单选题 · hard

  • A.让不同罪名关注案情不同片段← 正确答案
  • B.将整个案情压缩成一个向量
  • C.完全替代预训练语言模型
  • D.直接决定判决的刑期长短

答案:A。每个罪名用一个提问向量对案情各词加权聚合,“抢劫”看暴力情节、“故意伤害”看伤情描述,A 正确。B 是编码器的通用职责,C 夸大了注意力机制的能力,D 属于量刑模块而非罪名预测。

Q8. 阈值调优的基本思路是?

单选题 · mid

  • A.在验证集上搜索最优判定阈值← 正确答案
  • B.将默认阈值固定为零点五
  • C.让模型输出恒定不变的结果
  • D.用随机概率替代判定阈值

答案:A。默认 0.5 不一定适合每个罪名,在验证集上扫描阈值、选宏平均 F1 最高的值即为调优。B 是默认做法而非调优,C、D 是错误操作。

Q9. 司法 AI 落地时,可解释性有哪些常用手段?

多选题 · hard

  • A.词级显著性分数可视化解释← 正确答案
  • B.输出预测所依据的关键情节← 正确答案
  • C.完全取消法官的人工复核
  • D.用规则库约束模型输出边界← 正确答案

答案:ABD。梯度显著性给出词级贡献,输出关键情节切片,规则库把预测限定在合法罪名空间内,A、B、D 都是可解释性手段。C 取消人工复核与司法责任要求相悖。

Q10. “案情文本表示”最恰当的理解是?

单选题 · easy

  • A.将案件情节转换为模型可算的向量← 正确答案
  • B.用人工方式摘抄案件的关键词
  • C.把判决书原样复制进数据库
  • D.将罪名名称拼接成一句话

答案:A。文本表示的核心是把自然语言案情转成数值向量供模型计算,A 正确。B 是人工特征工程、效率低;C 只是存储;D 混淆了标签与输入文本。