02-03-2022
Cosa ho fatto
- Novità relative al codice per preparare il multiprocessing:
- Nuove classi RespAgentsCurator e RespAgentsCreator, figlie rispettivamente di Curator e Creator, che si occupano processare solo il campo ‘author’ e di generare solo le triple relative agli agenti responsabili.
- In questo modo non è più necessario cancellare le triple vuote su ruoli di agente e risorse bibliografiche, con relativi problemi di provenance e tempi di esecuzione.
- Inoltre, i contatori relativi a ruoli di gente e risorse bibliografiche non vengono toccati.
- RespAgentsCurator ha molte meno responsabilità di Curator ed è di conseguenza più rapido.
- RespAgentsCurator è stato testato, ****sia in caso di nuovo agente responsabile, che in caso di agente responsabile già esistente sul triplestore. Anche RespAgentsCreator è stato testato.
- Volumi e issues vengono preprocessati da Meta.
Ciò avviene solo se è nota la rivista e la rivista ha un id.
- La rivista può comparire indifferentemente in una riga con “type” uguale a “journal”, “journal article”, “journal issue” o “journal volume”.
In fase di deduplicazione delle riviste vengono deduplicati anche volumi e issues associati, preservando le informazioni di contenimento sulla base del numero sequenziale di volume e issue.
La tabella in input per Meta viene strutturata in modo tale da veicolare tutte le informazioni di contenimento tra issue, volume e rivista.
id title author pub_date venue volume issue page type publisher editor Physical Review B [issn:1095-3795 issn:0163-1829] 65 4 journal issue Physical Review B [issn:1095-3795 issn:0163-1829] 5 journal issue Physical Review B [issn:1095-3795 issn:0163-1829] 2 journal volume issn:1651-2251 issn:0001-6489 Acta Oto-Laryngologica journal - La rivista viene specificata nel campo “venue”, il volume nel campo “volume” e l’issue nel campo “issue”.
- Se un issue è direttamente contenuta nella rivista, il campo “type” ha valore “journal issue” e il campo “volume” è vuoto.
- Se un’issue è compresa dentro un volume, entrambi i campi sono pieni e il campo “type” ha valore “journal issue”.
- Il campo “type” ha valore “journal volume” solo se la riga contiene una rivista, un volume ma non un issue.
- Infine, la rivista ha una sua riga dedicata solo nel caso in cui non siano noti volumi o issue per quella rivista. In tal caso, gli id della rivista compaiono nel campo “id”, il nome del campo “title” e il campo “type” ha valore “journal”.
Corretto un bug in Curator, per cui i campi “volume” e “issue” venivano ignorati nel caso in cui il tipo fosse “journal volume” o “journal issue” (vedere punto 1. della sezione Domande di oggi per approfondire).
Corretto un bug in Creator. Le entità di tipo fabio:JournalIssue venivano create solo se il campo “type” aveva valore “journal article”.
- Ho studiato il caso delle risorse bibliografiche che possono contenerne altre, ovvero le risorse di tipo archival document, book, book part, book section, book series, book set, edited book, monograph, proceedings series, proceedings, reference book, report series, standard series (escludendo journal, journal volume e journal issue di cui al punto 1.b).
- Queste risorse possono comparire nel campo venue per esprimere il loro ruolo di contenitori.
- In pratica, quando ciò avviene, manca quasi sempre l’id, per via di un problema discusso al punto 2 della sezione Domande di oggi.
- Nuove classi RespAgentsCurator e RespAgentsCreator, figlie rispettivamente di Curator e Creator, che si occupano processare solo il campo ‘author’ e di generare solo le triple relative agli agenti responsabili.
Domande
Per qualche motivo Meta cancellava il contenuto dei campi “volume” e “issue” nel caso in cui il tipo fosse “journal volume” o “journal issue”. Era un comportamento voluto? Io l’ho rimosso, perché altrimenti non era possibile preprocessare volumi e issue senza perdere l’informazione sul numero.
Riporto il codice contrassegnando con “Perché?” le righe che cancellavano il contenuto di quei campi.
meta/curator.py at a910d04869345bd7dd4928cd3f276fbbe0973ece · opencitations/meta
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
32def clean_vvi(self, row:Dict[str, str]) -> None:
vol_meta = None
br_id = row['id']
venue = row['venue']
volume = row['volume']
issue = row['issue']
br_type = row['type']
# Venue
if venue:
# [...]
# Volume
if volume and (br_type == 'journal issue' or br_type == 'journal article'):
# [...]
elif volume and br_type == 'journal volume':
row['volume'] = '' # Perché?
row['issue'] = '' # Perché?
vol_meta = br_id
self.volume_issue(vol_meta, self.vvi[metaval]['volume'], volume, row)
# Issue
if issue and br_type == 'journal article':
# [...]
elif issue and br_type == 'journal issue':
row['issue'] = '' # Perché?
issue_meta = br_id
if vol_meta:
self.volume_issue(issue_meta, self.vvi[metaval]['volume'][volume]['issue'], issue, row)
else:
self.volume_issue(issue_meta, self.vvi[metaval]['issue'], issue, row)
else:
row['venue'] = ''
row['volume'] = ''
row['issue'] = ''C’è un problema in crossref_processing, per cui l’id di una venue viene salvato solo in specifiche condizioni, che però non sono sufficienti.
meta/crossref_processing.py at 714de5089087438d820915782edb7491f52379cf · opencitations/meta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18def get_venue_name(self, item:dict, row:dict) -> str:
name_and_id = ''
if 'container-title' in item:
if item['container-title']:
# [...]
venidlist = list()
if 'ISBN' in item:
if row['type'] in {'book chapter', 'book part'}:
self.id_worker(item['ISBN'], venidlist, self.isbn_worker)
if 'ISSN' in item:
if row['type'] in {'journal article', 'journal volume', 'journal issue'}:
self.id_worker(item['ISSN'], venidlist, self.issn_worker)
if venidlist:
name_and_id = ventit + ' [' + ' '.join(venidlist) + ']'
else:
name_and_id = ventit
return name_and_idCome si vede, l’ISSN della venue viene salvato solo se la risorsa è di tipo journal article, journal volume o journal issue. Tuttavia, anche un libro o una monografia possono essere pubblicati da una venue con ISSN.
Occorre definire, per tutti i tipi di risorsa bibliografica, quali sono gli id della venue ammissibili.
Ecco le mie proposte di ampliamento (in maiuscolo le novità e tra parentesi il tipo di contenitore):
- L’ISSN è ammesso come id della venue per risorse di tipo:
- book (book series, book set)
- proceedings (proceedings series → series)
- ~~proceedings article (proceedings)~~
- reference book (book series, book set),
- reference entry (journal)
- 10.1002/0471140856.tx1702s18 (reference-entry) in 1934-9262 (journal)
- report (report series → series)
- journal article (journal)
- journal issue (journal)
- journal volume (journal)
- Non ho considerato ‘edited book’ e ‘monograph’ perché Meta li trasforma in book. Allo stesso modo, Meta trasforma ‘report series’, ‘standard series’ e ‘proceedings series’ in ‘series’.
- L**’ISBN** è ammesso come id della venue per risorse di tipo:
- book section (book)
- book chapter (book)
- book part (book)
- book track (book)
- reference entry (reference book)
- L’ISSN è ammesso come id della venue per risorse di tipo:
Le risorse di tipo report-series (che Meta semplifica in series) sono un caso strano, perché possono essere contenute in un’altra risorsa di tipo report-series, quindi l’ISSN si può riferire sia al contenitore che al contenuto.
Ad esempio, la risorsa Teaching Strategies for Instructional Quality è una risorsa di tipo report-series contenuta dentro OECD Education Working Papers, che è a sua volta una report-series. L’ISSN riportato da Crossref in questo caso si riferisce al contenitore, ma Meta lo processa come se fosse riferito al contenuto, introducendo un errore.
Allo stesso modo, esiste la risorsa OECD Education Working Papers di tipo report-series, in cui l’ISSN si riferisce alla risorsa stessa e non al contenitore.
Restano fuori le risorse di tipo standard, dissertation, peer review e dataset, per le quali non è prevista una venue.
Anche per quanto riguarda gli schemi ammessi per gli identificativi delle risorse crossref_processing è tropppo restrittivo:
meta/crossref_processing.py at 714de5089087438d820915782edb7491f52379cf · opencitations/meta
1
2
3
4
5
6if 'ISBN' in x:
if row['type'] in {'book', 'monograph', 'edited book'}:
self.id_worker(x['ISBN'], idlist, self.isbn_worker)
if 'ISSN' in x:
if row['type'] in {'journal', 'series', 'report series', 'standard series'}:
self.id_worker(x['ISSN'], idlist, self.issn_worker)L’ISBN è ammesso solo per risorse di tipo book, monograph ed edited book, mentre l’ISSN solo per risorse di tipo journal, series, report series e standard series.
Propongo i seguenti apliamenti, evidenziando in grassetto le novità:
- L**’ISSN** è ammesso come schema dell’identificativo per risorse bibliografiche di tipo:
- book series
- book set
- journal
- proceedings series
- report series
- series
- standard series
- L’ISBN è ammesso come schema dell’identificativo per risorse bibliografiche di tipo:
- book
- dissertation (e.g. ****https://doi.org/10.14201/0VI0441)
- edited book
- monograph
- reference book
- report (e.g. 10.14264/99aee1d)
- standard (e.g. 10.1109/IEEESTD.2014.6849907)
- Non è previsto né ISBN né ISSN per le risorse di tipo:
- book-chapter
- book-part
- book-section
- book-track
- component
- dataset
- journal-article
- journal-issue
- journal-volume
- other
- peer-review
- posted-content
proceedings- proceedings-article
- reference-entry
- L**’ISSN** è ammesso come schema dell’identificativo per risorse bibliografiche di tipo: