Science of Science 数据黑客松小总结
原本以为没有时间搞了,官方说测试集出现问题了,延长到11号早上。所以10号晚上考完视觉计算,瞎搞了一下,发现和前排的大佬差距甚大。简单记录一下自己的方法,日后方便回忆。
发现熬夜修仙真的不适合我,凌晨两点睡,第二天整个人废了,还是提高一下白天和晚上的效率吧
赛题要求
本次比赛任务是匹配科研论文和科研新闻。发布的数据包括论文和新闻的信息。训练集将提供正确的匹配,测试集要求选手为每一篇新闻匹配三篇最可能相关的论文。
训练集:(2019年6月8日发布)
press_train.csv:科研新闻数据集,字段如下:
- press_id:每篇科研新闻都有一个唯一的ID
- press_headline:新闻标题
- press_org:发布新闻的机构
- press_text:新闻正文
- paper_train.csv:论文数据集,字段如下:
- paper_id:每一篇新闻都有一个独立的ID
- paper_title:论文标题
- paper_journal:论文发表期刊
- paper_authors:论文作者,用逗号隔开
match.csv:训练集提供匹配结果,字段如下:
- paper_id:论文ID
- press_id:和同一行paper_id对映的新闻的ID
测试集:(2019年6月8日发布)
- press_test.csv:科研新闻数据集,字段和press_train.csv相同
- paper_test.csv:论文数据集,字段和paper_train.csv相同
评测指标
MAP@3代码
y_true = match.paper_id
y_top_3 = y_pred
MAP_score = [[(y == y_true[j])/(i+1) for i, y in enumerate(y_sample)]
for j, y_sample in enumerate(y_top_3)]
map_score = np.sum(MAP_score, axis=1).mean()
map_score
方法
主要采用的是提取论文标题和新闻的tf-idf向量,再取最大的3个余弦相似度。最后结果只有0.62.
以下是代码
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
from tqdm import tqdm
import pandas as pd
import numpy as np
paper_test = pd.read_csv('../data/final_testset_20190610/new_paper_test.csv')
paper_test = paper_test[['paper_id','paper_title']]
press_test = pd.read_csv('../data/final_testset_20190610/new_press_test.csv')
press_test = press_test[['press_id','press_headline','press_text']]
press_test['press_content'] = press_test['press_text']
test_set = []
for i in tqdm(press_test.index):
doc = press_test.press_content[i]
test_set.append(doc)
for i in tqdm(paper_test.index):
p = paper_test.paper_title[i]
test_set.append(p)
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix_test = tfidf_vectorizer.fit_transform(test_set)
press_test['res0'] = 0
press_test['res1'] = 0
press_test['res2'] = 0
top_k = 3
for i in tqdm(paper_test.index):
result = cosine_similarity(tfidf_matrix_test[i], tfidf_matrix_test[25000:])
arr = result.argsort()[0][::-1][:top_k]
press_test['res0'][i] = paper_test.paper_id[arr[0]]
press_test['res1'][i] = paper_test.paper_id[arr[1]]
press_test['res2'][i] = paper_test.paper_id[arr[2]]
res = press_test[['press_id','res0','res1','res2']]
res.to_csv('../result/res.csv',index=0,header=None)
总结
- 后面有时间的话,其实想做监督学习的二分类,利用tf-idf和余弦相似度看看取个top5在训练集上能不能包含对的答案,这样来构成正负样本训练。
- 这是我的第一篇文章,欢迎大家指正学习。(想找个长期靠谱的队友,毕竟一个人做比赛没人沟通很容易放弃,欢迎关注我的公众号后台私聊)
前排大佬发的ppt特征总结
- 论文的作者出现在新闻中,那么这篇论文大概率和这个新闻匹配
- tf-idf
- LDA
- whether the author in the press
- whether the journal in the press
- how many times author in press
- 在论文钟journal缩写,在新闻中全拼,所以要替换成full name