Skip to content

🎃 一款基于 GitHub 日志数据的开源项目舆情分析系统

Notifications You must be signed in to change notification settings

roy1108yor/OpenRepsSentiment

 
 

Repository files navigation

OpenRepsSentiment

1 介绍

OpenRepsSentiment 是一个针对 GitHub 开源项目数据,并基于 Gin + Gorm + Vue 技术栈开发的开源项目情感时空可视化系统

2 数据来源及处理

以2020年一年的 Github 全域日志数据为例,在 Clickhouse 数据库中共有 54,205,690 个仓库,其中私有仓库(设置成 private 的仓库)为 4,265,045 个,经过实验我们总共利用了 200,234 个非私有仓库的数据(因为有些非私人仓库可能没有 IssueEvent 和 PullRequestEvent 类型事件的发生),其中主要获取了各个仓库的三类数据:

  • 从关闭 Issue 中获取志愿者完成的 Issue 数量

    具体操作 :首先通过字段 org_id 过滤掉私人仓库的事件,私人仓库是没有 member 的,然后在过滤完的仓库中通过 type 字段提取仓库事件类型为 IssueEvent 的事件,通过 action 字段找到所有关闭的 issue,通过 issue_author_type 字段过滤掉机器人的评论。最后通过字段 issue_author_association找到志愿者的 issue,利用聚集函数得到关闭 issue 中志愿者的 issue 数量。

  • 从关闭 PR 中获取志愿者的 PR 数量

    具体操作与上面的步骤基本相同,唯一不同的一点是在这里需要提取仓库事件类型为 PullRequestEvent 的事件。

  • 获取各个项目中的志愿者人数

    具体操作 :由于仓库中并没有与志愿者直接相关的数据,所以我们的做法是先得到关闭 issue 中所有志愿者的名字、关闭 pr 中所有志愿者的名字,进而将两个表通过仓库 id 进行连接,并将得到的志愿者名字进行一个去重,最后的结果即为仓库的所有志愿者名字,并利用聚集函数得到所包含的志愿者数量。

3 模型设计

3.1 项目情感分析模型

RoBERTa 作为一种基于 BERT 模型进行改进的预训练语言表示模型,它能够提高对自然语言处理任务的性能。

3.2 CRITIC 权重赋值方法

CRITIC 赋权法是一种比熵权法和标准离差法更好的客观赋权法。

它是基于评价指标的对比强度指标之间的冲突性来综合衡量指标的客观权重。好处是在考虑指标变异性大小的同时兼顾指标之间的相关性,而并非单纯的把数字越大就越重要作为评价标准,从而更加完全地利用数据自身的客观属性来进行科学的评价。

其中对比强度是指同一个指标各个评价方案之间取值差距的大小,以标准差的形式来表现。标准差越大,说明波动越大,即各方案之间的取值差距越大,权重会越高;指标之间的冲突性是用相关系数进行表示,若两个指标之间具有较强的正相关,说明其冲突性越小,权重会越低。

对于 CRITIC 赋权法而言,在标准差一定时,指标间冲突性越小,权重也越小;冲突性越大,权重也越大;另外,当两个指标间的正相关程度越大时,(相关系数越接近 1),冲突性越小,这表明这两个指标在评价方案的优劣上反映的信息有较大的相似性。

具体计算步骤如下:

(1)首先根据数据的整体分布情况,选择出最小最大规范化、零均值规范化和小数定标规范化这三种最常用的数据归一化方法中最合适的一种方法,来对数据进行归一化。其中零均值规范化方法不适用于需要分析指标变异性的数据,因为这种方法会将数据的标准差规范到始终为 1,无法体现出指标的变异性,而小数定标规范化则是通过移动属性值的小数数位,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值绝对值的最大值。同时归一化过程中还需注意正向指标和负向指标的处理方法是不尽相同的。

(2)计算指标变异性。在 CRITIC 赋权法中使用标准差来表示各指标的内取值的差异波动情况,标准差越大表示该指标的数值差异越大,越能放映出更多的信息,该指标本身的评价强度也就越强,应该给该指标分配更多的权重,计算公式如下:

byx

其中 $S_j$ 表示第 $j$ 个指标的标准差。

(3)计算指标冲突性。 CRITIC 赋权法中使用相关系数来表示指标间的相关性,与其他指标的相关性越强,则该指标就与其他指标的冲突性越小,反映出相同的信息越多,所能体现的评价内容就越有重复之处,一定程度上也就削弱了该指标的评价强度,应该减少对该指标分配的权重,计算公式如下:

ctx

其中 $r_{ij}$ 表示评价指标 $i$$j$ 之间的相关系数。

(4)计算信息量。CRITIC 赋权法中 $C_j$ 越大,第 $j$ 个评价指标在整个评价指标体系中的作用越大,就应该给其分配更多的权重,计算公式如下:

xxl

(5)计算 CRITIC 权重。第 $j$ 个指标的客观权重 $W_j$ 计算公式如下:

qz

3.3 项目社区化程度评估模型

利用非私人仓库中所有已关闭的 IssueEventPullRequestEvent 事件的 issue_author_association 字段和 pull_requested_reviewer_type 字段,找出项目志愿者数量以及该项目中由志愿者提交的 issuepr 数量。同时,从以下几个方面对数据进行优化处理:

  • 广度的角度来考虑,获得全域的志愿者 Issue 处理量,并舍弃前 5% 和后 5% 的数据(只是在计算全域人均这一步中舍弃了),避免数据过小,以及存在机器人造成的数据量过大的问题。利用中间的 90% 的数据得到全域人均志愿者 Issue 处理量。

  • 我们认为衡量一个项目社区化的深度最重要的两个值,就是志愿者完成的 Issue 量和志愿者 PR 的合入量,再除以全域人均志愿者的完成量,以得到该项目的完成 Issue 和合入 PR 的志愿者人数

  • 我们认为完成 Issue 和合入 PR 的志愿者人数可能不是一样重要,而且他们各自的重要性可能会随着时间变化,于是,我们使用 CRITIC 权重赋值法动态的给这两项赋值,最终计算公式如下:

  • 其中:权重1 + 权重2 = 100%,这里赋权重使用的方法是CRITIC权重赋值法,并且该权重值的分配会根据项目中数据的持续变化而动态调整,以保证指标计算结果的客观准确性。

最终设计出“开源项目社区化程度”计算公式如下:

1

4 功能模块

  • 项目搜索模块

通过搜索项目关键字(或者直接选择固定仓库)获取项目的情感分析演化结果

搜索

  • 情感指标筛选模块

用户可以选择自己感兴趣的情感指标,地图部分可以加载该指标对应的数据

sx

  • 时间轴模块

通过操作时间轴与情感热力图进行联动

sjz

  • 项目社区化程度模块

用户搜索某个项目就可以得到该项目的社区化程度的按月累计和月增量趋势图

ylj

yzl

5 整体系统展示

zt

About

🎃 一款基于 GitHub 日志数据的开源项目舆情分析系统

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%