全國高校綠色計算大賽 模擬賽 第三階段 第一關 標籤推薦

挑戰任務

在代碼世界中遨遊是件妙不可言的故事,給開發者推薦新項目、新用戶、新世界,有助於增強開源精神,提高開發者樂趣。本關源於國內知名開源社區的一個真實的業務需求,需要基於“綠色計算產業聯盟”和國內某知名開源技術平臺真實開發者及開發者活動數據進行興趣標籤的推薦。

本關任務:

利用已有的同現標籤數據以及給出的20位開發者技能標籤數據,推薦興趣標籤給這20位開發者。

其中,同現標籤指的是:“共同出現的標籤”。比如,某技術問答帖子的標籤爲<java>,<spring>,<mybatis>,這三個標籤在該帖子的標籤集合中共同出現,則稱其爲同現標籤

推薦標籤指的是:“根據同現標籤的數據和開發者自己的技能標籤來推薦給該開發者的標籤”,比如,某位開發者的技能標籤爲<java>,<spring>,根據同現標籤數據,可以推薦<mybatis>給開發者。

數據說明

爲了完成本次挑戰,你需要處理兩種類型的數據,第一:同現標籤數據,第二:開發者技能標籤數據,根據提供的兩種數據生成推薦標籤數據,並且存放在文件中,關於這三種數據的說明如下:

同現標籤數據

我們已經將同現標籤存放在tag_cooccurrence.csv文件中了,文件路徑爲:src/step1/tag_cooccurrence.csv,該文件數據結構如下:

id tags
1 <objective-c>,<app>,<iphone>,<ios>
2 <java>,<jfinal>,<數據庫>

字段id爲一個自增的整數,增量爲1,除了唯一標識這一行的數據外沒有其他含義,tags表示同現標籤列表,其中包含多個同現標籤。

開發者標籤數據

我們已經將開發者標籤數據存放在user_tag.csv文件中了,文件路徑爲src/step1/user_tag.csv,文件數據結構如下:

user_id origin_tags tag_value
1 <java>,<spring>,<websocket>,<mybatis>,<redis> [1.0, 0.851, 0.359, 0.336, 0.85]
2 <c#>,<csharp>,<shell>,<html>,<css> [1.0, 0.929, 0.743, 0.74, 0.722]

user_id表示開發者的idorigin_tags表示用戶的技能標籤集合,tag_value表示用戶技能標籤對應的權重,權重你可以簡單的理解爲開發者對於這個技能的熟練度或者關注程度,一個技能標籤的權重值越高(最大值爲1.0),則表示該開發者對該技能越關注。在推薦時就應該優先推薦權重更高標籤的相關標籤。

該文件只有20條數據,即你只需要對20名開發者做標籤推薦。

推薦標籤數據

推薦標籤數就是,你要根據同現標籤和開發者標籤數據生成的數據,也是本次挑戰要提交的數據,你必須將計算得出的推薦標籤數據存放在文件中,並且命名爲:user_recommand.csv,需要存放在src/step1/下纔可以評測,即完整路徑爲:src/step1/user_recommand.csv

其中存儲格式舉例如下:

id recommand_tags
1 <mvn>,<springmvc>,<numpy>,<pandas>,<Django>
2 <monogodb>,<mysql>,<gradle>
... ...
20 <tensorflow>
  • 字段id爲一個自增的整形變量,增量爲1
  • 字段recommad_tags爲推薦給用戶的標籤列表,其中每個標籤以英文逗號分隔,注意每個標籤用尖括號修飾,即java標籤是<java>,而不是java
  • 每一行數據代表給對應用戶推薦的標籤,如:上述表格中給用戶id1的用戶推薦的標籤爲:<mvn>,<springmvc>,<numpy>,<pandas>,<Django>
  • 給用戶推薦的標籤可以是任意數量。

編程要求

請補充完善右側代碼區域中的getRecommand()函數,構建標籤推薦系統,實現根據開發者已有標籤,完成對20位開發者的標籤推薦,每個開發者的標準測試推薦標籤爲10個,你的推薦標籤可以是任意個,參考步驟如下:

  • 讀取src/step1/tag_cooccurrence.csv文件和src/step1/user_tag.csv文件;
  • 根據開發者標籤和權重值來處理數據;
  • 生成src/step1/user_recommand.csv推薦標籤數據文件;
  • 提交評測。

提示:

你可以通過如下鏈接下載本關涉及到的數據文件:
https://www.educoder.net/attachments/download/203519/csvFiles.zip

推薦用記事本或者編輯器打開csv文件,用excel打開可能會顯示亂碼。

你可以持續優化以獲得更高的分數。

評測說明

評測方法

本關得分爲:

 



其中N=20,表示共有20個開發者測試記錄;Auc_i表示對每條記錄標籤推薦的準確率;Recall_i表示對每條記錄標籤推薦的召回率。下面爲具體的準確率和召回率的描述。

 

參賽選手根據開發者i已有的標籤列表{t1,t2,..,t5},推薦n個標籤形成集合Ri

R_i=\left \{ r_1,r_2,...,r_n \right \}R​i​​={r​1​​,r​2​​,...,r​n​​}

Ti爲測試集中開發者i10個標籤組成的集合。

T_i=\left \{ t_6,t_7,...,t_{15} \right \}T​i​​={t​6​​,t​7​​,...,t​15​​}

則開發者i的標籤推薦結果準確率Auc_i爲:

Auc_i=\frac{\left | R_i\cap T_i \right |}{\left | R_i \right |}Auc​i​​=​∣R​i​​∣​​∣R​i​​∩T​i​​∣​​

召回率爲:

Recall=\frac{\left | R_i\cap T_i \right |}{\left | T_i \right |}Recall=​∣T​i​​∣​​∣R​i​​∩T​i​​∣​​

下面對某條開發者記錄得分規則進行舉例說明。
若參賽選手算出的某一開發者的推薦標籤列表R長度爲11,其中有3個標籤與開發者對應T中的標籤一致。則該選手針對該開發者的推薦準確率爲3/11,召回率爲3/10,因此針對該條記錄選手得分爲:

\frac{2*3/10*3/11}{3/11+3/10}​3/11+3/10​​2∗3/10∗3/11​​

參考算法

本題在於針對每個開發者標籤挖掘其相關的標籤進行推薦,可以嘗試利用關聯規則算法挖掘標籤之間的關聯規則,將其推薦給目標開發者,在此基礎上建議採用FPgrowth挖掘頻繁項集加快計算速度,得到關聯規則後,針對每個標籤關聯的其他標籤的置信度與該標籤對應的權重值計算關聯標籤的權重值,得到最終的推薦列表。


開始挑戰吧,祝你成功!

 

學了很久的人工智能 非常想建個字典算關聯規則 but感覺好麻煩就暴力了一下 居然有84

# coding=utf-8
##################第三方庫及數據說明#################
# 本關可使用pandas、numpy
# 同現標籤數據:src/step1/tag_cooccurrence.csv
# 開發者標籤數據:src/step1/user_tag.csv
# 推薦結果文件:src/step1/user_recommand.csv
#####################################################
import pandas as pd
def func():
	df_train=pd.read_csv('src/step1/tag_cooccurrence.csv')
	df_test=pd.read_csv('src/step1/user_tag.csv')
    kk={}
    #print(df_train['id'])
    #print(df_train['tags'])
    i=0
    for ii in df_train['id']:
        kk[i]=df_train['tags'][i].replace("'","")
        #print(kk[i])
        kk[i]=kk[i].split(',')
        i+=1
    #print(kk)
    i=0
    pp=[]
    for ii in df_test['user_id']:
        a=df_test['origin_tags'][i].replace("'","").split(',')
        b=df_test['tag_value'][i].strip('[').strip(']').split(',')
        b=[float(x) for x in b]
        pro={}
        for c,d in zip(a,b):
            pro[c]=d
        pro=sorted(pro.items(),key = lambda x:x[1],reverse = True)
        pp.append(pro)
        i+=1
    ans=[]
    for x in pp:
        zz=[]
        for xx in x:
            tag,pro=xx
            #print(tag+' '+str(pro))
            for i in range(0,len(kk)):
                if(tag in kk[i]):
                    zz.extend(kk[i])
                zz = list(set(zz))
                if(len(zz)>10):
                    break
        zz=str(zz[:10]).strip('[').strip(']').replace("'","")
        ans.append(zz)
    id=range(1,21)
    data={}
    data['id']=id
    data['recommand_tags']=ans
    data_df = pd.DataFrame(data)
    #print(data_df)
    data_df.to_csv('src/step1/user_recommand.csv')
    ######################## BEGIN ######################




    ######################## END ########################

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章