{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analysis of Semantic Scholar's paper-author relations\n",
"(bipartite graph and collaboration complex)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Todo:\n",
"* describe the projected networks, e.g., degree distribution, clustering coefficient, mean path length, diameter\n",
"* correlation between author degree and #citations or #publications\n",
"* facet (upper) degrees: for a k-facet (i.e., a paper), number of incident k+1 simplices\n",
" * many authors are in few groups and very few authors are in many groups\n",
" * high facet degrees should correlate with high vertex degree and high publication rank => collaborate more with others, but also with more distinct sets of people\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy import sparse\n",
"import matplotlib as mpl\n",
"from matplotlib import pyplot as plt\n",
"import pandas as pd\n",
"import networkx as nx\n",
"from networkx.algorithms import bipartite as nxb\n",
"from IPython import display as ipd\n",
"\n",
"import sys\n",
"sys.path.append('..')\n",
"\n",
"from data.s2_5_bipartite_to_complex import build_features\n",
"#from data.s2_4_complex_to_matrices import load_matrices"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"plt.rcParams['figure.figsize'] = (17, 5)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def get_link(id, entity='paper'):\n",
" api = 'https://api.semanticscholar.org/v1/{}/{}'\n",
" webpage = 'https://www.semanticscholar.org/{}/{}'\n",
" for base in [api, webpage]:\n",
" link = base.format(entity, id)\n",
" txt = f'{link}'\n",
" ipd.display(ipd.HTML(txt))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def bins(array):\n",
" return np.arange(array.min(), array.max() + 2) - 0.5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1 Data loading"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"paper table: 241,412 papers, 10 features\n",
"edges table: 1,805,826 edges\n"
]
}
],
"source": [
"papers = pd.read_csv('../data/s2_2_bipartite_graph/papers.csv', index_col=0)\n",
"edges = pd.read_csv('../data/s2_2_bipartite_graph/paper_author_edges.csv')\n",
"\n",
"print('paper table: {:,} papers, {:,} features'.format(*papers.shape))\n",
"print('edges table: {:,} edges'.format(edges.shape[0]))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Uncomment to do (part of) the analysis on the full dataset.\n",
"# papers, edges = load('../data/s2_2_bipartite_graph/paper_author_full.pickle')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"biadjacency matrix: 241,412 papers, 741,665 authors, 1,805,826 edges\n"
]
}
],
"source": [
"biadjacency = sparse.load_npz('../data/s2_2_bipartite_graph/paper_author_biadjacency.npz')\n",
"\n",
"print('biadjacency matrix: {:,} papers, {:,} authors, {:,} edges'.format(\n",
" *biadjacency.shape, biadjacency.nnz))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"adjacency matrix: 241,412 papers, 10,276,283 edges\n",
"adjacency matrix: 741,665 authors, 18,874,369 edges\n"
]
}
],
"source": [
"adjacency_papers = sparse.load_npz('../data/s2_2_bipartite_graph/papers_adjacency.npz')\n",
"adjacency_authors = sparse.load_npz('../data/s2_2_bipartite_graph/authors_adjacency.npz')\n",
"\n",
"print('adjacency matrix: {:,} papers, {:,} edges'.format(adjacency_papers.shape[0], adjacency_papers.nnz // 2))\n",
"print('adjacency matrix: {:,} authors, {:,} edges'.format(adjacency_authors.shape[0], adjacency_authors.nnz // 2))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"s_node=150250\n",
"simplices=np.load(f'../data/s2_3_collaboration_complex/{s_node}_simplices.npy',allow_pickle=True)\n",
"cochains = np.load(f'../data/s2_3_collaboration_complex/{s_node}_cochains.npy',allow_pickle=True)\n",
"features=build_features(simplices, cochains)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"laplacians=np.load(f'../data/s2_3_collaboration_complex/{s_node}_laplacians.npy', allow_pickle=True)\n",
"boundaries=np.load(f'../data/s2_3_collaboration_complex/{s_node}_boundaries.npy', allow_pickle=True)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2 Size of collaborations"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Paper with the most authors (500):\n"
]
},
{
"data": {
"text/html": [
"https://api.semanticscholar.org/v1/paper/063f45eb5939b0169bda0dfdb30c064e103a9a1c"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"https://www.semanticscholar.org/paper/063f45eb5939b0169bda0dfdb30c064e103a9a1c"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Author with the most papers (799):\n"
]
},
{
"data": {
"text/html": [
"https://api.semanticscholar.org/v1/author/2058832"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"https://www.semanticscholar.org/author/2058832"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"