gismap 0.3.0__py3-none-any.whl → 0.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gismap/__init__.py +1 -0
- gismap/build.py +26 -0
- gismap/gisgraphs/builder.py +23 -8
- gismap/gisgraphs/graph.py +15 -0
- gismap/gisgraphs/widget.py +23 -3
- gismap/lab/egomap.py +29 -7
- gismap/lab/expansion.py +35 -1
- gismap/lab/lab_author.py +34 -7
- gismap/lab/labmap.py +46 -6
- gismap/lab_examples/cedric.py +19 -6
- gismap/lab_examples/lamsade.py +45 -0
- gismap/lab_examples/toulouse.py +6 -2
- gismap/search.py +61 -1
- gismap/sources/dblp.py +23 -1
- gismap/sources/dblp_ttl.py +187 -0
- gismap/sources/hal.py +40 -2
- gismap/sources/ldb.py +716 -0
- gismap/sources/models.py +83 -0
- gismap/sources/multi.py +67 -2
- gismap/utils/common.py +73 -11
- gismap/utils/logger.py +2 -0
- gismap/utils/requests.py +3 -1
- gismap/utils/text.py +1 -1
- gismap/utils/zlist.py +88 -0
- {gismap-0.3.0.dist-info → gismap-0.4.1.dist-info}/METADATA +26 -11
- gismap-0.4.1.dist-info/RECORD +43 -0
- {gismap-0.3.0.dist-info → gismap-0.4.1.dist-info}/WHEEL +1 -1
- gismap-0.3.0.dist-info/RECORD +0 -38
- {gismap-0.3.0.dist-info → gismap-0.4.1.dist-info}/licenses/AUTHORS.md +0 -0
gismap/sources/models.py
CHANGED
|
@@ -6,11 +6,43 @@ from gismap.utils.common import LazyRepr
|
|
|
6
6
|
|
|
7
7
|
@dataclass(repr=False)
|
|
8
8
|
class Author(LazyRepr):
|
|
9
|
+
"""
|
|
10
|
+
Base class for authors in the database system.
|
|
11
|
+
|
|
12
|
+
Authors are identified primarily by their name and may have
|
|
13
|
+
database-specific subclasses with additional attributes like keys and aliases.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
name : :class:`str`
|
|
18
|
+
The author's name.
|
|
19
|
+
"""
|
|
20
|
+
|
|
9
21
|
name: str
|
|
10
22
|
|
|
11
23
|
|
|
12
24
|
@dataclass(repr=False)
|
|
13
25
|
class Publication(LazyRepr):
|
|
26
|
+
"""
|
|
27
|
+
Base class for publications in the database system.
|
|
28
|
+
|
|
29
|
+
Publications contain metadata about academic papers including title,
|
|
30
|
+
authors, venue, type, and publication year.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
title : :class:`str`
|
|
35
|
+
The publication title.
|
|
36
|
+
authors : :class:`list`
|
|
37
|
+
List of :class:`Author` objects.
|
|
38
|
+
venue : :class:`str`
|
|
39
|
+
Publication venue (journal, conference, etc.).
|
|
40
|
+
type : :class:`str`
|
|
41
|
+
Publication type (e.g., 'journal', 'conference', 'book').
|
|
42
|
+
year : :class:`int`
|
|
43
|
+
Year of publication.
|
|
44
|
+
"""
|
|
45
|
+
|
|
14
46
|
title: str
|
|
15
47
|
authors: list
|
|
16
48
|
venue: str
|
|
@@ -20,18 +52,69 @@ class Publication(LazyRepr):
|
|
|
20
52
|
|
|
21
53
|
@dataclass(repr=False)
|
|
22
54
|
class DB(LazyRepr):
|
|
55
|
+
"""
|
|
56
|
+
Abstract base class for database backends.
|
|
57
|
+
|
|
58
|
+
Provides the interface for searching authors and retrieving publications.
|
|
59
|
+
Subclasses must implement :meth:`search_author` and :meth:`from_author`.
|
|
60
|
+
|
|
61
|
+
Attributes
|
|
62
|
+
----------
|
|
63
|
+
db_name : :class:`str`
|
|
64
|
+
Identifier for the database backend (e.g., 'hal', 'dblp', 'ldb').
|
|
65
|
+
"""
|
|
66
|
+
|
|
23
67
|
db_name: ClassVar[str] = None
|
|
24
68
|
|
|
25
69
|
@classmethod
|
|
26
70
|
def search_author(cls, name):
|
|
71
|
+
"""
|
|
72
|
+
Search for authors matching the given name.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
name : :class:`str`
|
|
77
|
+
Name to search for.
|
|
78
|
+
|
|
79
|
+
Returns
|
|
80
|
+
-------
|
|
81
|
+
:class:`list`
|
|
82
|
+
List of matching :class:`Author` objects.
|
|
83
|
+
"""
|
|
27
84
|
raise NotImplementedError
|
|
28
85
|
|
|
29
86
|
@classmethod
|
|
30
87
|
def from_author(cls, a):
|
|
88
|
+
"""
|
|
89
|
+
Retrieve publications for a given author.
|
|
90
|
+
|
|
91
|
+
Parameters
|
|
92
|
+
----------
|
|
93
|
+
a : :class:`Author`
|
|
94
|
+
The author whose publications to retrieve.
|
|
95
|
+
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
:class:`list`
|
|
99
|
+
List of :class:`Publication` objects.
|
|
100
|
+
"""
|
|
31
101
|
raise NotImplementedError
|
|
32
102
|
|
|
33
103
|
|
|
34
104
|
def db_class_to_auth_class(db_class):
|
|
105
|
+
"""
|
|
106
|
+
Find the Author subclass associated with a given DB class.
|
|
107
|
+
|
|
108
|
+
Parameters
|
|
109
|
+
----------
|
|
110
|
+
db_class : :class:`type`
|
|
111
|
+
A DB subclass (e.g., HAL, DBLP, LDB).
|
|
112
|
+
|
|
113
|
+
Returns
|
|
114
|
+
-------
|
|
115
|
+
:class:`type` or None
|
|
116
|
+
The corresponding Author subclass, or None if not found.
|
|
117
|
+
"""
|
|
35
118
|
for subclass in Author.__subclasses__():
|
|
36
119
|
if db_class in subclass.__mro__:
|
|
37
120
|
return subclass
|
gismap/sources/multi.py
CHANGED
|
@@ -8,6 +8,22 @@ from gismap.utils.text import clean_aliases
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def score_author_source(dbauthor):
|
|
11
|
+
"""
|
|
12
|
+
Compute a quality score for an author source.
|
|
13
|
+
|
|
14
|
+
Higher scores indicate more reliable author identification.
|
|
15
|
+
HAL idHal keys are preferred, followed by HAL pid, then DBLP/LDB.
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
dbauthor: :class:`~gismap.sources.models.Author`
|
|
20
|
+
A database-specific author object.
|
|
21
|
+
|
|
22
|
+
Returns
|
|
23
|
+
-------
|
|
24
|
+
:class:`int`
|
|
25
|
+
Score value (higher is better).
|
|
26
|
+
"""
|
|
11
27
|
if dbauthor.db_name == "hal":
|
|
12
28
|
if dbauthor.key_type == "fullname":
|
|
13
29
|
return -1
|
|
@@ -15,18 +31,45 @@ def score_author_source(dbauthor):
|
|
|
15
31
|
return 2
|
|
16
32
|
else:
|
|
17
33
|
return 3
|
|
18
|
-
elif dbauthor.db_name
|
|
34
|
+
elif dbauthor.db_name in ["dblp", "ldb"]:
|
|
19
35
|
return 1
|
|
20
36
|
else:
|
|
21
37
|
return 0
|
|
22
38
|
|
|
23
39
|
|
|
24
40
|
def sort_author_sources(sources):
|
|
41
|
+
"""
|
|
42
|
+
Sort author sources by quality score in descending order.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
sources: :class:`list`
|
|
47
|
+
List of database-specific author objects.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
:class:`list`
|
|
52
|
+
Sorted list with highest-quality sources first.
|
|
53
|
+
"""
|
|
25
54
|
return sorted(sources, key=score_author_source, reverse=True)
|
|
26
55
|
|
|
27
56
|
|
|
28
57
|
@dataclass(repr=False)
|
|
29
58
|
class SourcedAuthor(Author):
|
|
59
|
+
"""
|
|
60
|
+
An author aggregated from multiple database sources.
|
|
61
|
+
|
|
62
|
+
Combines author information from HAL, DBLP, and/or LDB into a single entity.
|
|
63
|
+
The primary source (first in the sorted list) determines the author's key.
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
name: :class:`str`
|
|
68
|
+
The author's name.
|
|
69
|
+
sources: :class:`list`
|
|
70
|
+
List of database-specific author objects (HALAuthor, DBLPAuthor, LDBAuthor).
|
|
71
|
+
"""
|
|
72
|
+
|
|
30
73
|
sources: list = field(default_factory=list)
|
|
31
74
|
|
|
32
75
|
@property
|
|
@@ -69,7 +112,7 @@ class SourcedAuthor(Author):
|
|
|
69
112
|
|
|
70
113
|
|
|
71
114
|
publication_score_rosetta = {
|
|
72
|
-
"db_name": {"dblp": 1, "hal": 2},
|
|
115
|
+
"db_name": {"dblp": 1, "ldb": 1, "hal": 2},
|
|
73
116
|
"venue": {"CoRR": -1, "unpublished": -2},
|
|
74
117
|
"type": {"conference": 1, "journal": 2},
|
|
75
118
|
}
|
|
@@ -89,6 +132,28 @@ def sort_publication_sources(sources):
|
|
|
89
132
|
|
|
90
133
|
@dataclass(repr=False)
|
|
91
134
|
class SourcedPublication(Publication):
|
|
135
|
+
"""
|
|
136
|
+
A publication aggregated from multiple database sources.
|
|
137
|
+
|
|
138
|
+
Combines publication entries from HAL, DBLP, and/or LDB that refer
|
|
139
|
+
to the same paper. The primary source determines the publication's metadata.
|
|
140
|
+
|
|
141
|
+
Parameters
|
|
142
|
+
----------
|
|
143
|
+
title: :class:`str`
|
|
144
|
+
Publication title.
|
|
145
|
+
authors: :class:`list`
|
|
146
|
+
List of author objects.
|
|
147
|
+
venue: :class:`str`
|
|
148
|
+
Publication venue.
|
|
149
|
+
type: :class:`str`
|
|
150
|
+
Publication type.
|
|
151
|
+
year: :class:`int`
|
|
152
|
+
Publication year.
|
|
153
|
+
sources: :class:`list`
|
|
154
|
+
List of database-specific publication objects.
|
|
155
|
+
"""
|
|
156
|
+
|
|
92
157
|
sources: list = field(default_factory=list)
|
|
93
158
|
|
|
94
159
|
@property
|
gismap/utils/common.py
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
1
3
|
HIDDEN_KEYS = {"sources", "aliases", "abstract", "metadata"}
|
|
2
4
|
|
|
3
5
|
|
|
4
6
|
class LazyRepr:
|
|
5
7
|
"""
|
|
6
|
-
MixIn that
|
|
8
|
+
MixIn that provides a clean repr for dataclasses.
|
|
9
|
+
|
|
10
|
+
Hides empty fields and fields in HIDDEN_KEYS from the repr string.
|
|
11
|
+
Private attributes (starting with '_') are also hidden.
|
|
7
12
|
"""
|
|
8
13
|
|
|
9
14
|
def __repr__(self):
|
|
@@ -30,7 +35,7 @@ def unlist(x):
|
|
|
30
35
|
return x[0] if (isinstance(x, list) and x) else x
|
|
31
36
|
|
|
32
37
|
|
|
33
|
-
def get_classes(root, key="name"):
|
|
38
|
+
def get_classes(root, key="name", recurse=False):
|
|
34
39
|
"""
|
|
35
40
|
Parameters
|
|
36
41
|
----------
|
|
@@ -38,6 +43,8 @@ def get_classes(root, key="name"):
|
|
|
38
43
|
Starting class (can be abstract).
|
|
39
44
|
key: :class:`str`, default='name'
|
|
40
45
|
Attribute to look-up
|
|
46
|
+
recurse: bool, default=False
|
|
47
|
+
Recursively traverse subclasses.
|
|
41
48
|
|
|
42
49
|
Returns
|
|
43
50
|
-------
|
|
@@ -50,13 +57,16 @@ def get_classes(root, key="name"):
|
|
|
50
57
|
>>> from gismap.sources.models import DB
|
|
51
58
|
>>> subclasses = get_classes(DB, key='db_name')
|
|
52
59
|
>>> dict(sorted(subclasses.items())) # doctest: +NORMALIZE_WHITESPACE
|
|
53
|
-
{'dblp': <class 'gismap.sources.dblp.DBLP'>,
|
|
60
|
+
{'dblp': <class 'gismap.sources.dblp.DBLP'>,
|
|
61
|
+
'hal': <class 'gismap.sources.hal.HAL'>,
|
|
62
|
+
'ldb': <class 'gismap.sources.ldb.LDB'>}
|
|
54
63
|
"""
|
|
55
64
|
result = {
|
|
56
65
|
getattr(c, key): c for c in root.__subclasses__() if getattr(c, key, None)
|
|
57
66
|
}
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
if recurse:
|
|
68
|
+
for c in root.__subclasses__():
|
|
69
|
+
result.update(get_classes(c, key=key, recurse=True))
|
|
60
70
|
return result
|
|
61
71
|
|
|
62
72
|
|
|
@@ -83,23 +93,75 @@ def list_of_objects(clss, dico, default=None):
|
|
|
83
93
|
|
|
84
94
|
>>> from gismap.sources.models import DB
|
|
85
95
|
>>> subclasses = get_classes(DB, key='db_name')
|
|
86
|
-
>>> from gismap import HAL, DBLP
|
|
87
|
-
>>> list_of_objects([HAL, '
|
|
88
|
-
[<class 'gismap.sources.hal.HAL'>, <class 'gismap.sources.
|
|
96
|
+
>>> from gismap import HAL, DBLP, LDB
|
|
97
|
+
>>> list_of_objects([HAL, 'ldb'], subclasses)
|
|
98
|
+
[<class 'gismap.sources.hal.HAL'>, <class 'gismap.sources.ldb.LDB'>]
|
|
89
99
|
>>> list_of_objects(None, subclasses, [DBLP])
|
|
90
100
|
[<class 'gismap.sources.dblp.DBLP'>]
|
|
91
|
-
>>> list_of_objects(
|
|
92
|
-
[<class 'gismap.sources.
|
|
101
|
+
>>> list_of_objects(LDB, subclasses)
|
|
102
|
+
[<class 'gismap.sources.ldb.LDB'>]
|
|
93
103
|
>>> list_of_objects('hal', subclasses)
|
|
94
104
|
[<class 'gismap.sources.hal.HAL'>]
|
|
95
105
|
"""
|
|
96
106
|
if default is None:
|
|
97
107
|
default = []
|
|
98
108
|
if clss is None:
|
|
99
|
-
return default
|
|
109
|
+
return list_of_objects(clss=default, dico=dico)
|
|
100
110
|
elif isinstance(clss, str):
|
|
101
111
|
return [dico[clss]]
|
|
102
112
|
elif isinstance(clss, list):
|
|
103
113
|
return [cls for lcls in clss for cls in list_of_objects(lcls, dico, default)]
|
|
104
114
|
else:
|
|
105
115
|
return [clss]
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass(repr=False)
|
|
119
|
+
class Data(LazyRepr):
|
|
120
|
+
"""
|
|
121
|
+
Easy-going converter of dict to dataclass. Useful when you want to use attribute access
|
|
122
|
+
and do not care about giving a full description.
|
|
123
|
+
|
|
124
|
+
Examples
|
|
125
|
+
--------
|
|
126
|
+
|
|
127
|
+
>>> data = Data({
|
|
128
|
+
... 'name': 'Alice',
|
|
129
|
+
... 'age': 30,
|
|
130
|
+
... 'address': {'street': '123 Main', 'city': 'Paris'},
|
|
131
|
+
... 'hobbies': [{'name': 'jazz', 'level': 5}, {'name': 'code'}]})
|
|
132
|
+
>>> data # doctest: +NORMALIZE_WHITESPACE
|
|
133
|
+
Data(name='Alice', age=30, address=Data(street='123 Main', city='Paris'),
|
|
134
|
+
hobbies=[Data(name='jazz', level=5), Data(name='code')])
|
|
135
|
+
>>> data.hobbies[0].name
|
|
136
|
+
'jazz'
|
|
137
|
+
>>> data.todict() # doctest: +NORMALIZE_WHITESPACE
|
|
138
|
+
{'name': 'Alice', 'age': 30, 'address': {'street': '123 Main', 'city': 'Paris'},
|
|
139
|
+
'hobbies': [{'name': 'jazz', 'level': 5}, {'name': 'code'}]}
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
def __init__(self, data):
|
|
143
|
+
self._wrap(data)
|
|
144
|
+
|
|
145
|
+
def _wrap(self, d):
|
|
146
|
+
for key, value in d.items():
|
|
147
|
+
wrapped = self._wrap_item(value)
|
|
148
|
+
setattr(self, key, wrapped)
|
|
149
|
+
|
|
150
|
+
def _wrap_item(self, item):
|
|
151
|
+
if isinstance(item, dict):
|
|
152
|
+
return Data(item)
|
|
153
|
+
elif isinstance(item, list):
|
|
154
|
+
return [self._wrap_item(subitem) for subitem in item]
|
|
155
|
+
return item
|
|
156
|
+
|
|
157
|
+
def todict(self):
|
|
158
|
+
res = {}
|
|
159
|
+
for key in self.__dict__:
|
|
160
|
+
value = getattr(self, key)
|
|
161
|
+
if hasattr(value, "todict"):
|
|
162
|
+
res[key] = value.todict()
|
|
163
|
+
elif isinstance(value, list):
|
|
164
|
+
res[key] = [v.todict() if hasattr(v, "todict") else v for v in value]
|
|
165
|
+
else:
|
|
166
|
+
res[key] = value
|
|
167
|
+
return res
|
gismap/utils/logger.py
CHANGED
gismap/utils/requests.py
CHANGED
|
@@ -21,7 +21,9 @@ def get(url, params=None, n_trials=10, verify=True):
|
|
|
21
21
|
Entry point to fetch.
|
|
22
22
|
params: :class:`dict`, optional
|
|
23
23
|
Get arguments (appended to URL).
|
|
24
|
-
|
|
24
|
+
n_trials: :class:`int`, default=10
|
|
25
|
+
Number of attempts to fetch URL.
|
|
26
|
+
verify: :class:`bool`, default=True
|
|
25
27
|
Verify certificates.
|
|
26
28
|
|
|
27
29
|
Returns
|
gismap/utils/text.py
CHANGED
gismap/utils/zlist.py
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from gismo.common import MixInIO
|
|
2
|
+
import zstandard as zstd
|
|
3
|
+
import numpy as np
|
|
4
|
+
import pickle
|
|
5
|
+
|
|
6
|
+
dctx = zstd.ZstdDecompressor()
|
|
7
|
+
cctx = zstd.ZstdCompressor()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ZList(MixInIO):
|
|
11
|
+
"""
|
|
12
|
+
Compressed list with frame-based storage.
|
|
13
|
+
|
|
14
|
+
Stores elements in compressed frames, allowing efficient memory usage
|
|
15
|
+
while maintaining random access. Uses zstandard compression.
|
|
16
|
+
|
|
17
|
+
Use as a context manager for building:
|
|
18
|
+
|
|
19
|
+
with ZList(frame_size=1000) as z:
|
|
20
|
+
for item in data:
|
|
21
|
+
z.append(item)
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
frame_size : :class:`int`, default=1000
|
|
26
|
+
Number of elements per compressed frame.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, frame_size=1000):
|
|
30
|
+
self.frame_size = frame_size
|
|
31
|
+
self.frame = None
|
|
32
|
+
self._frame_index = None
|
|
33
|
+
self._blob = None
|
|
34
|
+
self._off = None
|
|
35
|
+
self._n = None
|
|
36
|
+
self._batch = None
|
|
37
|
+
|
|
38
|
+
def _merge_batch(self):
|
|
39
|
+
if self._batch:
|
|
40
|
+
frame = cctx.compress(pickle.dumps(self._batch))
|
|
41
|
+
self._blob += frame
|
|
42
|
+
self._off.append(len(self._blob))
|
|
43
|
+
self._batch = []
|
|
44
|
+
|
|
45
|
+
def append(self, entry):
|
|
46
|
+
"""
|
|
47
|
+
Add an element to the list.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
entry
|
|
52
|
+
Element to add.
|
|
53
|
+
"""
|
|
54
|
+
self._batch.append(entry)
|
|
55
|
+
self._n += 1
|
|
56
|
+
if len(self._batch) == self.frame_size:
|
|
57
|
+
self._merge_batch()
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def size(self):
|
|
61
|
+
return len(self._blob)
|
|
62
|
+
|
|
63
|
+
def __enter__(self):
|
|
64
|
+
self._blob = bytearray()
|
|
65
|
+
self._off = [0]
|
|
66
|
+
self._n = 0
|
|
67
|
+
self._batch = []
|
|
68
|
+
return self
|
|
69
|
+
|
|
70
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
71
|
+
self._merge_batch()
|
|
72
|
+
self._blob = bytes(self._blob)
|
|
73
|
+
self._off = np.array(self._off, dtype=int)
|
|
74
|
+
|
|
75
|
+
def load_frame(self, f):
|
|
76
|
+
self.frame = pickle.loads(
|
|
77
|
+
dctx.decompress(self._blob[self._off[f] : self._off[f + 1]])
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def __getitem__(self, i):
|
|
81
|
+
g, f = i // self.frame_size, i % self.frame_size
|
|
82
|
+
if g != self._frame_index:
|
|
83
|
+
self.load_frame(g)
|
|
84
|
+
self._frame_index = g
|
|
85
|
+
return self.frame[f]
|
|
86
|
+
|
|
87
|
+
def __len__(self):
|
|
88
|
+
return self._n
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gismap
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: GisMap
|
|
3
|
+
Version: 0.4.1
|
|
4
|
+
Summary: GisMap: for researchers, by researchers. Research cartography tools leveraging DBLP and HAL.
|
|
5
5
|
Project-URL: Repository, https://github.com/balouf/gismap
|
|
6
6
|
Project-URL: Documentation, https://balouf.github.io/gismap
|
|
7
7
|
Author-email: Fabien Mathieu <fabien.mathieu@normalesup.org>
|
|
8
8
|
Maintainer-email: Fabien Mathieu <fabien.mathieu@normalesup.org>
|
|
9
9
|
License-Expression: MIT
|
|
10
10
|
License-File: AUTHORS.md
|
|
11
|
-
Requires-Python:
|
|
12
|
-
Requires-Dist:
|
|
11
|
+
Requires-Python: <3.15,>=3.11
|
|
12
|
+
Requires-Dist: beautifulsoup4>=4.14.3
|
|
13
|
+
Requires-Dist: bof>=0.4.2
|
|
13
14
|
Requires-Dist: distinctipy>=1.3.4
|
|
14
15
|
Requires-Dist: domonic>=0.9.13
|
|
15
|
-
Requires-Dist: gismo>=0.5.
|
|
16
|
+
Requires-Dist: gismo>=0.5.4
|
|
16
17
|
Requires-Dist: ipykernel>=6.30.1
|
|
17
18
|
Requires-Dist: ipywidgets>=8.1.8
|
|
19
|
+
Requires-Dist: platformdirs>=4.5.1
|
|
18
20
|
Requires-Dist: tqdm>=4.67.1
|
|
19
21
|
Description-Content-Type: text/markdown
|
|
20
22
|
|
|
21
|
-
#
|
|
23
|
+
# GisMap: for researchers, by researchers
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
[](https://pypi.python.org/pypi/gismap)
|
|
@@ -28,7 +30,7 @@ Description-Content-Type: text/markdown
|
|
|
28
30
|
[](https://opensource.org/licenses/MIT)
|
|
29
31
|
[](https://codecov.io/gh/balouf/gismap/tree/main)
|
|
30
32
|
|
|
31
|
-
GisMap leverages DBLP and HAL databases to provide cartography tools for you and your lab.
|
|
33
|
+
GisMap (Generic Information Search: Mapping and Analysis of Publications) leverages DBLP and HAL databases to provide cartography tools for you and your lab.
|
|
32
34
|
|
|
33
35
|
- Free software: MIT
|
|
34
36
|
- Documentation: <https://balouf.github.io/gismap/>.
|
|
@@ -39,6 +41,7 @@ GisMap leverages DBLP and HAL databases to provide cartography tools for you and
|
|
|
39
41
|
- Can be used by all researchers in Computer Science (DBLP endpoint) or based in France (HAL endpoint).
|
|
40
42
|
- Aggregate publications from multiple databases, including multiple author keys inside the same database.
|
|
41
43
|
- Automatically keeps track of a Lab/Department members and publications.
|
|
44
|
+
- DBLP database can be used locally (LDB endpoint) to improve speed and reliability.
|
|
42
45
|
- Builds interactive collaboration graphs.
|
|
43
46
|
|
|
44
47
|
## Test GisMap online!
|
|
@@ -52,6 +55,7 @@ For example:
|
|
|
52
55
|
- [Tutorial: Making EgoMaps](https://mybinder.org/v2/gh/balouf/gismap/HEAD?urlpath=%2Fdoc%2Ftree%2Fdocs%2Ftutorials%2Fegomap.ipynb)
|
|
53
56
|
- [Jupyter Lab instance with GisMap installed](https://mybinder.org/v2/gh/balouf/gismap/HEAD)
|
|
54
57
|
|
|
58
|
+
**WARNING**: don't use LDB on `binder`, which does not provide enough memory yet. Only HAL and legacy DBLP work on binder.
|
|
55
59
|
|
|
56
60
|
## Quickstart
|
|
57
61
|
|
|
@@ -61,17 +65,28 @@ Install GisMap:
|
|
|
61
65
|
$ pip install gismap
|
|
62
66
|
```
|
|
63
67
|
|
|
64
|
-
Use GisMap to
|
|
68
|
+
Use GisMap to display a collaboration graph (HTML) from a Notebook:
|
|
65
69
|
|
|
66
70
|
```pycon
|
|
67
|
-
>>> from gismap.
|
|
68
|
-
>>>
|
|
69
|
-
>>> lab = ListLab(["Fabien Mathieu", "François Baccelli", "Ludovic Noirie", "Céline Comte", "Sébastien Tixeuil"], dbs="hal")
|
|
71
|
+
>>> from gismap.lab import ListMap
|
|
72
|
+
>>> lab = ListMap(["Fabien Mathieu", "François Baccelli", "Ludovic Noirie", "Céline Comte", "Sébastien Tixeuil"], dbs="hal")
|
|
70
73
|
>>> lab.update_authors()
|
|
71
74
|
>>> lab.update_publis()
|
|
72
75
|
>>> lab.show_html()
|
|
73
76
|
```
|
|
74
77
|
|
|
78
|
+
If you are not using Jupyter Lab/Notebook, rich display will not work.
|
|
79
|
+
Instead, save the HTML and display it on your browser:
|
|
80
|
+
|
|
81
|
+
```pycon
|
|
82
|
+
>>> from gismap.lab import ListMap
|
|
83
|
+
>>> lab = ListMap(["Fabien Mathieu", "François Baccelli", "Ludovic Noirie", "Céline Comte", "Sébastien Tixeuil"], dbs="hal")
|
|
84
|
+
>>> lab.update_authors()
|
|
85
|
+
>>> lab.update_publis()
|
|
86
|
+
>>> lab.save_html("my_graph")
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
|
|
75
90
|
## Credits
|
|
76
91
|
|
|
77
92
|
This package was created with [Cookiecutter][CC] and the [Package Helper 3][PH3] project template.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
gismap/__init__.py,sha256=FHZLy3T2zFVrFRe3sqSRTuXkZ6DYise9HtXCWWfXrys,866
|
|
2
|
+
gismap/author.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
gismap/build.py,sha256=lyJgrlvf2xXD4vfYn8VjwKloPBL4DKnplWQuwo2Sh8w,693
|
|
4
|
+
gismap/gismap.py,sha256=h0hwdogXGFqerm-5ZPeT-irPn91pCcQRjiHThXsRzEk,19
|
|
5
|
+
gismap/gismo.py,sha256=oDAryl4XQzHE0tUmOWC-3G1n_zUgTeykPL-JWSDYwe0,6307
|
|
6
|
+
gismap/search.py,sha256=EQTts33P47WqbTBFNC0RwXXUJ0Teb6rJMru2gKRJP5k,6289
|
|
7
|
+
gismap/gisgraphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
gismap/gisgraphs/builder.py,sha256=GlyvKIfeUlkCD1Oap5qtY5dYBHTEQYT_YXnedt7IK44,3971
|
|
9
|
+
gismap/gisgraphs/graph.py,sha256=hipfxQ_l5lfIyOkrQAb8oVMERIbe8fcFiz2gASbcNsQ,7320
|
|
10
|
+
gismap/gisgraphs/groups.py,sha256=1E-7Xrv0uDw2SgqwtdjgeRLVBLaC7agUrrVics4jVLs,2405
|
|
11
|
+
gismap/gisgraphs/js.py,sha256=Gbz5nMWORabZkgIdyZAe1sMlnwJZ9jy7sLrx0vYStzI,6283
|
|
12
|
+
gismap/gisgraphs/options.py,sha256=lmUSnfSwrZQyJpGGs16JUGDIQNcJeX4Y0tA8cyC0nuM,817
|
|
13
|
+
gismap/gisgraphs/style.py,sha256=sXNUnv690kxiJiRQZ7lv4iKKrsxMqAfblheJbqesd48,4653
|
|
14
|
+
gismap/gisgraphs/widget.py,sha256=-wS98lHjewMYH6hEndAnb7MOe-mDOa9FVHeVUY0QRqY,5086
|
|
15
|
+
gismap/lab/__init__.py,sha256=ifyZqI9BpC5NRlMfSmJ671tnKWJDoXbo18iDoE-VR1s,181
|
|
16
|
+
gismap/lab/egomap.py,sha256=MFtuqvCHJCF6IG94uwHTdED1jwK6-BtQTLPfxk88GOQ,2071
|
|
17
|
+
gismap/lab/expansion.py,sha256=dmOHbbd69EGPaQ0gpH1bRW5q59fbG5T_K0tl8E6QmDg,7393
|
|
18
|
+
gismap/lab/filters.py,sha256=pG_g2POQXMbyUUw0aXOaeyiGBbiSc7M2NzxLCTQrALk,1875
|
|
19
|
+
gismap/lab/lab_author.py,sha256=RQWeAmprs_h1_RS7slR0ApWXkuh8iekV5dHQgPSj-rY,5123
|
|
20
|
+
gismap/lab/labmap.py,sha256=owvvDfOBNmyyp4K7lgmZAnF6gWl3SJTto1Qpr96Qu_c,6620
|
|
21
|
+
gismap/lab_examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
gismap/lab_examples/cedric.py,sha256=nsRR_dcnTp9PIXKe3A0Is5beG4IIDPtspNP79BlkYNc,1906
|
|
23
|
+
gismap/lab_examples/lamsade.py,sha256=SRv_kWN0WPKp0KEFwP7SmWRvKPCRMLG3ya_w9VIrjCM,1330
|
|
24
|
+
gismap/lab_examples/lincs.py,sha256=-mIVMGQMrtCtJ3N-oCU8j4Ko9mDuhEPB_pA0gaIw4QA,1126
|
|
25
|
+
gismap/lab_examples/lip6.py,sha256=K32Jqe3-o99QYI--akmwBDFAWKgq0HFEk_psC4akR60,1740
|
|
26
|
+
gismap/lab_examples/toulouse.py,sha256=Zg6xZFxGfl3FvBh9R5hJSMRyC16DL7aJwLU9H_9mkSA,2139
|
|
27
|
+
gismap/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
gismap/sources/dblp.py,sha256=T6vLo4T7mB5IqHIl_Q7QTU2whkhzfR30H9ULjnLaNFw,5321
|
|
29
|
+
gismap/sources/dblp_ttl.py,sha256=B-gHxBfP0zIWIYNMqLbKrOnbu9ybqByU8G4FNj0NChg,5597
|
|
30
|
+
gismap/sources/hal.py,sha256=aHeX3C2al75NCMNKksTP2-4Jj6sAaI9iyKuL7F-V7UA,11278
|
|
31
|
+
gismap/sources/ldb.py,sha256=ub7ctY82YahvkOvn8XYTG643cyi4gXfTpMspGMhT5dE,23570
|
|
32
|
+
gismap/sources/models.py,sha256=xWQi4eOpiaVDsj6MvnLpu4auYUFNsJpw6OrF1LWTb3s,2823
|
|
33
|
+
gismap/sources/multi.py,sha256=G6HL0lep-b3_EdOo6aVUGUWCJV5bSUkWbSkwJobSqWA,6435
|
|
34
|
+
gismap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
+
gismap/utils/common.py,sha256=tG1QHYj8F-HsgGTpUb3-R0gSki8CPgM0_L2vq2VvOz8,4960
|
|
36
|
+
gismap/utils/logger.py,sha256=zvOPJqC7V6GV4Ov8M9-tnK63c2poDAEcWq_UarOLcpg,117
|
|
37
|
+
gismap/utils/requests.py,sha256=ZSKYJ08MlEtJTHdKYi61KxK6RjYxTBNxWjEUH-EtbbI,1468
|
|
38
|
+
gismap/utils/text.py,sha256=l1PCmOH6q6zg9gJZfnCXQ4ZXcyRY5nazrNb4WGTZPBA,3811
|
|
39
|
+
gismap/utils/zlist.py,sha256=nliEOohgwTjEE4vrjxqXiM5vERE35s7ENM24o6t7I9A,2212
|
|
40
|
+
gismap-0.4.1.dist-info/METADATA,sha256=nsDZRC5rJp4ZesZsJi5dyDxA0QcGzj4CaRd2wbOZtPQ,4161
|
|
41
|
+
gismap-0.4.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
42
|
+
gismap-0.4.1.dist-info/licenses/AUTHORS.md,sha256=oDR4mptVUBMq0WKIpt19Km1Bdfz3cO2NAOVgwVfTO8g,131
|
|
43
|
+
gismap-0.4.1.dist-info/RECORD,,
|
gismap-0.3.0.dist-info/RECORD
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
gismap/__init__.py,sha256=Zk5ZXwC-MBREnngJh3V9WUtxLSAUKhkyJhV6kUjtxLE,800
|
|
2
|
-
gismap/author.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
gismap/gismap.py,sha256=h0hwdogXGFqerm-5ZPeT-irPn91pCcQRjiHThXsRzEk,19
|
|
4
|
-
gismap/gismo.py,sha256=oDAryl4XQzHE0tUmOWC-3G1n_zUgTeykPL-JWSDYwe0,6307
|
|
5
|
-
gismap/search.py,sha256=nsUoDsFGeEtvCZ0dB7ooRPC_6qsazkiWx_oM7dHdNV4,4932
|
|
6
|
-
gismap/gisgraphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
-
gismap/gisgraphs/builder.py,sha256=La01_OczsSfZ1hu8sq6rdQN_TelBatN8wP3xLF7TwIg,3234
|
|
8
|
-
gismap/gisgraphs/graph.py,sha256=RuUuWdPudrbrDyoGMj2V9SuJGkrsClL_4_4tUMptsjk,7028
|
|
9
|
-
gismap/gisgraphs/groups.py,sha256=1E-7Xrv0uDw2SgqwtdjgeRLVBLaC7agUrrVics4jVLs,2405
|
|
10
|
-
gismap/gisgraphs/js.py,sha256=Gbz5nMWORabZkgIdyZAe1sMlnwJZ9jy7sLrx0vYStzI,6283
|
|
11
|
-
gismap/gisgraphs/options.py,sha256=lmUSnfSwrZQyJpGGs16JUGDIQNcJeX4Y0tA8cyC0nuM,817
|
|
12
|
-
gismap/gisgraphs/style.py,sha256=sXNUnv690kxiJiRQZ7lv4iKKrsxMqAfblheJbqesd48,4653
|
|
13
|
-
gismap/gisgraphs/widget.py,sha256=s7W_8N4f2palM0ChVFYyr9ImcQoMBiEw83MIO4HSm6c,4542
|
|
14
|
-
gismap/lab/__init__.py,sha256=ifyZqI9BpC5NRlMfSmJ671tnKWJDoXbo18iDoE-VR1s,181
|
|
15
|
-
gismap/lab/egomap.py,sha256=RabRJSWJ0xrG67l012En0rbi7ukr4R2lR0hc_K7Xp0o,1211
|
|
16
|
-
gismap/lab/expansion.py,sha256=CMUsXqo-shRyb_MiuPRL5-ZgaitxAxjfbSY_fvzi_1E,6236
|
|
17
|
-
gismap/lab/filters.py,sha256=pG_g2POQXMbyUUw0aXOaeyiGBbiSc7M2NzxLCTQrALk,1875
|
|
18
|
-
gismap/lab/lab_author.py,sha256=XwSXvioHDreZWcaWioGW4rjU2zZN10o89ilyfOsWV90,4497
|
|
19
|
-
gismap/lab/labmap.py,sha256=w3dFCyDHM-hEwHEQzrQA8GEOs8juu8F-f18gbufiOe8,5782
|
|
20
|
-
gismap/lab_examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
|
-
gismap/lab_examples/cedric.py,sha256=AjgYy5dhzqh3vDsr9ia_hbtSc9_2Ic238rmJO198FMM,1764
|
|
22
|
-
gismap/lab_examples/lincs.py,sha256=-mIVMGQMrtCtJ3N-oCU8j4Ko9mDuhEPB_pA0gaIw4QA,1126
|
|
23
|
-
gismap/lab_examples/lip6.py,sha256=K32Jqe3-o99QYI--akmwBDFAWKgq0HFEk_psC4akR60,1740
|
|
24
|
-
gismap/lab_examples/toulouse.py,sha256=OUKrK0uefn4uvW74qMsF792un203z3OUfKTquLPGBH4,2091
|
|
25
|
-
gismap/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
-
gismap/sources/dblp.py,sha256=eVd1u09BH-0TgAD3dXn78zsW5Er69mE_vKxPeGDaBw0,4834
|
|
27
|
-
gismap/sources/hal.py,sha256=tZkeDWob4p5fccBRXC10G3kf2rnVAVzwdkf3swjvl0c,10306
|
|
28
|
-
gismap/sources/models.py,sha256=XlNrQWTF-DQbfIFaSLPsgWPN-c79_0rfr_2jDasgukM,713
|
|
29
|
-
gismap/sources/multi.py,sha256=7aiYuExiCoU_5GCwi_ufhesy44HsAh9lNFx_J444YJs,4690
|
|
30
|
-
gismap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
-
gismap/utils/common.py,sha256=nx1f60yNwFpl1oz08h-R5o0xK9CbJv9tmYLDk61dwYA,2898
|
|
32
|
-
gismap/utils/logger.py,sha256=1YALIaNYKTqeIyyCnYxzvZTK7x4FTSfYYl5CP9IMw8E,86
|
|
33
|
-
gismap/utils/requests.py,sha256=nPnTh-lfo8cXiCeEhzZJ2AMo0odDtx4slPN1rTE4H_E,1384
|
|
34
|
-
gismap/utils/text.py,sha256=1_9DlduAYh7Nz-yAg-MaCTmdKbPPmuIY20bb87t7JAQ,3810
|
|
35
|
-
gismap-0.3.0.dist-info/METADATA,sha256=BWpxgm1dncPB8ISiMH95WY_Dyn_AyerfVrHIR6X1VYA,3469
|
|
36
|
-
gismap-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
37
|
-
gismap-0.3.0.dist-info/licenses/AUTHORS.md,sha256=oDR4mptVUBMq0WKIpt19Km1Bdfz3cO2NAOVgwVfTO8g,131
|
|
38
|
-
gismap-0.3.0.dist-info/RECORD,,
|
|
File without changes
|