在代码世界中遨游是件妙不可言的故事,给开发者推荐新项目、新用户、新世界,有助于增强开源精神,提高开发者乐趣。本关源于国内知名开源社区的一个真实的业务需求,需要基于“绿色计算产业联盟”和国内某知名开源技术平台真实开发者及开发者活动数据进行兴趣标签的推荐。
本关任务:
利用已有的同现标签数据以及给出的20
位开发者技能标签数据,推荐兴趣标签给这20
位开发者。
其中,同现标签指的是:“共同出现的标签”。比如,某技术问答帖子的标签为
,这三个标签在该帖子的标签集合中共同出现,则称其为同现标签。
推荐标签指的是:“根据同现标签的数据和开发者自己的技能标签来推荐给该开发者的标签”,比如,某位开发者的技能标签为
,根据同现标签数据,可以推荐
给开发者。
为了完成本次挑战,你需要处理两种类型的数据,第一:同现标签数据,第二:开发者技能标签数据,根据提供的两种数据生成推荐标签数据,并且存放在文件中,关于这三种数据的说明如下:
同现标签数据
我们已经将同现标签存放在tag_cooccurrence.csv
文件中了,文件路径为:src/step1/tag_cooccurrence.csv
,该文件数据结构如下:
id | tags |
---|---|
1 |
|
2 |
|
字段id
为一个自增的整数,增量为1
,除了唯一标识这一行的数据外没有其他含义,tags
表示同现标签列表,其中包含多个同现标签。
开发者标签数据
我们已经将开发者标签数据存放在user_tag.csv
文件中了,文件路径为src/step1/user_tag.csv
,文件数据结构如下:
user_id | origin_tags | tag_value |
---|---|---|
1 |
|
[1.0, 0.851, 0.359, 0.336, 0.85] |
2 |
|
[1.0, 0.929, 0.743, 0.74, 0.722] |
user_id
表示开发者的id
,origin_tags
表示用户的技能标签集合,tag_value
表示用户技能标签对应的权重,权重你可以简单的理解为开发者对于这个技能的熟练度或者关注程度,一个技能标签的权重值越高(最大值为1.0),则表示该开发者对该技能越关注。在推荐时就应该优先推荐权重更高标签的相关标签。
该文件只有20
条数据,即你只需要对20
名开发者做标签推荐。
推荐标签数据
推荐标签数就是,你要根据同现标签和开发者标签数据生成的数据,也是本次挑战要提交的数据,你必须将计算得出的推荐标签数据存放在文件中,并且命名为:user_recommand.csv
,需要存放在src/step1/
下才可以评测,即完整路径为:src/step1/user_recommand.csv
。
其中存储格式举例如下:
id | recommand_tags |
---|---|
1 |
|
2 |
|
... |
... |
20 |
|
id
为一个自增的整形变量,增量为1
;recommad_tags
为推荐给用户的标签列表,其中每个标签以英文逗号分隔,注意每个标签用尖括号修饰,即java标签是
,而不是java
;,,,,
;请补充完善右侧代码区域中的func()
函数,构建标签推荐系统,实现根据开发者已有标签,完成对20
位开发者的标签推荐,每个开发者的标准测试推荐标签为10
个,你的推荐标签可以是任意个,参考步骤如下:
src/step1/tag_cooccurrence.csv
文件和src/step1/user_tag.csv
文件;src/step1/user_recommand.csv
推荐标签数据文件;你可以持续优化以获得更高的分数。
注意:我们提供了一些读写csv
格式文件的函数和本关涉及到的数据文件,详细介绍请下载源码查看:
https://www.educoder.net/attachments/download/203522/C++BaseLine.zip
评测说明
评测方法
本关得分为:
其中N=20
,表示共有20
个开发者测试记录;Auc_i
表示对每条记录标签推荐的准确率;Recall_i
表示对每条记录标签推荐的召回率。下面为具体的准确率和召回率的描述。
参赛选手根据开发者i
已有的标签列表{t1,t2,..,t5}
,推荐n
个标签形成集合Ri
R_i=\left \{ r_1,r_2,...,r_n \right \}Ri={r1,r2,...,rn}
Ti
为测试集中开发者i
的10
个标签组成的集合。
T_i=\left \{ t_6,t_7,...,t_{15} \right \}Ti={t6,t7,...,t15}
则开发者i
的标签推荐结果准确率Auc_i
为:
Auc_i=\frac{\left | R_i\cap T_i \right |}{\left | R_i \right |}Auci=∣Ri∣∣Ri∩Ti∣
召回率为:
Recall=\frac{\left | R_i\cap T_i \right |}{\left | T_i \right |}Recall=∣Ti∣∣Ri∩Ti∣
下面对某条开发者记录得分规则进行举例说明。
若参赛选手算出的某一开发者的推荐标签列表R
长度为11
,其中有3个标签与开发者对应T
中的标签一致。则该选手针对该开发者的推荐准确率为3/11
,召回率为3/10
,因此针对该条记录选手得分为:
\frac{2*3/10*3/11}{3/11+3/10}3/11+3/102∗3/10∗3/11
参考算法
本题在于针对每个开发者标签挖掘其相关的标签进行推荐,可以尝试利用关联规则算法挖掘标签之间的关联规则,将其推荐给目标开发者,在此基础上建议采用FPgrowth
挖掘频繁项集加快计算速度,得到关联规则后,针对每个标签关联的其他标签的置信度与该标签对应的权重值计算关联标签的权重值,得到最终的推荐列表。
开始挑战吧,祝你成功!
#include
using namespace std;
/*********************数据说明***********************
* 训练数据:src/step1/tag_cooccurrence.csv
* 测试数据:src/step1/user_tag.csv
* 结果文件:src/step1/user_recommand.csv
****************************************************/
void func()
{
/*********************** BEGIN **********************/
/*********************** END **********************/
}