小样本专利相关性筛选:一个从 100 条不到的标注数据起步的项目实践

很多文本分类项目一开始都会默认一个前提:先有一批像样的标注数据,再谈模型效果
但真实项目里,经常不是这样。

这次做的是一个专利相关性筛选任务。目标并不复杂:从一批专利中找出与目标技术方向更相关、值得进一步研究的候选专利。真正复杂的是现实条件:

  • 已标注样本不到 100 条
  • 正样本更少
  • 未标注样本有上千条
  • 专利文本很长,表达也不统一
  • 结果还需要能回写到原始表格,方便人工复核

在这种条件下,项目的重点其实不是“堆一个多复杂的模型”,而是先找到一条能跑通、能迭代、能扩充数据的路线。

这篇文章就总结一下这个项目的思路、取舍和踩坑。


1. 项目到底在做什么

从任务定义上看,这其实是一个很标准的二分类问题:

  • relevant:相关专利
  • irrelevant:不相关专利

但从业务视角看,它更像一个筛选系统,而不是一个追求绝对准确率的学术分类器。

我真正想解决的问题不是:

“模型能不能把每一条专利都 100% 判对?”

而是:

“能不能先把最值得看的相关候选排到前面,减少人工筛选成本?”

这个目标的变化非常重要。
因为在小样本阶段,模型更适合作为:

  • 概率打分器
  • 候选发现器
  • 人工筛选辅助工具

而不是最终裁决者。


2. 数据长什么样

项目里每条专利大致包含这些字段:

  • Publication Number:公开号
  • Claims:权利要求相关文本
  • Description:描述文本
  • IPC:国际专利分类号
  • label:人工标注结果,仅训练阶段有

这里有一个容易被忽略但很关键的点:

Publication Number 要保留,但不要喂给模型

它的作用是:

  • 标识这条样本是谁
  • 后续和原始 Excel 对齐
  • 预测结果回写
  • 人工复核定位

但它本身不是语义特征,不应该参与模型学习。
如果把它拼进输入文本里,模型学不到什么有用信息,反而可能引入噪声。

所以在整个流程里,我一直保留 Publication Number,但只把它当作样本主键


3. 为什么没有一上来就重度微调 BERT

这个问题其实很关键。

一开始最自然的想法是:
既然是文本分类,那就直接用 BERT 微调不就好了?

理论上可以,但在这个项目里不太合适,原因很现实:

  • 已标注样本太少
  • 正负样本不平衡
  • 文本很长
  • 输入字段比较多
  • 直接全参数微调很容易过拟合

简单说就是:模型复杂度和数据规模不匹配

所以项目初期没有走“重度微调”的路线,而是用了一个更稳的方案:

预训练 BERT 提文本向量 + 轻量分类器完成小样本分类

这个思路听上去朴素,但在数据量很小的时候往往更稳。


4. 第一版技术路线:BERT 向量 + 小分类器

第一版方案拆开看,其实很简单:

第一步:把多个字段拼成统一输入文本

例如:

Claims: ...
[SEP]
Description: ...
[SEP]
IPC: ...

如果后面还有新字段,比如新的说明文本,也可以按同样方式继续拼接进去。

这个阶段我尽量避免过于复杂的文本工程,核心原则是:

  • 结构统一
  • 输入稳定
  • 尽量贴近训练和推理的一致性

第二步:用预训练 BERT 提取语义向量

这里 BERT 的角色不是最终分类器,而是文本表示器

也就是说,先让模型把一条专利文本变成一个向量表示,再把这个向量送给下游的小分类器。

第三步:用 Logistic Regression 或小型 MLP 做分类

在不到 100 条数据的条件下,这类轻量模型更合适,因为:

  • 参数少
  • 更不容易过拟合
  • 训练速度快
  • 可解释性相对更强

这一阶段的目标不是追求“最强效果”,而是先做出一个能给未标注样本打分的 baseline。


5. 小样本阶段,评估方式比模型更重要

在这种项目里,一个常见误区是:
只看一次 train/valid 划分结果,然后根据一个 accuracy 下结论。

这其实很危险。

因为当样本非常少时,单次划分带来的波动会很大。
所以这个阶段我更倾向于:

  • 使用 Stratified K-Fold
  • 看交叉验证输出概率
  • 关注 F1、Recall、ROC-AUC
  • 更关注 Top-K 结果是否有业务意义

尤其是在专利筛选这种任务里,accuracy 往往并不是最重要的指标。

如果目标是“先抓出值得研究的候选专利”,那更应该关注的是:

  • 高分样本里有多少真相关
  • 低分样本里有多少真不相关
  • 模型排序是否合理

这比单看一个整体分数更实用。


6. 为什么 threshold 很重要

模型最终通常会输出两类概率:

  • prediction_probs_0:不相关概率
  • prediction_probs_1:相关概率

两者通常和为 1。

而真正把概率变成标签的,是 threshold

例如常见规则是:

  • 如果 prediction_probs_1 >= threshold,则判为 relevant
  • 否则判为 irrelevant

这里有个很重要的工程问题:
threshold 不一定要固定在 0.5。

如果想让正样本更准确

也就是希望被判成 relevant 的样本尽量真的是相关专利,那就应该把阈值调高,比如:

  • 0.7
  • 0.8
  • 0.9

这样会减少误报,但也会漏掉一部分真实正样本。

如果想让负样本更准确

也就是希望被判成 irrelevant 的样本真的大多数不相关,那就要把阈值调低,比如:

  • 0.3
  • 0.2
  • 0.1

这样会让模型更容易把样本判成正类,只有特别不像正类的才进入负类。

在这个项目里,更推荐双阈值

在小样本专利筛选场景中,我后来更倾向于用这种方式:

  • prob >= 0.8:高置信正样本候选
  • prob <= 0.2:高置信负样本候选
  • 中间区域:人工复核

这比单一阈值切分更适合当前阶段。


7. 为什么要做“推理打分 + 样本扩充”

这个项目一个核心现实是:
未标注样本远多于已标注样本。

这意味着第一版小模型真正的价值,不是“直接把所有未标注样本判死”,而是:

先给这批未标注专利打一个相关概率分数。

然后做三件事:

1. 挑高分样本

这些样本更像正样本,适合作为候选相关专利交给人工复核。

2. 挑低分样本

这些样本更像负样本,适合作为候选不相关样本。

3. 看边界样本

最接近阈值的样本通常是模型最不确定的,也是最值得人工看的。

也就是说,第一版模型的使命不是终结任务,而是:

  • 帮助发现高价值样本
  • 降低人工筛选成本
  • 为下一轮训练积累更多高质量标注

8. 推理时为什么还要保留原始表格字段

做完推理以后,经常还会有一个实际需求:

“怎么把预测结果和原始带公开号的表格拼起来?”

这也是为什么我一直强调,训练和推理过程中要保留 Publication Number

这样做有几个好处:

1. 预测结果可回写

最终结果表可以直接带上:

  • 原始字段
  • 预测标签
  • 预测概率

2. 方便人工复核

比如只看高分 top 50 的样本,可以直接定位到具体专利。

3. 方便后续导出和统计

包括:

  • Excel 输出
  • 结果聚合
  • 筛选指定范围的专利

所以从工程角度讲,Publication Number 不是可有可无的字段,而是整个流程的“连接器”。


9. 项目里踩过的一些坑

坑一:训练和推理模型结构不一致

这类错误非常典型。
比如训练时 code_embed_dim=32,推理时重建模型却写成了 64,就会导致:

  • embedding 层维度不匹配
  • MLP 输入层维度不匹配
  • load_state_dict 报错

这类问题说明一个很重要的工程经验:

checkpoint 里不仅要保存参数,还要保存结构超参数。

否则推理阶段很容易“看起来代码一样,实际上结构不一样”。


坑二:把推理代码和验证代码混在一起

在验证集上可以有 label,所以能算:

  • real
  • precision
  • recall
  • f1

但新数据推理时没有 label,如果还沿用验证阶段的写法,就会直接报错。

这其实提醒我一个很简单但常被忽略的事实:

推理阶段不需要真实标签,只需要输出预测结果和预测概率。


坑三:新增字段不一定总是增益

后来数据里增加了新的文本字段,比如:

  • Patent Claims
  • Instruction manual

一开始直觉上会觉得:
信息更多,效果应该更好。

但实际做下来会发现不一定,因为新增字段可能带来:

  • 文本更长
  • 截断更严重
  • 和原字段高度重复
  • 小样本下噪声更大

所以更稳的做法不是一股脑全加,而是逐步实验:

  • 原始两列
  • 加一列
  • 四列全加

比较哪种组合在当前数据规模下更合适。


10. 这个项目现在到底算什么阶段

如果一定要给它一个定位,我会把它定义为:

一个面向专利筛选场景的小样本语义分类与候选排序系统

重点是这几个词:

小样本

说明现在数据规模还不足以支撑复杂模型完全稳定发挥。

语义分类

说明核心不是关键词命中,而是利用预训练语言模型做语义表示。

候选排序

说明当前更看重的是“把值得看的样本排到前面”。

系统不是为了替代人工,而是为了把人工从全量粗筛中解放出来。


11. 如果继续做下去,后面怎么优化

这个项目后面最值得做的方向,其实不是先继续堆模型,而是继续把“数据闭环”做起来。

1. 优先扩充高质量标注

在这个任务里,数据质量明显比模型复杂度更重要。

2. 引入主动学习

优先让人工检查:

  • 最高分样本
  • 最低分样本
  • 最不确定样本

这样可以用最小成本获得最大增益。

3. 尝试更适合专利语料的模型

等样本进一步积累后,可以考虑:

  • 专利领域专用 BERT
  • sentence-transformer
  • rerank 模型

4. 做成“两阶段系统”

第一阶段先粗筛,第二阶段再重排,会更符合真实业务场景。


12. 总结

这个项目给我最大的感受,不是“BERT 好不好用”,而是:

在小样本场景里,工程取舍比模型复杂度更重要。

真正有价值的,不是上来就追求一个多复杂的网络,而是先把这些问题解决掉:

  • 输入格式是否统一
  • 训练和推理是否一致
  • 结果能不能回写到原表
  • 概率输出能不能支持候选筛选
  • 模型能不能帮助人工减少工作量

在当前阶段,这个项目最合适的定位不是“一个已经成熟的自动分类系统”,而是:

一个能够稳定输出相关概率、帮助发现高价值候选专利的小样本筛选工具。

而这恰恰是很多真实项目真正需要的第一步。


关键词

  • 小样本文本分类
  • 专利相关性筛选
  • BERT 向量表示
  • Logistic Regression baseline
  • 候选排序
  • 主动学习
  • 概率阈值
  • 伪标签扩充
  • 专利语义匹配