File size: 2,948 Bytes
d5b28d0
b9c182b
 
d5b28d0
 
fd28539
d5b28d0
 
 
b9c182b
d5b28d0
 
 
 
 
b9c182b
d5b28d0
b9c182b
d5b28d0
 
 
 
ea08d7a
fd28539
b9c182b
 
 
 
 
 
 
 
 
 
 
 
ea08d7a
 
 
 
b9c182b
ea08d7a
b9c182b
 
fd28539
d5b28d0
ea08d7a
fd28539
b9c182b
d5b28d0
 
 
 
ea08d7a
 
b9c182b
ea08d7a
 
 
de348fb
ea08d7a
b9c182b
ea08d7a
b9c182b
ea08d7a
b9c182b
ea08d7a
b9c182b
 
ea08d7a
b9c182b
ea08d7a
b9c182b
 
ea08d7a
b9c182b
ea08d7a
b9c182b
ea08d7a
b9c182b
ea08d7a
 
fd28539
b9c182b
fd28539
b9c182b
 
 
fd28539
 
 
b9c182b
 
 
d5b28d0
fd28539
 
 
b9c182b
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# Based on: https://github.com/allenai/s2-folks/tree/main/examples/python
#
#

import os
import traceback

import requests

S2_API_KEY = os.getenv("S2_API_KEY")
result_limit = 10


def find_basis_paper(query, result_limit=10):
    papers = None
    info = """Search results: 

"""
    while not papers:
        if not query:
            continue

        try:
            if len(S2_API_KEY):
                print("Using S2_API_KEY...")

            rsp = requests.get(
                "https://api.semanticscholar.org/graph/v1/paper/search",
                headers={"X-API-KEY": S2_API_KEY},
                params={
                    "query": query,
                    "limit": 100,
                    "fields": "title,url,authors,year,tldr,journal,citationCount",
                    "sort": "citationCount:desc",
                },
            )
            rsp.raise_for_status()
            results = rsp.json()
            total = results["total"]
            if not total:
                return "No matches found. Please try another query."

            print(f"Found {total} results. Showing up to {result_limit}.")
            papers = results["data"]
            info += format_paper_list(papers, int(result_limit))

        except Exception as e:
            print(traceback.format_exc())
            info += "There was a problem...\n\n%s" % e

    print(info)
    return info


def get_element(paper, part):
    simple_parts = ["year", "url", "title", "citationCount"]
    if part in simple_parts:
        if part in paper and paper[part] is not None:
            v = paper[part]
            return v.strip() if isinstance(v, str) else v
        else:
            return "???"

    elif part == "journal":
        if part in paper and paper[part] is not None:
            return paper[part]["name"].strip()
        else:
            return "???"
    elif part == "authors":
        if part in paper and paper[part] is not None:
            return paper[part][0]["name"].strip()
        else:
            return "???"
    elif part == "tldr":
        if part in paper and paper[part] is not None:
            return paper[part]["text"].strip()
        else:
            return "???"
    else:
        return "<unknown field %s>" % part


def format_paper_list(all_papers, result_limit):
    list = ""

    sorted_papers = sorted(all_papers, key=lambda d: d["citationCount"], reverse=True)[
        :result_limit
    ]

    print(sorted_papers)
    for idx, paper in enumerate(sorted_papers):
        list += f"{idx}: **{get_element(paper, 'authors')} et al. {get_element(paper, 'year')}**, [{get_element(paper, 'journal')}]({get_element(paper, 'url')}) {get_element(paper, 'title')}. Cited by {get_element(paper, 'citationCount')}\n\n"
        if paper["tldr"] and paper["tldr"]["text"]:
            list += f"> _{paper['tldr']['text'].strip()}_ \n\n"

    return list


if __name__ == "__main__":
    find_basis_paper("NeuroML")