CoolFace
Datasetpublic

huawei-csl/GitScholar

GitScholar: arXiv AI papers, their citations, and their GitHub footprint GitScholar is a relational, fully timestamped dataset linking AI arXiv papers to their citation history on Semantic Scholar and to the GitHub repositories that reference them. It is built for studying, and predicting, how research papers gain attention over time: every row carries the date on which it became true, so the state of the whole graph can be reconstructed as of any day between 1991 and… See the full description on the dataset page: https://huggingface.co/datasets/huawei-csl/GitScholar.

sourceHugging Faceodc-byupdated 56m agoView on Hugging Face
0likes79downloads
Dataset Card

GitScholar: arXiv AI papers, their citations, and their GitHub footprint

GitScholar is a relational, fully timestamped dataset linking AI arXiv papers to their citation history on Semantic Scholar and to the GitHub repositories that reference them. It is built for studying, and predicting, how research papers gain attention over time: every row carries the date on which it became true, so the state of the whole graph can be reconstructed as of any day between 1991 and 2026-06-16.

Contents

The dataset is twelve Parquet files in two groups that share one key, the arXiv id.

Academic side, from arXiv metadata and the Semantic Scholar (S2) bulk dump:

FileOne row perRows
features_arxiv.parquetarXiv paper in scope558,226
edges_author_arxiv.parquet(paper, author) pair for papers in scope2,566,255
edges_citation_arxiv.parquet(citing paper, cited paper, date) tuples, both papers in scope10,718,261
events_citation_arxiv.parquet(paper, date, bucket) on which a paper in scope gained citations16,070,452
edges_author_paper.parquet(author, paper) pair over the authors' entire publication record19,120,884
events_citation_paper.parquet(paper, date, bucket) for every paper in that record246,435,143

GitHub side, from a crawl of every public repository whose README mentions arXiv:

FileOne row perRows
features_repo.parquetrepository444,442
edges_repo_arxiv.parquet(repository, arXiv id, date) on which a README link appeared or disappeared3,337,278
events_stars.parquet(repository, day) on which it gained stars7,277,781
events_forks.parquet(repository, day) on which it gained forks1,814,715
events_issues.parquet(repository, day) on which issues were opened985,816
events_prs.parquet(repository, day) on which pull requests were opened900,591

Scope

Papers. A paper is in scope if it is on arXiv with at least one of the categories cs.AI, cs.LG, cs.CV or cs.CL, whether as primary or cross-listed category, and if Semantic Scholar holds a record for it. Papers are dated by the earlier of their first arXiv submission and their S2 publication date.

Authors. Every S2 author of a paper in scope. The author neighbourhood tables (edges_author_paper, events_citation_paper) follow these authors across their entire publication record, arXiv or not and in any field, so that an author's standing at a given date can be computed. They are supersets of the two arXiv tables: semi-joining either on features_arxiv.corpusid recovers the in-scope view.

Repositories. Every public GitHub repository whose README contained the string "arxiv" when the crawl found it, created between 2008 and the freeze. The crawl runs GitHub's search API over creation-date windows, so it is exhaustive within GitHub's own indexing of READMEs at crawl time.

Cutoff. Every table ends on 2026-06-16. Nothing dated later appears anywhere, so a point-in-time query as of any earlier day sees only what had been observed by then.

Schemas

features_arxiv

ColumnTypeMeaning
idstringarXiv identifier, e.g. 2406.11190
corpusidint64Semantic Scholar corpus id; the key the citation tables use
datedatethe day the paper became public: min(first arXiv submission, S2 publication date)
n_authorsint32number of author edges the paper has in edges_author_arxiv

Titles, abstracts and categories are not included here; they can be found in the public arXiv metadata snapshot https://www.kaggle.com/datasets/Cornell-University/arxiv and join on id.

edges_author_arxiv, edges_author_paper

ColumnTypeMeaning
corpusidint64the paper
authorint64Semantic Scholar author id
datedatethe paper's date; authorship is fixed at publication

In edges_author_paper, papers with no S2 publication date are dated by their earliest fully dated citation. Papers with no dated citation are omitted.

edges_citation_arxiv

ColumnTypeMeaning
citingint64corpus id of the citing paper
citedint64corpus id of the cited paper
datedatethe citing paper's date in features_arxiv

The citation graph restricted to papers in scope: both ends are in features_arxiv, so it can be used directly as paper-to-paper structure. It covers 507,325 citing and 379,972 cited papers.

The edge is dated by the citing paper's date as features_arxiv carries it, so that a paper has one date throughout the dataset. The events tables below date citations by the citing paper's S2 publication date instead; the two agree for 99.9 percent of these edges and differ only where arXiv posted the citing paper before S2's date. Every edge has a date, since every citing paper is in scope. Self-citations of a record by itself, an S2 merge artifact, are removed.

events_citation_arxiv, events_citation_paper

ColumnTypeMeaning
corpusidint64the cited paper
datedate, nullablethe day the citations are attributed to
yearint16, nullablethe year, for citations known only by year
bucketenumhow the citation relates to the cited paper's date (below)
citationsint32how many citations arrived on that (date, bucket)

A citation is dated by the publication date of the citing paper, since the citation edges themselves carry no date. Every citation in the S2 dump into a paper of the table is represented exactly once, in one of five buckets:

`bucket``date``year`Meaning
postsetnulldated on or after the cited paper's date: an ordinary citation
prepub_nearsetnulldated up to 60 days before the cited paper's date. Usually a dating artifact: S2 defaults an unknown day to the 1st of the month, and arXiv and S2 dates differ by a median of 26 days
prepub_farsetnulldated more than 60 days before the cited paper's date. The paper was public elsewhere before its arXiv posting
year_onlynullsetthe citing paper carries a year but no day
nullnullnullthe citing paper has neither a date nor a year

Nothing is dropped. A consumer who wants ordinary citations filters on bucket == "post" and can still see what that excluded. A consumer who wants the year-only citations on a timeline chooses their own rule for placing them: a uniform random day within the year, the year's midpoint, or the paper's own date when the years coincide.

features_repo

ColumnTypeMeaning
repo_idint32surrogate key used by the other GitHub tables; stable within this release only
full_namestringowner/name as on GitHub; the durable identifier
owner, namestringthe two halves of full_name
createddateGitHub's creation date for the repository

edges_repo_arxiv

ColumnTypeMeaning
repo_idint32the repository
arxiv_idstringthe paper the README links to
datedatethe day the link appeared (added = true) or disappeared (added = false)
addedbooldirection of the change

Links are recovered from README text: arxiv.org URLs in all their forms, arXiv:NNNN.NNNNN inline references, and eprint fields of BibTeX entries. The README is read from the repository's commit history, so a link is dated by the commit that introduced or removed it, collapsed to one state per day. Three consequences:

  • The link set is a change log. The links a repository has on day D are the pairs whose latest event on or before D is an add. Roughly 30 percent of rows are removals; paper feed repositories in particular rotate their links daily.

arxiv_id is not restricted to papers in features_arxiv. Every arXiv link found is kept, in any field, so the table can be joined to any arXiv-keyed dataset. Within this release, join on features_arxiv.id to restrict to the in-scope papers.

events_stars, events_forks, events_issues, events_prs

ColumnTypeMeaning
repo_idint32the repository
datedatethe day
countint32how many stars / forks / issues / pull requests the repository gained that day

Counts are daily gains, not running totals, and days with no gain have no row. Stars come from GitHub's per-star starredAt stream and were never decremented for unstars, so a repository's summed stars can slightly exceed its displayed count.

Quality filters applied to the paper set

These remove papers whose metadata is wrong in a way that would corrupt every date-based quantity derived from them.

  • Author-count disagreement. Papers where arXiv and S2 disagree by more than two authors are dropped: one of the two records is typically a different paper or a corrupted merge. This is not a common case.
  • Late arXiv postings. Papers with at least 25 citations, of which at least a quarter predate the paper's own date, are dropped. This catches well cited papers that were published in conferences, then uploaded to arXiv, and S2 attributes the arXiv date instead of the conference one.
  • Papers with no usable author id are dropped, since they would carry an empty author record that disagrees with n_authors.
  • Papers dated before 1991-08-14, the day arXiv opened, are dropped as impossible.

Papers excluded by the first two filters are also kept out of the author neighbourhood, so that they cannot re-enter through their co-authors.

Duplicate S2 records for one arXiv id, which happen when a preprint and its published version are never merged, are resolved to the lowest corpus id: the record created first and the one citations accumulate against.

Known limitations

  • Citation timing is reconstructed from the citing paper's date, so a citation from a paper S2 dates to a journal issue can appear months after the work was actually circulating, and S2's own dating errors propagate.
  • The crawl finds repositories through GitHub's README search, which indexes only the default branch's README
  • Link detection is textual. A repository mentioning a paper in a reading list and one implementing it produce the same edge. Repositories that link many papers can be identified from the edge table and treated separately.
  • Author identity is Semantic Scholar's author disambiguation, with its known splitting and merging errors.

Sources, licensing and availability

GitScholar is available at https://huggingface.co/datasets/MrGuanda/GitScholar and is released under the Open Data Commons Attribution License (ODC-By), which allows reuse and modification with appropriate attribution.

It combines:

  • arXiv paper metadata, obtained through the arXiv Open Archives Initiative (OAI) interface. Only identifiers and dates are redistributed here; titles, abstracts and categories remain in the public arXiv metadata and join on the arXiv id.
  • Semantic Scholar paper, author and citation records from the Semantic Scholar Open Research Corpus (Kinney et al., 2023), bulk release of 2026-06-16.
  • GitHub public repository metadata, collected through the official GitHub GraphQL API in accordance with GitHub's API Terms of Use. Only public metadata is included: repository names, creation dates, the arXiv identifiers found in READMEs, and daily counts of stars, forks, issues and pull requests. No personal data, no user-generated content such as README text, issue text or commit messages, and no private repository information is included.

Please cite the underlying sources alongside GitScholar when using it.

Reading the data

All files are standard Parquet and open with any Parquet reader. In Python:

python
import polars as pl

papers = pl.read_parquet("features_arxiv.parquet")
events = pl.read_parquet("events_citation_arxiv.parquet")

# Citations at one year after publication, ordinary citations only
cit_1y = (
    events.filter(pl.col("bucket") == "post")
    .join(papers.select("corpusid", pl.col("date").alias("pub_date")), on="corpusid")
    .filter(pl.col("date") <= pl.col("pub_date").dt.offset_by("1y"))
    .group_by("corpusid").agg(pl.col("citations").sum())
)

# Stars of every repository linking a paper, as of a cutoff date
cutoff = pl.date(2025, 6, 17)
links = (
    pl.read_parquet("edges_repo_arxiv.parquet")
    .filter(pl.col("date") <= cutoff).sort("date")
    .group_by("repo_id", "arxiv_id").agg(pl.col("added").last())
    .filter("added")
)
stars = (
    pl.read_parquet("events_stars.parquet")
    .filter(pl.col("date") <= cutoff)
    .group_by("repo_id").agg(pl.col("count").sum().alias("stars"))
)
stars_per_paper = links.join(stars, on="repo_id", how="left").group_by("arxiv_id").agg(pl.col("stars").sum())