如何利用CRF模型predict_marginals计算文档级不确定性用于主动学习
NER主动学习中文档不确定性分数计算问题
需求说明
我的目标是在命名实体识别(NER)任务中应用主动学习,需要为待识别的每个文档计算不确定性分数,以此筛选出最优先用于标注训练的文档。
文档存储在文本文件中,格式为:每个文档由「单句换行+多句」组成(如文档1是一行单句加换行后的多句内容,文档2同理)。
我使用CRF模型的predict_marginals方法获取每个token对应所有类别的概率,希望给每个文档分配平均不确定性分数,找出不确定性最高(模型最没把握)的文档。目前的做法是对每个token计算1-最大概率得到该token的不确定性,再对每个句子的token不确定性取平均得到句子级分数,但有两个疑问:
- 这个token级的不确定性计算方法是否合理?
- 如何将句子级的计算扩展到文档级?
现有代码
def classifier_uncertainty(self, x): """ 通过公式(1-最大概率值)计算每个token的不确定性,再取平均值得到每句话的不确定性数组 """ predictions = self.predict_proba(x) # 输入是句子列表,每个句子的每个token对应多个类别概率(数量等于标签数) resultat = 1 - predictions.max(axis=-1) # 计算每个token的不确定性 uncertainties = np.mean(resultat, axis=1) # 对每句的token不确定性取平均,得到句子级分数 return uncertainties
解决方案建议
1. token级不确定性计算的合理性
你用的1-最大概率方法是主动学习中置信度不确定性的标准计算方式,完全合理。这个值代表模型对当前token预测结果的不确定程度:最大概率越低,模型越没把握,1-最大概率的值就越高,不确定性越强。这种方法在NER的主动学习场景中被广泛使用,无需调整。
2. 扩展到文档级的实现思路
要得到文档级的不确定性分数,核心是把文档内所有token的不确定性值汇总计算,而不是只停留在句子层面:
- 第一步:将每个文档拆分为句子(匹配你的文件格式:每个文档对应「单句+换行+多句」的内容,先拆分出文档内的所有句子)
- 第二步:对文档内每一个句子的所有token,计算
1-最大概率得到单个token的不确定性 - 第三步:将整个文档中所有token的不确定性值放在一起,取全局平均值,就是该文档的最终不确定性分数
- (可选)如果某些句子/token对任务更重要,可以引入加权平均,但无特殊需求时,简单平均足够满足筛选需求
调整后的代码示例
def document_uncertainty(self, doc_sentences): """ 输入单个文档的句子列表,返回该文档的平均不确定性分数 """ # 获取每个句子中所有token的概率分布 predictions = self.predict_proba(doc_sentences) # 计算每个token的不确定性 token_uncertainties = 1 - predictions.max(axis=-1) # 将所有token的不确定性展平为一维数组,计算全局平均值 doc_uncertainty = np.mean(token_uncertainties.flatten()) return doc_uncertainty # 使用示例:假设docs是所有文档的列表,每个元素是该文档的句子列表 doc_uncertainty_scores = [self.document_uncertainty(doc) for doc in docs] # 按不确定性从高到低排序,得到优先标注的文档索引 sorted_indices = np.argsort(doc_uncertainty_scores)[::-1] priority_docs = [docs[i] for i in sorted_indices]
内容的提问来源于stack exchange,提问作者Balkhrod
相关产品推荐
相关产品推荐

