Используя код, я хочу получить количество цитирований статьи за последние 12 месяцев. В Semantic Scholar вы можете увидеть количество цитирований статьи за год, но мне нужно окно за последние 12 месяцев. Например. (25.04 – 26.04). В качестве примера тестового примера я использовал статью Внимание — это все, что вам нужно. Я попробовал два подхода: OpenAlex и Semantic Scholar.
OpenAlex
Для написания статьи я использовал https://openalex.org/works/W2626778328. Общее количество цитирований составляет 6 тысяч, но NeurIPS показывает количество цитирований на уровне 200 тысяч. Вот код, который я использовал
import requests
import time
openalex_id = "W2626778328"
from_date = "2025-04-25"
to_date = "2026-04-26"
results_all = []
page = 1
per_page = 200
while True:
url = (
"https://api.openalex.org/works"
f"?filter=referenced_works:{openalex_id},"
f"from_publication_date:{from_date},"
f"to_publication_date:{to_date}"
f"&per-page={per_page}&page={page}"
)
res = requests.get(url)
print("status:", res.status_code)
if res.status_code != 200:
print(res.text)
break
data = res.json()
results = data.get("results", [])
if not results:
break
results_all.extend(results)
if page * per_page >= data["meta"]["count"]:
break
page += 1
time.sleep(0.1)
print(len(results_all))
Это вернуло результат 51, но это число кажется небольшим. Только за 2026 год число Semantic Scholar составило 7 тысяч.
Semantic Scholar
Я использовал местную версию статьи Arxiv для поиска версии Semantic Scholar. Вот код, который я использовал
import json
import requests
import re
import time
from collections import Counter
# =========================
# CONFIG
# =========================
API_KEY = ""
ARXIV_PATH = "/content/drive/MyDrive/arxiv_data/arxiv_entries_2017_23.json"
TARGET_TITLE = "Attention Is All You Need"
YEAR_START = 2025
YEAR_END = 2026
HEADERS = {
"x-api-key": API_KEY
}
# =========================
# HTTP WITH RETRY
# =========================
def safe_get(url, params=None, retries=5):
for i in range(retries):
res = requests.get(url, params=params, headers=HEADERS)
if res.status_code == 200:
return res
if res.status_code == 429:
wait = 2 ** i
print(f"[429] Rate limited. Sleeping {wait}s...")
time.sleep(wait)
else:
raise ValueError(f"Request failed: {res.status_code} {res.text}")
raise ValueError("Max retries exceeded")
# =========================
# LOAD ARXIV DATA
# =========================
with open(ARXIV_PATH, "r") as f:
data = json.load(f)
# =========================
# FIND PAPER
# =========================
paper_entry = None
for entry in data:
if TARGET_TITLE.lower() in entry.get("title", "").lower():
paper_entry = entry
break
if paper_entry is None:
raise ValueError("Paper not found")
print("Found:", paper_entry["title"])
# =========================
# EXTRACT ARXIV ID
# =========================
raw_id = paper_entry["id"]
match = re.search(r"abs/([0-9]+\.[0-9]+)(v\d+)?", raw_id)
if not match:
raise ValueError("Could not parse arXiv ID")
arxiv_id = match.group(1)
print("Parsed arXiv ID:", arxiv_id)
# =========================
# RESOLVE TO SEMANTIC SCHOLAR
# =========================
url = f"https://api.semanticscholar.org/graph/v ... :{arxiv_id}"
params = {"fields": "paperId,title"}
res = safe_get(url, params)
paper_data = res.json()
if "paperId" not in paper_data:
raise ValueError(f"Semantic Scholar lookup failed: {paper_data}")
paper_id = paper_data["paperId"]
print("Semantic Scholar ID:", paper_id)
print("Resolved title:", paper_data.get("title"))
# =========================
# FETCH CITATIONS
# =========================
url = f"https://api.semanticscholar.org/graph/v ... /citations"
params = {
"fields": "citingPaper.year,citingPaper.paperId",
"limit": 10000
}
offset = 0
total = 0
in_range = 0
missing_year = 0
bad_year = 0
year_counter = Counter()
first_batch = True
seen_ids = set()
while True:
params["offset"] = offset
res = safe_get(url, params)
data = res.json()
citations = data.get("data", [])
if not citations:
break
page_years = []
page_count = 0
for c in citations:
paper = c.get("citingPaper", {})
pid = paper.get("paperId")
if pid is None or pid in seen_ids:
continue
seen_ids.add(pid)
year = paper.get("year")
if not isinstance(year, int):
missing_year += 1
continue
page_years.append(year)
total += 1
year_counter[year] += 1
if YEAR_START = 10000
результат
ValueError: Request failed: 400 {"error":"offset + limit must be < 10000"}