基于深度学习的软件领域人才服务大数据平台实现探讨

平台需要具备的功能
1.基础的软件项⽬目代码质量量检测,类似sonarqube/xlint的较为全⾯面的代码质量量检测服务;
2.基于抽象语法树的代码分析服务,通过基于抽象语法树的代码分析⽅方法,能够提供⽐比传统根据提交数或者代码⾏行行数更更科学有效的度量量软件开发⼈人员⼯工作量量的⽅方法;
3.代码价值贡献度量量。通过图算法和⾃自然语⾔言处理理/机器器学习等技术,我们能从结构化和非结构化(⽬目前在设计阶段)两⽅⾯度量量开发⼈人员代码提交产⽣生的(软件意义上的)价值;
4.基于深度学习的简历解析服务。通过深度学习,更更快更更准确的提供职位和简历匹配。
5.在上述服务的基础上构建⼈人才技能能⼒力力指标体系,构建⼈人才画像,从⽽而能够更更精准有效地为企业提供⼈人才的挖掘/匹配等服务。

平台服务架构

平台架构具有⾼高度可扩展性,服务间普遍通过异步消息通信,命令服务接收代码分析请求,转化为命令消息下发消息队列列,各分析服务收到命令消息执⾏行行各种分析任务,然后将分析数据⼊入库。在基础分析数据和维度模型的基础上,提供了了多种形式的查询视图。![图片来自 沃客云大数据平台,第 1 页.png](https://ucc.alicdn.com/pic/developer-ecology/ae3dd387f1dc45ddbe1a8688bbd1a967.png)

基于抽象语法树的代码分析
⽬前⼯业界有多种分析⽅法可以作为⼯作量度量的基础⽅法:
1.基于⾏⽂本的差异分析
2.基于提交数的分析
3.基于语法元素token的分析
4.基于抽象语法树的分析
基于⾏⽂本和提交数的分析相对简单,能⽐较粗粒度地度量开发⼯作量,⼤部分版本控制软件默认的diff⼯具都是采⽤的基于⾏⽂本的差异分析⽅法。
代码分析服务采⽤的是基于抽象语法树的分析⽅法,该⽅法能追踪软件不同层次上(全局、类
型、函数、变量)的演化,⽐⾏⽂本分析能提供更多更精确的信息。
基于抽象语法树(ast)的分析,通过将不同语⾔的抽象语法树映射到⼀个抽象的树结构模型来屏蔽不
同编程语⾔的ast的差异,在树模型基础上通过多种树匹配算法和结构化信息差异分析算法,对⽐得到不同提交(或代码⽂件)之间语法元素的差异,能进⽽计算得到⼯作量的相对精确量化值。该服务通过挖掘软件代码库中代码信息来提供更丰富更准确的软件演化信息,以及开发⼈员在软件⽣命周期中开发⼯作量的跟踪度量。
基于深度学习的软件领域人才服务大数据平台实现探讨
树模型结构
ITree: type(节点类型,如:IfStmt;ForStmt), label(根据类型存放对应值), children(⼦节点集合),
parent(⽗节点)
树的编辑操作
前后两次提交源代码的变化会导致⽣成的树结构变化,对应为树结构A转化为B的⼀系列编辑操作,这样
源代码的变化检测就转换为了树编辑距离问题。对树的编辑操作有增加/删除/替换/移动(即增加和删除
的组合),两个版本的⽐较即为从A版本的ast转化为B版本的ast的编辑操作列表(编辑脚本)。
树匹配算法
找到树A到树B之间的⼀个合适的匹配
匹配算法的输出为两棵树中最合适的节点对匹配集合(Iterable[Pair[ITree, ITree]])。服务包含了多种匹配
算法,如最⻓公共⼦序列匹配,树编辑距离匹配等。
寻找产⽣最⼩确认编辑脚本的合适匹配集算法需要满⾜以下两个匹配标准:

x,y均为叶⼦节点:
matchLeafNode(x, y) = if (l(x) == l(y) && sim(v(x), v(y)) >= f) true else
false
其中sim(v(x), v(y)) 为x,y两节点的值相似度,f为字符串相似度阈值
x,y均为⾮叶⼦节点:
matchInternalNode(x, y) = if (l(x) == l(y) && common(x, y) /
max(leafNodesCount(x), leafNodesCount(y)) >= t) true else false
内部节点,使⽤计算⼦树中公共叶⼦节点的⽅式度量节点相似度, t为内部节点相似度阈值
根据计算出的匹配,找到最⼩的将树A转化为树B的确认编辑脚本(Chawathe)

编辑操作的计算算法⼤致为:
1.根据匹配算法得到的mapping列表⽣成从树A到树B的匹配列表Map1和从树B到树A的匹配列表
Map2;
2.⼴度优先遍历树B,对于树B中每个节点x和其⽗节点y,从Map2中寻找x和y在树A中最佳匹配的节
点,如果存在,分别⽤w和z表示;
3.如果x的匹配节点不存在,则x为新增节点,创建⼀个Insert操作;
4.如果w节点存在,但值不等于x节点的值,则创建⼀个Update操作;
5.如果w节点的⽗节点为v,v和y节点对在mapping列表中不存在,则可以判断x的⽗节点发⽣了变
化,创建⼀个Move操作
6.对树A进⾏后续遍历,通过Map1,如果节点在树B中找不到匹配节点,则创建Delete操作。
差异分类
将变更类型做出分类:
1.类级别修改(增删改类以及继承关系的更改等)
2.⽅法函数级别修改(增删改⽅法以及⽅法签名的更改等)
3.单条顺序语句修改(增删改语句)
4.条件和循环语句修改(条件表达式变更,增删else语句块等)
5.语句块结构修改(语句顺序变更等)
6.注释语句修改(注释语句块增删改)
7.可⻅性修改(可⻅性增强或降低)
对应⼯作量指标的计算来说,不同分类会对应不同的计算权重。
⼯作量计算
在差异分类的基础上,不同类型变更加权求和得到⼯作量指标。
代码价值贡献度量
结构化代码价值分析服务
采⽤PageRank的变种算法结构化分析软件静态调⽤图,计算函数/⽅法的重要性排名,得到结构化的代
码价值贡献指标
PageRank算法是google早期评价⽹⻚重要性的算法,其核⼼思想为:1.如果⼀个⽹⻚被很多其他⽹⻚链接到,说明这个⽹⻚⽐较重要,rank值会相对较⾼;2.如果⼀个rank值很⾼的⽹⻚链接到⼀个其他的⽹⻚,那么被链接到的⽹⻚的rank值会相应地因此⽽提⾼。
这种思想可以迁移到软件调⽤关系的分析上,从⽽得到在⼀个软件项⽬中,哪些函数或模块处于相对重要的位置,相应的开发⼈员价值贡献也会有⼀个⾼的权重。
我们在上⾯基于抽象语法树的代码分析构建的树模型基础上,通过对语法元素的识别,遍历得到函数⽅法的静态调⽤关系。相对于运⾏时得到的动态调⽤关系图,从代码分析得到的静态调⽤关系图会缺少信息,但是结合继承/接⼝实现等关系的分析⽣成的静态调⽤图还是有相当的可⽤性。
简历解析服务
云沃客平台为企业提供了招聘猎聘服务,同时有⼤量⼈才在平台上求职。简历解析服务尝试⽤机器学习/深度学习的技术,更精准快速地从⾮结构化⽂本中提取结构化的⼈才数据,为后⾯的分析查询检索服务提供基础数据。传统的简历解析,需要依赖⼤量的段落关键词,设计规则来对不同模块进⾏划分。如简历某⼀⾏出现了教育经历/学习经历, 则说明下⾯的内容属于教育模块。如出现了⼯作经历/实习经历则说明下⾯内容属于⼯作经历模块。如果该简历没有使⽤模块关键词,或者使⽤的词库没有模块关键词,则整个段落就都漏掉了。
如果对于某⼀⾏,上⽂是该⼈的基本信息,⽽下⾯连续出现了多⾏都是学校的信息,则知道这⾥是基本信息和教育经历的划分点了,平台简历解析服务通过双向⻓短记忆神经⽹络(BiLSTM)模型,解析时同时考虑正序和逆序,引⼊上下⽂的序列信息,可以更精确地划分模块信息。
分词
中⽂⽂本分析需要做分词处理,⼀种是传统的基于词表的规则分词(如jieba等库);还有就是统计分词,需要⽤到机器学习或深度学习技术。⽬前常⽤的深度学习模型是BiLSTM。基于LSTM模型最⼤的优
势是能处理较⻓的顺序依赖性,例如 在简历头部出现了姓名,在简历中段出现了另外⼀个类似姓名的公司名,就能判断这个是别的实体。
词向量
词向量是词语的数字形式表示,相近意思的词语会有相似的词向量。在简历分析的场景⾥⾯,词向量可以帮助识别训练数据集中没有的的公司,职位,技能等信息,以及作为序列标注当成BiLSTM的输⼊层。

上一篇:Skype For Business 快捷键


下一篇:ssl证书出现错误的解决方法