OSSRec
1.主要方法
将用户所有相关的tag组合成一个query,用户对某个tag的关心程度通过设定字段的boost来体现;Github的所有项目看做多个document,分成title和description两个域,基于Lucene实现用户和项目的匹配算法,取出Top n的项目为用户推荐。
2.实验结果
例如:为stackoverflow用户ID=20089推荐项目,实验中取了排名前50个匹配项目,项目Id及匹配分数 如下图所示
根据匹配分数拿到github项目具体信息:
stackoverflow的用户信息(可参考stackoverflow的top tags,反映了用户的关心领域)
结论:从上图可以看出,推荐的项目与用户的关心领域是密切相关的,top tags上是与前端相关的标签js,jquery等,匹配的项目也是与前端相关。由此可以认为该算法可以为用户从海量项目中筛选出用户所关心的项目。
优化:用户的关心领域的考量可以加入时间因子,某个帖子的发布时间越近,与帖子相关的tag应该获取更高的权重,存储tag的最近更新时间,取其与第一个stackoverflow帖子的时间差的函数值作为参考。
3.下一步工作
上述工作得到了用户的所关心的领域的匹配项目,需要进一步筛选,项目本身有优劣之分,用户也有技术能力高低,如何确定该项目是否值得向某用户推荐,需要用户和项目两个方面来分析。 首先,还是从项目出发,普遍认为流行的项目会更吸引用户关注,通过github项目属性,比如watch,fork,contributor,pull request等,皆能体现用户参与度。分析项目属性,对项目进行评价,记你一步筛选出比较流行的、优秀的项目推荐给用户。
推荐算法的具体实现:
1.用户相关tag在所有用户参与帖子中出现次数的统计(正相关):
tf(tag in post) = 某个tag累积出现次数 / 用户帖子总数;
2.用户相关tag在所有帖子中出现次数(负相关:出现次数越少说明越是针对当前用户):
idf(tag) = log(总帖子数/包含Tag的帖子数)
3.搜索到的项目可能包含多个用户相关的tag,一个项目中的包含的tag数越多,越重要(正相关):
coord(all tags,d)
4.stackoverflow用户和Github项目的匹配相关性计算:
引用Lucene打分机制,对查询tag(q)和github项目(d)计算相关性(按照单个tag查询),得到匹配分数。
term------->tag
document---------->github项目
field-------->title/description
最终可以得到一个计量分值S:
S = tf * idf * coord * score
按照此分值对相关项目排序,完成个性化推荐。
一、背景:
Stackoverflow社区是规模庞大的Q&A社区,Github也是代码托管和项目开发领域规模庞大的社区。虽然两者在计算机软件开发领域都有非常大的影响力,但两者目前为止还是相对比较独立的。
二、问题/意义:
我们知道,Stackoverflow社区中回答问题的用户很多都是有丰富项目经验的,如果可以为这些用户快速提供一些他们关心领域的项目,对这些人来说,让自己在这一领域有更深造诣和大显身手的机会;对于项目而言,也会因为有这些人的参加而更好地发展。
将两个社区联系起来,为Stackoverflow中的用户提供一些Github开源项目,简化用户搜索查找的操作成为了很有意义的一件事情。
三、具体方法:
a) 找到用户关心领域
i. 统计某段时间用户回答的帖子
ii. 统计帖子的tag信息,筛选出用户参与做多的tag作为其关心领域
b) 根据每个tag信息在Github中搜索关联repository(tag在整个数据集中出现频率越低越focus)
c) 设计推荐算法给出最终排序结果
i. 每个搜索到的帖子中和用户相关的tag种类数目(正相关)
ii. 每种用户相关tag在用户参与帖子中出现次数的统计(正相关)
iii. 每种用户相关tag在所有帖子中出现次数(负相关:出现次数越少说明越是针对当前用户)
ⅳ. Github项目匹配的相关性(正相关)
四、验证:
将Github用户和Stackoverflow用户关联起来,例如:Email/Website(向王涛师兄请教这方面你的问题)
a) 这些用户在我们推荐算法考虑的时间段后,我们推荐的项目和实际参与的Github项目的交集(x)
b) 我们的推荐算法对这些用户推荐的项目数(y)
c) 推荐算法考虑到的时间段后这些用户实际参与的Github项目数(z)
precision:x/y
recall: x/z
目前考虑还存在以下问题:
1. 如何提取问题翻译后的关键词
2. stackoverflow中存在大量对错误代码的提问,回答中只修改了错误的代码片段
3. 需要对trustie中类似ACM编程问题进行转化,提取出具体解决问题的方法
This week, our team held a conference, and we changed our orientation a little bit.
In the first week, our goal was to give a software recommendation of github open source software to students who join classes in Trustie. But soon we found that the requirement is not urgent. Firstly, the homework set in classes are always small projects or code segments, which don’t need a large open source software for support. Secondly, most times the students need code of low-level rather than API of high-level abstraction.
But for repositories in github, we found that there are some small projects related to the homework students do everyday. However, the star number and branch number are all very small, which is hard for us to judge which is better. So what we want to do is recommending codes to students in Trustie referring to stackoverflow and github.
This week, the work finished is listed as follows:
1. Got related data from trustie database
2. Downloaded data of stackoverflow
3. Confirmed the goal and division of work
Plan for the next week:
1. Finish the API of querying code from stackoverflow database using key words
2. Give a ranking of the query result using a simple algorithm
trustie中有用户参与的课程,没门课程有相应的作业。我们可以把相关stackoverflow中帖子里面的代码匹配上相应的作业,即将代码片段推荐给用户。
例如:有一门计算机程序设计课程java布置了一个作业——使用java语言将字符串反序。
通过在stackoverflow中查找相应的帖子,我们发现有很多带有java reverse string的帖子,帖子中的代码片段可以直接拿来使用。(见截图)
trustie中用户数据:个人信息(参与的课程、项目);课程信息(作业信息);项目信息(描述信息)
github中项目数据:项目介绍(列表页面的一句话介绍);readMe文件;pull-request描述;issue描述
思路:
1. 通过trustie中每个人参加的课程中作业的信息,匹配github中的项目,提供github项目的推荐,辅助完成作业
2. 通过trustie中每个人参与的项目信息,匹配github中的项目,用github中的开源项目辅助项目开发
3. 通过trustie中每个人参与的项目信息,匹配github中的项目,让开发人员参与到大型项目的开发中
问题:
github中描述信息都是英文,而trustie中的信息都是中文
github中readMe关键信息如何提取(因为格式不同)
github中issue和pull-request关键信息如何提取
PS:明天可以拿到trustie的数据