AlphaGo的惊人战绩,互联网行业的快速发展掀起了大数据、深度学习等领域的热潮,这些领域有一项技能必不可少——编程,网易CEO丁磊更是建议将少儿编程列入学业水平考试。而 编程过程中免不了会碰到令人头痛的bug,报错信息看不懂,这些问题该问谁?
在2008年,专注于编程领域的问答网站Stack Overflow在国外建立,马上在程序员群体中流行开来。经过十余年的积累,Stack Overflow已有注册用户1270万,有近2000万个提问和近3000万个回答。这其中有各国前辈踩过的各个编程语言的坑,仅仅只是在搜索框内复制自己的报错信息,就能够搜索到相关提问和回答。 Stack Overflow以其体量和质量,成了大家编程问答网站的首选。
虽然网站上能够解决大部分基本编程问题,但若是碰到搜索不到的问题,那就免不了需要自己动手提问。据官方统计, 平均14.2秒就会有一个问题提出,这么高的提问频率下,自己提出的问题真的能被回答吗?在去年2019年共有近191万个问题被提出,其中47万有余的提问无人回答,占约四分之一。 如何不让自己的问题在这个提问频率下石沉大海?基于此,本文将对网站上的提问及其回答情况进行分析,通过描述性分析和回归建模的方法探索 回答情况会受哪些因素影响。进一步,给出相关建议,对用户的提问进行指导,帮助提问者提高被回答的几率,不致无人问津。
本文爬取了3404条Stack Overflow的提问数据,每条数据代表一个在2019年提出的问题,包含回答数、浏览数、问题标签、标题、提问者声望值等信息。本文的研究内容是有哪些因素会影响一个问题的回答情况,因此将回答数视作因变量。
自变量归纳为问题的反馈属性、内容属性和提问者属性,反馈属性包括浏览数、是否被编辑、评论数、投票数、收藏数,即其他用户对于该问题表述、价值方面的反馈和评价。内容属性包括标签(问题所在领域)、具体的标题和主体内容。提问者属性包含提问用户的声望值、历史提问和回答数。具体的数据变量说明如下表1所示。
表 1 数据变量说明表
图1 回答数分布柱状图
如图1所示,将回答数离散化处理,分为“0”、“1”、“>1”三类,即未得到回答、得到1个回答、得到多个回答。其中得到1个回答的问题数量最多,占比51.82%。其次是没有得到回答的占比24.47%,近四分之一,也有少量问题能得到多个回答。所以,在Stack Overflow上提问的确大多能得到回答,但离百分之百还差不少。
如图2所示,从浏览数的平均水平(中位数)来看,回答数越多的问题其浏览数越多,但其实两者是一种相辅相成的关系。一方面,回答数越多代表一个问题已经被解决,并且可能含有更多的有用信息,用户会首先浏览已经有回答的问题;另一方面,一个问题有越多的用户浏览,就越有可能出现有能力且有意愿解答的用户。想要问题被回答,也许需要更多地让人看到。
图2 不同回答数问题的浏览情况
是否被编辑反映了其他用户对于提问者问题表述上的反馈,投票数代表了其他用户对于问题价值的反馈。这两个变量对回答数的影响如图3所示。
图3 是否被编辑、投票数对回答数的影响
相比未被编辑过的问题,被编辑过的回答情况更好。编辑是Stack Overflow的一个特殊的用户自治机制,网站允许达到一定声望值的老用户对问题进行编辑。当他们觉得一个问题的表述可以更准确时,会编辑这个问题。毕竟首先要读懂、理解问题,才能对问题进行思考进一步回答。也许正是因为被编辑过的问题表述清晰、少有歧义,能够理解题意的用户更多,回答情况也就更好了。
由于用户可能是因为看到问题得到了回答才投票的,为了减小反向因果的影响,不计入得到回答后发生的投票。投票数为正的提问占比为21.62%,在得到回答前就有正向投票的问题只占少数。而这些问题的回答情况都比较好,几乎都得到了回答,得到多个回答的占比也相对更高。Stack Overflow有将问题按照投票数排序的功能,有能力的用户可能会优先回答投票数高的问题,也就进一步提高了回答量。
内容属性包括标签、具体的标题和主体内容,它们都是字符型变量而且包含了大量信息,但不易直接分析,因此提取了一些特征来初步分析。
标签描述的是问题所在领域,它概括了一个问题的范围,用户可以选取1至5个标签,并且显示在问题列表的界面上,是用户首先会看到的信息。
图4 (a)热门标签频数图(b)标签热度对回答数的影响(c)标签数对回答数的影响
所获样本一共包含了 3000 多个标签,水平过多,因此选择将标签数值化,转化为它的热度来代替分析。如图4(a)所示,罗列了部分标签出现的频数,用这个频数来代表标签热度。其中Python最常出现502次,有12.94%的问题都打了Python标签,热度最高。Java、Java、C#也常常出现,频数大于200次。
在此基础上将热度离散化绘制了图4(b)。统计一个问题的多个标签中,热度最低标签的具体热度值。热度最低标签可以看作是该问题所在的相对最具体的小领域,小领域选得越热门,回答情况越好。这也比较符合情理,一个标签之所以热门,正是因为该领域有更多的人学习、研究,因此也会有更多用户提问、回答;一些冷门的领域可能更缺乏专业人员,能够响应的也就更少了。
而对于标签数,如图4(c)所示,打2个和3个标签的问题数目最多,并且回答情况最好,标签过多、过少都不利于问题被回答。
除了标签,标题也是用户首先会看到的信息,它概括了问题的主要内容,用户基本从标题上就可以确定自己能不能回答、愿不愿意回答一个问题了。对标题建立LDA主题模型,归纳出5个主题并命名,它们的关键词以及对回答情况的影响如下图5所示。
图5 (a)各主题关键词词云图 (b)不同主题下的回答情况
Topic0的关键词如字符串(string)、数组(array)、列表(list)等,都和编程中基础的数据类型和处理相关,因此命名为 基本数据处理。这是各个编程领域都会涉及到的一类问题,它的占比最大,且得到回答的占比最高。类似的,Topic2的关键词和编程中的文件读入和处理相关,因此命名为 基本文件处理。其占比仅次于基本数据处理,回答情况也相近。
Topic1的关键词如react(Java库React)、服务器(server)、安卓(android)、应用程序(app)等,这些和前后端以及应用程序开发有关,因此命名为网页和应用程序。数目占比不大,且未被回答的占比大。这一主题的关键词中出现了起效(work),这个词常常和“不起效”关联(nothing works, not work等等)。所以可能这一主题的问题相对比较复杂,也正因如此回答情况不如其他主题的。
Topic3的关键词如为错误(error)、时长(time)等,命名为 程序报错。它的占比最小,且未被回答的占比最大。Topic4的关键词为数据(datum)、接口(api)、函数(function)、error(错误)等,这似乎是前几类主题的综合。并且关键词中和标题具体内容中还包含许多有关云计算(cloud)、分布式计算等大数据应用相关的词语,因此命名为 大数据及其他。这一主题的占比和回答情况在 5个主题中处于中等水平。
主体内容是最为庞大的一块,但其实可以理解为对于标题的扩充。将主体内容提取篇幅信息:单词数、段落数以及编程问答特色的代码块个数,其中单词数和代码块个数对回答数的影响如图6所示。
图 6 问题主体内容单词数、代码块个数对回答数的影响
可以发现问题主体篇幅在“30-50词”的回答情况最好,“30词及以下”的其次。基本上篇幅越短,得到回答的问题占比越大,回答情况越好,对于代码块个数,没有代码的问题回答情况远远劣于有代码块的问题,包含1块或2块代码的问题回答情况最好。编程网站的特色需要充分利用,提供代码更利于其他用户发现提问者的问题,同时篇幅短的问题用户也不会望而却步。
图 7(a)不同回答数下提问者声望值情况 (b)历史答问比对回答数的影响
如图7所示,声望值反映了用户对于网站的贡献以及使用活跃度。得到回答的提问者声望值中位数稍高,在回答数“1”和“>1”之间差异不大。 另外针对提问者历史提问数、历史回答数构建历史答问比这一特征:历史回答数/历史提问数,可以发现该值越大,得到回答的占比越高。
为了定量地刻画各因素对于回答情况的影响程度,本文建立了回归模型,并使用该模型对提问进行回答情况预测,后续建模均对连续变量标准化进行。
经过尝试,直接按照前文的离散化方式,即将回答数分为“0”、“1”、“>1”三类作定序回归,无法将少数类的“0”、“>1”的样本较好分类。因此考虑分两阶段回归,第一阶段作逻辑回归,对一个提问是否得到回答建立模型。第二阶段,对得到回答的样本再一次逻辑回归,判定是否能得到多个回答。
第一阶段:是否被回答的逻辑回归
首先,将因变量按照0和非0,转换成0-1变量“是否被回答”。对于“是否被回答”建立逻辑回归模型,把AIC准则选择出的模型作为最终模型,得到模型结果如下表2所示。
表2 是否被回答的逻辑回归模型结果
模型整体显著,保留了反馈属性的所有自变量,内容属性中的标签热度最大和最小值、标题主题、主题内容段落数,以及提问者属性中的历史答问比。在其他变量保持不变时:
- 浏览数越多,问题更可能得到回答;被越多正向投票或收藏的问题,即如果问题价值被网站的用户认可,得到回答的可能性会增加。被编辑过的问题更可能得到回答,而评论越多的问题,被回答的可能性越小。
- 回答的可能性更受小领域的热度影响,标签热度最小值越大,即标签所在的最小领域越热门,该问题越可能被回答。
- 相较于“基本数据处理”,“程序报错”主题的提问被回答的可能性更低。
- 第二阶段:是否得到多个回答的逻辑回归
在已经得到是否被回答的结果后,对于被回答的问题,进行第二阶段的建模分析。按照回答数取值为1和大于1,转换成0-1变量“是否得到多个回答”,同样建立逻辑回归模型。把AIC准则选择出的模型作为最终模型,得到模型结果如下表3所示。
表3 是否得到多个回答的逻辑回归模型结果
模型整体显著,与上一阶段建模选出的变量稍有区别,有更多内容属性相关的变量被保留,如标题的单词数、句式以及主体内容的段落数等。可能想要得到更多回答,内容上需要更多斟酌。在其他变量保持不变时:
- 浏览数、投票数、是否被编辑仍然对于“是否得到多个回答”有显著影响,浏览数越多,投票数越多、被编辑过的问题更可能得到更多数量的回答。
- 标题单词数越多,得到更多回答的可能性越低,而疑问句式的标题比陈述句能得到更多回答。若主题为网页和应用程序或大数据及其他相关,相比基准组主题基本数据处理,得到更多回答的可能性越小。
- 主体内容段落越多,得到更多回答的可能性越小。
两阶段的建模分析,可以让提问者了解一个问题“是否被回答”、“是否得到多个回答”的主要影响因素是什么。对照模型,可以检查自己的提问有哪些地方可以完善、提升,增加被回答的几率。
的“full-text-research”。预测它得到回答的概率为0.7073,小于阈值0.7533,无法得到回答;得到多个回答的概率为0.2108,小于阈值0.3139,无法得到多个回答。如果仅仅把大领域标签选为热度值为98的“sql”而非“sql-server”,小领域的标签选为热度值为78的“sql-server”,得到回答的概率就提高到了0.7940,大于阈值,很可能会被回答。进一步,如果再把标题的句式改为疑问句,得到多个回答的概率提高到了0.3402,大于阈值,甚至会得到多个回答。
经过描述性分析和建模分析,可以得到影响Stack Overflow上提问回答情况的主要因素有:
(1)所有反馈属性,其中评论数是负向的影响。
(2)内容属性:问题所打的标签越热门,越有可能被回答,且所在小领域的标签热度影响更大。不同主题的回答情况不同,“程序报错”不易得到回答,“网页和应用程序”、“大数据及其他”不易得到多个回答。简洁且带有疑问句式的标题、主体内容篇幅越短的提问更易得到多个回答。
(3)提问者属性对于问题回答情况的影响并不显著,用户可以不用过于担心自己使用网站的时间长短和活跃程度,Stack Overflow对新用户并无歧视,只需关注问题本身。
那么对于提问者,如果想要得到回答,可以针对这些方面进行改进:
(1)表述的清晰与简洁程度,少写文字,而把问题用代码来呈现;标题可以用疑问句式,引人注意。
(2)选择合适的2-3个标签,在切题的情况下,领域可以不用太具体、避免冷门标签。如果自己的提问的确有关一些冷门领域,以及复杂的程序报错,可能要做好得不到回答的准备,尝试更多途径解决问题。
(3)提高问题价值,提问要经过深思熟虑,带有自己的思考,这样提问很有可能会被收藏、点赞、浏览,也更可能被回答。
案例作者:何佳凝,中国人民大学,狗熊会人才计划第5期学员
“人才计划”是狗熊会推出的纯公益项目。本项目旨在培养出色的数据分析人才,尤其是商业分析(Business Analysis)人才。项目通过一系列高强度的TASK,从选题、背景介绍、数据准备、数据说明与描述、统计建模等方面进行训练。强调规范守时抗压,强调自学能力、沟通表达能力与数据分析能力。