你呀,你别再关心灵魂了,那是神明的事。你所能做的,是些小事情,诸如热爱时间,思念母亲,静悄悄地做人,像早晨一样清白。
——海桑《我是你流浪过的一个地方》
全文字数:3624字
阅读时间:18分钟
前言
中文分词指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。中文分词操作是中文信息处理的第一站,中文分词效果的好坏直接影响后续自然语言处理任务。在中文分词任务中,一般使用在标准数据集上词语级别的精准率、召回率以及F1值来衡量分词器的准确程度,这三种指标通常用于衡量分类器的准确程度。不过想要理解这三个指标,首先要理解什么是混淆矩阵。
a
混淆矩阵
在分类任务中每个样本都有相应的真实值以及算法预测的预测值。具体在二分类任务中,两个不同类别值分为0和1,可以使用正类负类也可以直接将类别用0和1的数值来表示,比如样本的真实值为1表示样本的真实类别为类别1。还需要注意,通常将我们关注的事件表示为类别1,比如在癌症预测中我们更关注受试者有没有患有癌症,因此将患有癌症的受试者表示为类别1,没有患有癌症的受试者表示为类别0。
二分类任务中样本的真实值和算法的预测值两两组合共有四种情况,所有的样本属于四种情况中的任意一种情况,具体将四种情况通过表格展示,表格中的元素值就为符合对应组合条件的样本总数。
▲两两组合的四种情况
其中行代表真实值,列代表预测值,0代表Negative负类,1代表Positive正类。上面的表格就是混淆矩阵的基本框架,混淆矩阵为四种情况分别命名。
- 在(0, 0)位置的样本真实值为0(Negative),同时分类算法将样本正确预测为0(Negative),分类算法预测正确,所以称为True Negative,简称TN;
- 在(0, 1)位置的样本真实值为0(Negative),但是分类算法将样本错误预测为1(Positive),分类算法预测错误,所以称为False Positive,简称FP;
- 在(1, 0)位置的样本真实值为1(Positive),但是分类算法将样本错误预测为0(Negative),分类算法预测错误,所以称为False Negative,简称FN;
- 在(1, 1)位置的样本真实值为1(Positive),同时分类算法将样本正确预测为1(Positive),分类算法预测正确,所以称为True Positive,简称TP;
▲二分类的混淆矩阵
上面表格就是机器学习中的混淆矩阵,用来衡量分类结果的混淆程度。不过这里需要注意几点:
- 混淆矩阵中每一个位置的元素值可以理解为满足对应条件的样本总数;
- 样本全集 = TN ∪ FP ∪ FN ∪ TP;
- 任何一个样本都属于且只属于4个集合中的一个;
下面来看一个简单的小例子,以癌症预测为例。假设现在一共有1000名受试者,假设有一个模型算法对这1000名受试者预测是否患有癌症。算法对1000名受试者进行预测后的混淆矩阵如下所示。
▲癌症预测的混淆矩阵
对于上面的混淆矩阵,其中:
- TN = 970,1000名受试者中本身没有患有癌症,同时算法正确的预测没有患有癌症的一共有970人;
- FP = 20,1000名受试者中本身没有患有癌症,但是算法错误预测患有癌症的一共有20人;
- FN = 4,1000名受试者中本身患有癌症,但是算法错误预测没有患有癌症的一共有4人;
- TP = 6,1000名受试者中本身患有癌症,同时算法正确的预测患有癌症的一共有6人;
有了混淆矩阵,精准率、召回率和F1值这三个指标就能够确定了。
b
精准率、召回率和F1值
精准率(precision,简称P值)指的是算法预测为1并且预测正确的样本个数(TP)占所有预测为1的样本个数(TP FP)的比重,即
。
召回率(recall,简称R值)指的是算法预测为1并且预测正确的样本个数(TP)占所有真实为1的样本个数(TP FN)的比重,即
。
精准率越高,分类算法越会将更有把握的样本分类为1。召回率越高,分类算法越会将没有把握的样本分类为1。显然精准率和召回率是相互矛盾相互制衡的两个指标。精准率高往往召回率比较低,召回率高往往精准率比较低。
在不同任务中我们可能需要关注不同的指标,比如在预测股票升降的二分类问题中,我们更倾向于损失最小化,因此在这些任务中更倾向于关注精准率。在医疗领域中诊断受试者是否患有癌症的二分类问题中,我们更倾向于挑选出更多可能患有癌症的受试者,而算法预测错误的代价仅仅是受试者多做一些检查而已,因此在这些任务中更倾向于关注召回率。
当然在一些任务中也会寻找精准率和召回率这两个指标之间的平衡,因此需要一个综合性的指标来衡量,比如使用精准率和召回率的调和平均的F1值。F1值能够兼顾精准率和召回率两个指标,F1值的具体公式如下所示。
由于F1值的本质是计算精准率和召回率的调和平均值,因此只有精准率和召回率两个指标同时比较高的时候,F1值才会比较高:
- 假设精准率P = 100%,召回率R = 1%,此时的F1 = 1.98%;
- 假设精准率P = 1%,召回率R = 100%,此时的F1 = 1.98%;
- 假设精准率P = 50%,召回率R = 50%,此时的F1 = 50%;
有了精准率、召回率以及F1值的计算方式,接下来通过上面癌症预测系统的混淆矩阵来计算精准率、召回率以及F1值。
▲癌症预测的混淆矩阵
- 精准率
;
- 召回率
;
- F1值
;
有了混淆矩阵中的元素值,计算精准率、召回率以及F1值就变得非常容易。这也是为什么说有了混淆矩阵,精准率、召回率以及F1值这三个指标就基本确定的原因。
c
中文分词中P、R、F1的计算
由于F1值的本质就是计算精准率P和召回率R的调和平均值,因此有了精准率和召回率,自然可以求出F1值,因此接下来主要介绍如何计算中文分词的精准率和召回率。
混淆矩阵是计算精准率和召回率的关键所在,因此有了混淆矩阵中的具体元素值,接下来只需要相应的代入精准率和召回率的计算公式中。前面介绍的混淆矩阵是由分类问题引出的,并且真实的样本个数和预测的样本个数相等,而中文分词是一个分块任务(chunking),并且标准答案的分词和中文分词算法预测分词结果的单词数不一定相等,以"结婚的和尚未结婚的"为例,标准答案为"结婚 的 和尚未 结婚 的"一共6个单词,使用正向最长匹配算法为"结婚 的 和尚 未结婚 的"一共5个单词。
如果想要计算中文分词中的精准率和召回率需要解决两个问题:
- 如何将中文分词的分块问题转换为分类问题?
- 如何将转换为分类问题的中文分词映射到混淆矩阵中,进而求出精准率和召回率?
▍ 如何将中文分词的分块问题转换为分类问题
对于长度为n的字符串,分词结果为一系列单词。每个单词按它在文本中起始位置可以记作区间[i, j],其中1 ≤ i ≤ j ≤ n。分类问题中的真实值映射成中文分词中的标准分词结果,而预测值映射到分词算法预测的分词结果。
- 将标准分词结果的所有区间构成一个集合
,作为正类(真实值为1),将集合
之外的所有区间构成的另外一个集合
(
的补集),作为负类;
- 将分词算法预测的分词结果的所有区间构成一个集合
,作为正类(真实值为1),将集合
之外的所有区间构成另外一个集合
(
的补集),作为负类;
依然以"结婚的和尚未结婚的"为例,将标准答案以及分词算法预测的分词结果转换为区间集合的形式。
▲分块问题转换为分类问题
将标准分词结果与分词算法预测的分词结果映射到混淆矩阵中。
▲中文分词已知的信息
不论是标准分词还是分词算法预测的分词结果中负类(值为0)的区间有很多种情况,推导出所有可能的情况非常繁琐,而且没有必要,因为精准率、召回率的计算恰好只需要混淆矩阵中的第二行第二列的信息。
▍ 如何映射到混淆矩阵中
原始混淆矩阵中的元素表示满足对应条件的样本个数,而我们现在仅仅有由区间构成的集合。这里可以将集合中的每一个区间元素都认为是一个单独的样本标签,每一个区间元素都代表一个单独的样本,虽然这些样本标签值不相同,但是它们所代表的都是正类1。比如集合{[1, 2], [3, 3], [4, 4], [5, 6]},集合中一共有四个元素所以有4个样本,样本1的标签值为[1, 2],样本2的标签值为[3, 3]等,虽然这些标签值不相同,但是表示的都是正类。
集合A中的元素代表所有真实为正类的样本集合,因此所有标准分词的正类FN TP = |A|,其中"||"表示集合中的元素个数。同理集合B中的元素代表所有分词算法预测为正类的样本集合,因此所有分词算法预测为正类FP TP = |B|。
有了FN TP和FP TP的值,回顾一下计算精准率和召回率的公式,此时精准率和召回率的分母有了,只需要计算出精准率和召回率相同的分子TP值。TP表示真实值为1并且算法预测为1的样本个数。由于将集合中的区间元素看成单独的样本,所以只需要找到那些既在集合A中又在集合B中的区间元素,即A ∩ B,因此TP = |A ∩ B|。
综上,中文分词下的精准率和召回率的计算公式如下:
依然以"结婚的和尚未结婚的"为例,计算在中文分词下的精准率、召回率以及F1值。
▲中文分词下的三个集合
此时精准率、召回率以及F1值为:
当然这仅仅是一条测试文本,如果有多条测试文本只需将结果累加到集合中,最后计算一次精准率和召回率即可。
比如现在有两条测试文本:
- 第一条测试文本
;
- 第二条测试文本
;
此时的中文分词算法的精准率、召回率以及F1值为:
参考:
- 《自然语言处理入门》