SAGT 2026#
GisMap can be used to analyse not only labs but also conferences. This is illustrated on the SAGT 2026 conference: https://www.uni-augsburg.de/de/fakultaet/fai/conferences/sagt-2026/
Data retrieval#
As SAGT is an international Computer Science conference, we select only LDB, the local DBLP mirror.
[1]:
from gismap.lab_examples.sagt_2026 import SAGT
from gismap.utils.logger import logger
import logging
logger.setLevel(logging.ERROR)
[2]:
sagt = SAGT(dbs="ldb")
sagt.update_authors()
sagt.update_publis()
sagt.expand(target=10)
Collaboration graph#
We can now display the interactive collaboration graph. We can pimp the display a bit:
[3]:
from collections import Counter
groups = {
"PC": {"display": "Programme committee", "color": "rgb(90, 140, 200)"},
"Author": {"display": "SAGT authors", "color": "rgb(230, 145, 60)"},
"Other": {"display": "Invited and tutorial", "color": "rgb(175, 130, 190)"},
}
g_l = Counter(a.metadata.group for a in sagt.authors.values())
for g in groups:
groups[g]["display_alt"] = f"{g_l[g]} people"
sagt.show_html(groups=groups)
Keywords#
Let us compare the PC keywords to the author keywords. We manually remove a few additional words that are common in the SAGT community.
[4]:
from IPython.display import display
from gismap.gismo import sw
gismo = sagt.gismo_lab(stop_words=sw+["networks", "problems", "algorithms", "games", "functions", "problem"])
[5]:
display(sagt.wordcloud(group="Author", gismo_lab=gismo))
[6]:
display(sagt.wordcloud(group="PC", gismo_lab=gismo))
The keywords can also be retrieved as ranked lists, e.g. to reuse them outside the notebook:
[7]:
pc = sagt.keywords(group="PC", gismo_lab=gismo)
aut = sagt.keywords(group="Author", gismo_lab=gismo)
{"pc": [w for w, _ in pc[:10]], "accepted": [w for w, _ in aut[:10]]}
[7]:
{'pc': ['mechanism design',
'facility location',
'pricing',
'elections',
'complexity',
'graphs',
'matchings',
'equilibrium',
'dynamics',
'network'],
'accepted': ['facility location',
'fair division',
'equilibrium',
'learning',
'mechanisms',
'pricing',
'complexity',
'matching',
'convex',
'scheduling']}
Homonyms#
Many participants have common names that match several DBLP entries, e.g. Bo Li or Jie Zhang. Without help, GisMap keeps all the candidates, so the publications of unrelated homonyms get merged. The SAGT class ships an overrides dictionary that pins the right entry for each of them.
These overrides were obtained semi-automatically with propose_overrides(), which ranks the candidates of each ambiguous name by the number of co-authors they share with the rest of the conference, and proposes the ones that stand out. Let us replay it on a conference built without the overrides (update_authors warns about the ambiguous names):
[8]:
from gismap.lab_examples.sagt_2026 import overrides
class RawSAGT(SAGT):
overrides = {}
raw = RawSAGT(dbs="ldb")
logger.setLevel(logging.WARNING)
raw.update_authors()
proposals = raw.propose_overrides()
print(proposals)
WARNING:GisMap:25 author(s) match several entries of the same database, so homonyms may be merged: Jie Zhang (185), Bo Li (181), Tao Lin (27), Hanrui Zhang (10), Lukas Graf (5), and 20 more. Run propose_overrides() to disambiguate.
=== 25 ambiguous author(s), 20 proposal(s) ===
Angelo Fanelli: propose ldb:70/4474, no_auto (2 candidates)
ldb:70/4474: 5 shared / 25 co-authors
Yiding Feng: propose ldb:207/4923, no_auto (2 candidates)
ldb:207/4923: 1 shared / 34 co-authors
Dimitris Fotakis: propose ldb:95/4731, no_auto (3 candidates)
ldb:95/4731: 6 shared / 159 co-authors
Paul Goldberg: propose ldb:81/760, no_auto (2 candidates)
ldb:81/760: 17 shared / 118 co-authors
Lukas Graf: undecided (5 candidates)
Anthony Kim: undecided (2 candidates)
Bo Li: propose ldb:50/3402-37, no_auto (181 candidates, 2 discarded)
ldb:50/3402-37: 6 shared / 130 co-authors
ldb:50/3402-115: 1 shared / 105 co-authors
ldb:50/3402-23: 1 shared / 74 co-authors
Minming Li: propose ldb:78/6881, no_auto (2 candidates)
ldb:78/6881: 6 shared / 264 co-authors
ldb:427/0765: 1 shared / 1 co-authors
Tao Lin: undecided (27 candidates)
David Manlove: propose ldb:m/DManlove, no_auto (2 candidates)
ldb:m/DManlove: 4 shared / 107 co-authors
ldb:434/7633: 2 shared / 4 co-authors
Evangelos Markakis: propose ldb:m/EvangelosMarkakis, no_auto (2 candidates)
ldb:m/EvangelosMarkakis: 18 shared / 150 co-authors
Doron Ravid: undecided (2 candidates)
Daniel Schoepflin: propose ldb:256/1650, no_auto (2 candidates)
ldb:256/1650: 1 shared / 23 co-authors
Marc Schröder: propose ldb:88/4000-2, no_auto (5 candidates)
ldb:88/4000-2: 5 shared / 28 co-authors
Jie Zhang: propose ldb:84/6889-8, no_auto (185 candidates, 1 discarded)
ldb:84/6889-8: 5 shared / 88 co-authors
ldb:84/6889-73: 1 shared / 331 co-authors
ldb:84/6889-81: 1 shared / 119 co-authors
ldb:84/6889-39: 1 shared / 65 co-authors
ldb:84/6889-56: 1 shared / 42 co-authors
Hanrui Zhang: propose ldb:168/8847, ldb:168/8847-7, no_auto (10 candidates)
ldb:168/8847: 1 shared / 58 co-authors
ldb:168/8847-7: 1 shared / 11 co-authors
Daniel Ebert: propose ldb:50/9773, no_auto (2 candidates)
ldb:50/9773: 1 shared / 6 co-authors
Dimitar Chakarov: propose ldb:73/7318, no_auto (2 candidates)
ldb:73/7318: 3 shared / 13 co-authors
Jiehua Chen: propose ldb:72/4415-1, no_auto (5 candidates)
ldb:72/4415-1: 5 shared / 80 co-authors
Kui-Wang Choi: undecided (2 candidates)
ldb:440/1298: 1 shared / 1 co-authors
ldb:427/0071: 1 shared / 1 co-authors
Pallavi Jain: propose ldb:136/4807, no_auto (4 candidates)
ldb:136/4807: 3 shared / 52 co-authors
Rafael Gomes: propose ldb:145/7313, no_auto (3 candidates)
ldb:145/7313: 3 shared / 8 co-authors
Sanjukta Roy: propose ldb:178/2824, no_auto (2 candidates)
ldb:178/2824: 8 shared / 42 co-authors
Terrence Adams: propose ldb:157/8440, no_auto (2 candidates)
ldb:157/8440: 1 shared / 7 co-authors
Zeyuan Hu: propose ldb:213/7556-1, no_auto (5 candidates)
ldb:213/7556-1: 1 shared / 7 co-authors
Proposals only cover the names where a candidate stands out; the undecided ones were settled by hand. Compare with the shipped overrides:
[9]:
proposed = proposals.to_dict()
same = [n for n, spec in proposed.items() if overrides.get(n) == spec]
print(f"{len(proposed)} proposals, {len(same)} identical to the shipped overrides.")
print("Differences:", {n: (spec, overrides.get(n)) for n, spec in proposed.items() if n not in same})
print("Undecided:", proposals.undecided)
20 proposals, 19 identical to the shipped overrides.
Differences: {'Hanrui Zhang': ('ldb:168/8847, ldb:168/8847-7, no_auto', 'ldb:168/8847, no_auto')}
Undecided: ['Lukas Graf', 'Anthony Kim', 'Tao Lin', 'Doron Ravid', 'Kui-Wang Choi']