Получите количество цитирований статьи за последние 12 месяцевPython

Программы на Python
Anonymous
Получите количество цитирований статьи за последние 12 месяцев

Сообщение Anonymous »

Используя код, я хочу получить количество цитирований статьи за последние 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"}

Вернуться в «Python»