我所说的一切都可能是错的!
即使你赞同我的观点,
你的生活也不会因此有任何改变!
除非——你采取了相应的行动。
(这是书先生的第228篇原创分享。文:书先生,2021年4月17日,新加坡)
引子
前几天约了一位教授喝咖啡聊天。
这位教授和我一样,也喜欢做语言量化分析。除此之外,我们还有一个共同的爱好,就是做语言学科普。有共同爱好,聊起来就很愉快,不知不觉一两个小时就过去了。
聊天中,这位教授问我哪种计算文本距离的方法更好,因为他最近正在分析一些学生写作的文本特征。计算文本距离(也叫文本相似度)的方法有很多种,Scipy库的pdist函数就包含了22种方法。不过,文本分析中最常用的还是曼哈顿距离、欧几里得距离和余弦距离三种。
不要给这些名字给吓到了,其实都是些很简单的方法。我用得最多的是余弦距离,一方面是这种方法不受文本长度影响,另一方面是很多常用的python自然语言处理库默认采用这种方法,比如现在很流行的spaCy,里面的similarity函数就默认使用余弦距离。
这些方法是如何计算距离的、什么情况下用,这篇文章就不展开来说了,因为不是今天我想要分享的主题。不过我很享受把这些东西讲清楚的乐趣,所以以后我肯定会专门写篇文章来介绍各种计算文本相似度的方法。
回到本文的主题。主题是思考的乐趣,但似乎现在还看不到它的影子。别急,马上来了。这个主题是随后的讨论引发的。
我问这位教授准备用哪些feature来计算相似度,他告诉我其中一个是词汇密度(lexical density)。今天的分享就是这个概念引发的。
第一种乐趣:What if ...或Is it possible that ...
所谓词汇密度,就是一个文本里实词的比例。语言里的词汇可以分为两类。一类是实词(content words),也叫词汇词(lexical words),包含名词、动词、形容词和副词。另一类是虚词(function words),也叫语法词(grammatical words)。除了实词,其它都是虚词。另外,英文里助动词也都统统归为虚词。
显然,一个文本的信息其实都在实词里面,所以词汇密度实际上反映的是一个文本的信息密度。
聊天后,回寝室的路上,我突然想到一个有意思的问题:当我们在比较两组(A组和B组)数量相同的文本时,有没有可能一对一比较时,A组每一篇词汇密度都比B组对应的一篇高,但是A组合起来词汇密度却比B组合起来低?
咋一听,这问题有点荒谬。怎么可能我每篇词汇密度都比你高,合起来还比你低呢?但仔细一想,这种可能性是存在的。我们来看一个例子。
假设我们让甲乙两位同学分别就三个题目写了三篇作文,现在我们来比较这两位同学的词汇密度。显然,我们有两种比较方法。第一种,就是甲乙两位同学的同题作文一一比较。另一种方法就是甲的三篇合起来和乙的三篇合起来整体比较。
下面我们来看一组我虚构的数据。请注意,数据内部的关系是准确的。
从上面两个表格中,我们可以看出,甲同学每一篇命题作文的词汇密度都高于乙同学。但是奇怪的事情发生了,甲同学三篇文章合起来的词汇密度却低于乙同学。
细心的朋友肯定已经发现了,乙同学有一篇文章特别长,就是这篇长文,导致了两种方法计算结果相反。有一些统计学基础的朋友可能会说,这是个异常值(outlier),应该排除掉。这个说法不对。
异常值是针对实际参与统计那个变量来说的。这里参与统计的变量是词汇 密度,不是文本长度。就词汇密度这个变量而言,0.4998这个值肯定不是异常值,因为至少还有两个比它更大的值。可见,问题不是出在这里。
那问题出在哪里呢?你是不是也想知道原因呢?如果你的答案是肯定的,那么恭喜你,你已经在享受思考的第一种乐趣——对现象产生疑问,并想知道答案。
这种疑问常见的三种出现方式是:
为什么会是这样呢?(why)
如果这样,会怎么样呢?(what if ...)
有没有可能……(Is it possible ...)
如果一个人脑子里经常有这样的疑问,那么他有更大的概率做出成绩或者成为对社会有用的人。哪怕没做出大的成绩,也至少能少上很多当。
第二种乐趣:联系
我猜有读者已经在思考上面那个现象的原因了,或许已经有人已经有了结论,并已开始不屑——多简单的问题啊,值得这样小题大做。
有后面这种想法的人,我不得不遗憾的告诉你,可能事情不像你想象的那么简单。更重要的是,如果您匆忙地下决定,很可能会错过思考的第三种乐趣,也是人类能够享受的最高的愉悦。
不过,在揭晓什么是思考的第三种乐趣之前,我们先来看一个统计案例。
美国一所高校有两个学院,分别是法学院和商学院。一年,有557人报考了这所高校,其中男生304人,女生253人。报考的男生中,有209人被录取,录取率68.8%。报考的女生中,有143人被录取,录取率56.6%。
下面的表格表示了两种性别的录取率。
(来源:MBA智库)
从上面的数据,我想您可能会觉得这所高校在招生上偏向男生,有性别歧视的嫌疑。现在你看到的结果,就好比第一种乐趣里甲作文的词汇密度低于乙作文的情况。从上面词汇密度的例子,我们可以推测,完全有可能女生在两个学院的录取率都比男生高,但合起来就比男生低了。
比如,如果两个学院的报名人数和录取人数按照下面两个表格分配。
看,还是这么多人,整体录取人数没有变,但分别考察两个学院的录取率时,却是女生高于男生。
这就好玩儿了。如果整体来看,人们就会说这个高校歧视女生。但如果分学院来看,人们就会说这个高校歧视男生。这个例子也告诉我们,不要轻易相信媒体里的统计数据。统计数据从不撒谎,但人们喜欢利用统计数据撒谎。
这个高校例子背后就是著名的辛普森悖论(Simpson's Paradox)。因为是英国统计学家E.H.辛普森1951年提出来的,所以用他的名字命名。
这和思考的第二种乐趣有什么关系呢?
答案是,这个案例本身和第二种乐趣没有关系,有关系的是从词汇密度想到这个例子。我之所以想到这个例子,是因为我以前读到过这个案例。现在细节当然记不清楚了,上面的内容也是我google之后再写的。但是,能够想起一个和正在思考的问题有联系的例子,这就是乐趣。
有一些记忆力很好的人,不但能想起相关的案例,而且记得细节。在其他人眼中,这样的人就会显得知识非常丰富,讲东西旁征博引,各种案例信手拈来。很遗憾,我的记忆力很一般,很多东西只记得看过,具体细节还是要现查。不过,即使这样,这种联系也能给人莫大的愉悦。
当然,享受这种愉悦需要一些前提,那就是平时得多看书,多积累。哪怕记不得细节,至少知道去查什么。
最高乐趣
能够对具体的问题提出假设,是一种乐趣。能够从一个具体问题联想到另一个具体问题,也是一种乐趣。但这两种乐趣,比起第三种来,都不算什么。在我看来,这第三种乐趣,是人能够追求的最大的愉悦。
这种乐趣就是通过思考,找出现象的本质,把它抽象化、一般化,从而能够解释一类现象。很多人认为这是科学家的事儿,但我认为这是每个人都应该主动积极去追求的事情。
当然,很多问题,前人早已思考过。现在获取信息很方便,我们只需把前人的研究读一读,就能获得更抽象、更一般化的认识。这样,我们的认知水平就上升了。
我个人的经验是,当你有意愿并且有能力去享受这第三种乐趣时,你的人生会变得超脱。让很多人烦恼的事情,在你看来,将会不值一提。更重要的是,如果你是有这种意愿和能力的人,产生那些烦恼的根源自然会远离你。
上面两个例子的本质是什么呢?
上面两个例子都有一个共同的特点,那就是用比例代替了原始的数据。无论是词汇密度,还是录取率,都是比例,而原来的数据分别是(实词数,总词数),(录取人数,报考人数)。
还记得中学解析几何或者线性代数内容的朋友,看到我用括号把两组数据括起来,想必已经有点眉目了。没错,如果我们把上面两个例子用数学模型来抽象,原始数据就是笛卡尔坐标系上的点,而无论是词汇密度还是录取率,都只反映那个点所代表的向量的方向。
换句话说,当我们只考虑比例时,其实是只考虑了向量的方向,而忽略了向量的模,也就是它的长度。向量(5, 2)和向量(10, 4)的方向一样,但前者的模是29的平方根,而后者是116的平方根。用图来直观表示,就是下图里b点到原点的距离大于a点到原点的距离。
生成上图的R代码如下:
plot(NA, xlim=c(0,12), ylim=c(0,12), xlab="X", ylab="Y", lwd=3)
vecs <- data.frame(vname=c("a","b"),
x0=c(0,0),y0=c(0,0), x1=c(5, 10) ,y1=c(2, 4),
col=1:2)
vecs[1:6]
with(vecs, mapply("arrows", x0, y0, x1, y1,col=col,lwd=3) )
with(vecs, mapply('text', x=x1[1:3]-.1, y=y1[1:3]+.5,
labels=c(paste("a(", x1[1], ", ", y1[1], ")"), paste("b(", x1[2], ", ", y1[2], ")"))
))
因此,无论是我举的“词汇密度悖论”,还是著名的辛普森悖论,其本质都是这样的:
笛卡尔坐标系里,两组数量相同的向量[V1, V2, ... Vn]和[W1, W2, ..., Wn],它们满足这样的条件,Vx(x <= n)与横坐标的夹角总是大于Wx与横坐标的夹角,但V1+V2+...+Vn之和与横坐标的夹角却小于W1+W2+...+Wn之和与横坐标的夹角。
(注意,因为实际问题中的比例总是小于或者等于1的,比如词汇密度和录取率都不可能大于1,所以我们只考虑夹角小于或等于直角的情况。)
如果上面的表述还是有点抽象,那我们来看一幅图,毕竟一图胜万言。
生成上图的R代码如下:
plot(NA, xlim=c(0,18), ylim=c(0,18), xlab="X", ylab="Y", lwd=3)
a <- c(2, 5)
b <- c(9, 4)
c <- c(10, 15)
d <- c(4, 1)
vecs <- data.frame(vname=c("a","b", "c", "d", "a+b", "c+d"),
x0=c(0,0,0,0,0,0),y0=c(0,0,0,0,0,0), x1=c(a[1],b[1],c[1],d[1],a[1]+b[1],c[1]+d[1]),y1=c(a[2],b[2],c[2],d[2],a[2]+b[2],c[2]+d[2]),
col=c(1,1,2,2,3,4))
vecs[1:6]
with(vecs, mapply("arrows", x0, y0, x1, y1,col=col,lwd=3) )
with(vecs, mapply('text', x=x1[1:7]-.1, y=y1[1:7]+1,
labels=vname
))
上图表示了两组向量{a, b}(两条黑色箭头)和{c, d}(两条红色箭头)以及它们的和a+b(绿色箭头)和c+d(蓝色箭头)。从图中可以看出,a比c陡峭(这种表示不严谨,但能说明问题),b比d陡峭,但是a+b就不如c+d陡峭。
这就是辛普森悖论的向量表示。
从这幅图出发,我们也可以总结出现辛普森悖论的条件,那就是平均角度更小的那组向量中角度较大的向量至少有一个向量模特别大,或者反过来,平均角度更大的那组向量中角度较小的向量中至少有一个向量模特别大。这句话可能有点绕,但多读几次,你一定能够明白。
在词汇密度的例子里,就是平均词汇密度更小的作文里,有一篇特别长。在录取率的例子里,就是男生报考商学院的人数特别多,而女生报考法学院的特别多。
顺便说一下,写这篇推文时,我百度了一下辛普森悖论,发现百度百科对辛普森悖论条件的解释是不对的。这个词条,百度百科和MBA智库内容一模一样,不知道谁抄谁,因为它们都不注明出处。不过无所谓了,反正都是错的。
经过一番查询和思考,我明白了辛普森悖论背后的抽象模型,从此以后我能解决这一类问题了。这就是思考的第三种乐趣:抽象化、一般化从而能够解决一类问题。
结语
很高兴和您分享我在一杯咖啡后享受到的三种思考的乐趣。
我们再回顾一下是哪三种乐趣:
第一种:就现象提出问题。享受这种乐趣的前提是培养问“为什么?”,“如果这样,会怎样?”和“有没有可能……?”的习惯。
第二种:从一个案例想到类似的案例。享受这种乐趣的前提是养成阅读的习惯。
第三种:探究现象的本质,将认知抽象化、一般化,从而能够解决一类问题。享受这种乐趣的前提是培养自己的信息检索和逻辑思维能力。
衷心希望大家在工作、学习和生活中都能享受这三种思考的乐趣。
最后,我想问家长朋友们一个问题:如果一个数学老师教您的孩子鸡兔同笼问题时,告诉孩子一个技巧,这个技巧涉及到假设兔子把其中两只脚收起来。(网上有人这么教的!)请问,您觉得应该让孩子跟着这样的数学老师学习吗?为什么?