如果你是被这个标题骗进来的,那么说明标题党的存在的确是有原因的。在网络高度发达(以及“大数据”泛滥)的今天,数据动不动就是以 GB 和 TB 的级别存储,然而相比之下,人类接受信息的速度却慢得可怕(参见大刘《乡村教师》)。试想一下,你一分钟能阅读多少文字?一千?五千?总之是在 KB 的量级。所以可以说,人们对文字的”下载速度“基本上就是 1~10KB/min。如果拿这个速度去上网的话你还能忍?
既然如此,每天网上有成千上万的新闻、报告、文章和八卦,怎么看得过来呢?没办法,只能先对正文进行一次粗略的筛选——看标题。俗话说得好,这是一个看脸的世界。于是乎,文章的作者为了吸引读者,就要取个足够博眼球的标题,而所谓标题党便是充分利用这种心理,用各种颇具创意的标题来吸引读者的注意。
好了,既然看官已经看到了这里,我就可以承认本文其实也是标题党了。这篇小文并不是要讨论标题党的前世今生,而是研究一个与此有关的统计问题:怎样的标题会更加吸引读者的关注?
这个问题有点太大了,所以我们缩小一下范围。既然是统计问题,就拿自家的一个例子下手吧:做统计学研究的,都得读各种各样的统计论文,那么论文的标题是否会对这篇文章的阅读量产生影响呢?巧的是, 美国统计协会期刊(JASA)的网站 上正好提供了该期刊旗下文章的下载访问量,所以我们可以以此做一个小分析,来研究一下标题与文章阅读量之间的关系。
可能有读者要问,为什么要使用文章的访问量,而不是引用率呢?这是因为 JASA 在其网站上说明,访问量数值是指从 JASA 官网下载的统计量,不包括从其他途径(比如购买的论文数据库)的来源。在 JASA 网站上,下载文章之前读者能获取到的主要是文章的标题和作者信息,所以访问量的主要驱动因素就是读者在阅读标题和作者之后产生的好奇感,从而减少了数据中的噪音。相反,引用一篇文章,通常是对文章有了充分理解之后产生的行为,这时候标题的作用可能就非常微弱了。总而言之,JASA 文章的下载量可以较好地代表读者在获取了文章的基本信息后对它感兴趣的程度。
那么怎么研究文章标题与下载量之间的关系呢?我们知道,标题是由一个个的单词组成的,如果忽略掉单词之间的语法关系,我们可以以标题”是否包含某个单词“作为自变量,来看哪些单词与因变量(文章下载量)之间的关系最为显著。除此之外,我们还需要加上一些其他的自变量,从而更好地解释因变量的变化。本文中我们要考察的变量还包括:
有了这些数据,我们就可以开始我们的分析了,大体过程如下:
下面就对以上过程进行一些更详细的描述。
最近十年 JASA 共出刊 41 期(Issue 473 ~ Issue 513),文章大概有 1700 多篇。我们先获取每一期的的网址,例如 http://www.tandfonline.com/toc/uasa20/101/473 ,然后从网页中提取出每篇文章的标题,作者,下载量,文章所属类别,以及每篇文章所在的期数和在该页中的次序。文章最后给出了抓取网页的代码和获取到的数据。
由于是英文期刊,我们基本上可以省掉分词的步骤。对文章标题进行简单的处理,如转换小写,删除停用词之后,就可以构造词频矩阵了。我们首先构造一个所有文章标题词项的字典,标记为 Term 1 到 Term p,然后词频矩阵的每一行代表一篇文章,每一列代表这个词项在各标题中的词频。
在本文的分析中,我们定义一个词项可以是1~3个连续单词的组合,比如如果文章标题是”Applied linear regression“,那么由此生成的词项就有 applied,linear,regression,applied_linear,linear_regression,applied_linear_regression 共六个。这么做的原因在于,一个单词的意义有时会依照其上下文而有所变化,例如同样是 estimation,point estimation 和 interval estimation 就代表了两种风格的文章,所以我们希望考虑到这些变化。
此外,我们希望选出来的词项具有一定的代表性,所以在构造词频矩阵的时候,我们要求每一个词项在文章集合中至少出现过两次。这样就避免了一些特殊的词语搭配因为出现在某一篇访问量极高的文章中而被挑选出来。
在 R 中,可以使用 text2vec
包 很方便地完成这一过程,代码如下:
library(text2vec) article_dat = read.csv("jasa.csv", stringsAsFactors = FALSE) tokens = article_dat$title %>% tolower() %>% word_tokenizer() sw = c("of", "for", "and", "in", "with", "a", "the", "to", "on", "an", "by", "its") it = itoken(tokens) title_voc = create_vocabulary(it, ngram = c(1, 3), stopwords = sw) %>% prune_vocabulary(term_count_min = 2) vectorizer = vocab_vectorizer(title_voc) it = itoken(tokens) title_mat = create_dtm(it, vectorizer)
最终该矩阵包括 1753 篇文章和 2552 个词项。
文章-作者矩阵与词频矩阵非常相似,第 i 行第 j 列的元素表示第 j 个人是否是第 i 篇文章的作者,取值为 1 或 0。同样,为了避免单独一篇文章过大的影响,我们只包括最近十年至少在 JASA 上发过两篇文章的作者。最终该矩阵包括 1753 篇文章和 615 位作者。
加上类别、期数和页内次序的信息后,我们共有 1753 个观测和 3180 个自变量。由于变量数大于观测数,我们将采用 Lasso 来对自变量进行筛选。此外,因变量的分布严重右偏,所以我们预先对其进行对数变换后再进行建模。
在 Lasso 回归中,我们选取罚参数使得有30个非零变量被选出,然后将它们按照系数大小做成下面这张图。注意到图中没有包括截距项,而且其中一个变量,文章所在的期数(IssueNO.),因为系数太大影响图片美观,所以对它的柱形进行了截断,其真实的数值标注在柱形上。
下面就这结果简单解释一下,大体上是我自己的理解,所以不一定靠谱,各位看官就当游戏好了。
用 Lasso 筛选出的变量可以分成下面这几类:
不论上述解释是否靠谱,通过本文的统计分析,我们还是发现了一些有趣的结果。当然,在有些方面本文做了不少简化,所以结果也还有提升的空间。下面我简单列举了一些,供感兴趣的读者进一步分析之用:
SnowballC
等软件包提供了相应的函数,但并不十分完美。 最后的最后,我们通过文章标题这个小窗口瞥见了统计学过去十年的一个缩影。下一个十年又会是怎样的光景呢?我们拭目以待。
附:文中数据和代码都放在 Github 上。