123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- #%%
- from .parsing_utilities import interpreter, inizialeraddoppiata, list_normalize
- # Basic data provider class; can be instantiated to handle different kinds
- # of data-providing connections or interfaces based on config options
- from .data_interface.data_providers_setup import queryHandlerFactory
- import pandas as pd
- # Main class for basic queries contains:
- # - a data provider instance
- # - methods to submit queries to the data provider instance
- class basicQueries:
- def __init__(self, dataConfig):
- self.queryHandler = queryHandlerFactory(dataConfig)
- self.listOcc = dataConfig.get('listOcc')
- # Prepares and sends query OBJECTS which will be processed by the data provider
- def sendBasicQuery(self, text, queryType, espansa, raddoppiata, pandas=False, dbFile=None):
-
- entries = interpreter(text)
-
- data = entries
- dataNorm = []
- if raddoppiata==1:
- data = entries + inizialeraddoppiata(entries)
- if espansa==1 and raddoppiata==0:
- dataNorm = list_normalize(entries)
- elif espansa==1 and raddoppiata==1:
- dataNorm = entries + list_normalize(inizialeraddoppiata(entries))
- return self.queryHandler.query({'data': data, 'dataNorm': dataNorm, 'queryType': queryType}, pandas, dbFile)
-
- #%% ha in input le funzioni di ricerca, cerca nell'occorrenziario i puntatori ai contesti e altri elementi ad essi associati.
- #l'attributo type definisce il tipo di ricerca in input (0 per forme, 1 per lemmi, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate")
- def findtexts(self, type, df, index = None):
- if index is None:
- df = pd.DataFrame(df)
- else:
- if isinstance(index, range):
- index = list(index)
- elif not isinstance(index, list):
- index = [index]
- df = pd.DataFrame(df.loc[index])
- textlist = pd.DataFrame()
- codList = list(df["cod"])
- listOcc = self.listOcc
-
- queryData = {'queryType': 'texts', 'querySubtype': type, 'codList': codList}
- for table in listOcc:
- queryData['table'] = table
- if type==2:
- subQueryData = {'queryType': 'pfl', 'codList': codList}
- subdf = self.queryHandler.query(subQueryData, pandas=True)
- queryData['formCodList'] = list(subdf['codForma'])
- extendequeryReponse = self.queryHandler.query(queryData, pandas=True)
- textlist = pd.concat([textlist, extendequeryReponse])
- return textlist
- # %% ha in input findtexts, restituisce i contesti associati agli elementi localizzati.
- # Il range dei contesti è impostato di default a 30 parole e può essere rimodulato nel passaggio al contesto singolo.
- def findcontexts(self, textlist):
- parole = 31
- listOcc = self.listOcc
- contexts = []
- for ind, row in textlist.iterrows():
- sigla = row["sigla"]
- queryData = {'queryType': 'contexts', 'ntxlocal': row["ntx"], 'mappalocal': row['mappa'], 'parole': parole}
- pointerlist = pd.DataFrame()
- for table in listOcc:
- queryData['table'] = table
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- pointerlist = pd.concat([pointerlist, queryresponse])
- fileQueryData = {'sigla': sigla, 'minChar': pointerlist["pitxt"].min(), 'maxChar': pointerlist["pitxt"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- contexts.append(cont)
- textlist['contesto'] = contexts
- return (textlist.reset_index(drop=True))
- # %% Ha in input findcontexts, associa i riferimenti bibliografici ad ogni contesto.
- def findbib(self, contexts):
- infobib = pd.DataFrame()
- rif_org = pd.DataFrame()
- for ind, row in contexts.iterrows():
- queryData = {'queryType': 'bib', 'row': row}
- bib = self.queryHandler.query(queryData, pandas=True, dbFile='bibliografia/BiblioTLIO.db')
- infobib = pd.concat([infobib, bib])
- queryData = {'queryType': 'rif', 'row': row}
- rif = self.queryHandler.query(queryData, pandas=True)
- rif_org = pd.concat([rif_org, rif])
- annoiniz = list(infobib['Anno iniziale'])
- annofin = list(infobib['Anno finale'])
- datacod = list(infobib['Data codificata'])
- datadesc = list(infobib['Data descrittiva'])
- titoloabb = list(infobib['Titolo Abbreviato'])
- autore = list(infobib['Autore'])
- titolo = list(infobib['Titolo'])
- curatore = list(infobib['Curatore'])
- areagen = list(infobib['Area generica'])
- areaspec = list(infobib['Area specifica'])
- genere = list(infobib['Genere'])
- forma = list(infobib['Forma'])
- tipo = list(infobib['Tipo'])
- iq = list(infobib['IQ'])
- rif1 = list(rif_org['Rif_organico'])
- rif2 = list(rif_org['Rif_completo'])
- contexts['Anno iniziale'] = annoiniz
- contexts['Anno finale'] = annofin
- contexts['Data codificata'] = datacod
- contexts['Data descrittiva'] = datadesc
- contexts['Autore'] = autore
- contexts['Titolo Abbreviato'] = titoloabb
- contexts['Titolo'] = titolo
- contexts['Curatore'] = curatore
- contexts['Area generica'] = areagen
- contexts['Area specifica'] = areaspec
- contexts['Genere'] = genere
- contexts['Forma'] = forma
- contexts['Tipo'] = tipo
- contexts ['IQ'] = iq
- contexts['Rif_organico'] = rif1
- contexts['Rig_completo'] = rif2
- contexts.pag = contexts.pag.astype(int)
- chrono = contexts.sort_values(by=['Anno iniziale', 'Rif_organico', 'pag'])
- cols = ['links','Titolo Abbreviato', 'Rif_organico', 'tipostanza', 'stanza', 'verso', 'pag', 'riga', 'IQ', 'lemma', 'cat_gr', 'disambiguatore', 'contesto', 'Autore', 'Titolo', 'Anno iniziale', 'Anno finale', 'Data codificata', 'Data descrittiva', 'Area generica', 'Area specifica', 'Genere', 'Forma', 'Tipo', 'Curatore', 'ntx', 'pitxt', 'elemlen', 'mappa', 'numperiod', 'numorg', 'sigla', 'vol', 'col', 'numbrano', 'Rig_completo', 'cod']
- clean_df = chrono.reindex(columns=cols + list(chrono.columns.difference(cols)))
- return (clean_df.reset_index(drop=True))
-
- #%% funzione stringa/stringhe da evidenziare
- def highlight (self, bibliocontexts):
- index = 0
- for col in bibliocontexts.columns:
- forme = []
- if col.startswith('cod'):
- for ind, row in bibliocontexts.iterrows():
- queryData = {'queryType': 'highlight', 'row': row, 'col': col}
- forma = self.queryHandler.query(queryData, pandas=True)
- forme += list(forma['highlight'])
- if index == 0:
- bibliocontexts['highlight'] = forme
- else:
- bibliocontexts['highlight'+str(index)] = forme
- index += 1
- highlight_cols = bibliocontexts.filter(regex='^highlight')
- create_array = lambda row: highlight_cols.loc[row.name].values.tolist()
- bibliocontexts['highlights_combined'] = highlight_cols.apply(create_array, axis=1)
- return bibliocontexts
- #%% funzione contesti multipli cumulativa
- def contestimultipli (self, tipo_ricerca, ricerca, index = None):
- ricercadf = pd.DataFrame(ricerca)
- textlist = self.findtexts(tipo_ricerca, ricercadf, index)
- contexts = self.findcontexts (textlist)
- bibliocontexts = self.findbib (contexts)
- highlights = self.highlight(bibliocontexts)
- return highlights.to_dict(orient='records')
-
- #%% funzione reperimento e raffinamento contesti singoli
- def singlecontexts(self, textlist, index, parole, periodi, brani):
- context = textlist.iloc[index]
- contexts = []
- formats = []
- listOcc = self.listOcc
- sigla = textlist.loc[index, "sigla"]
- periodlocal = textlist.loc[index, "numperiod"]
- ntxlocal = textlist.loc[index, "ntx"]
- mappalocal = textlist.loc[index, "mappa"]
- linkslocal = textlist.loc[index, "links"]
- numbranolocal = textlist.loc[index, "numbrano"]
- if parole != 0:
- pointerlist = pd.DataFrame()
- for table in listOcc:
- print(listOcc)
- queryData = {'queryType': 'singlecontext', 'querySubtype': 'parole', 'parole': parole, 'periodi': periodi, 'brani': brani, 'table': table, 'ntxlocal': ntxlocal, 'mappalocal': mappalocal, 'periodlocal': periodlocal, 'numbranolocal': numbranolocal}
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- pointerlist = pd.concat([pointerlist, queryresponse])
- print(pointerlist)
- fileQueryData = {'sigla': sigla, 'minChar': pointerlist["pitxt"].min(), 'maxChar': pointerlist["pitxt"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- contexts.append(cont)
- form = self.queryHandler.formatQuery(fileQueryData)
- formats.append(form)
- context ['piniz'] = pointerlist["pitxt"].min()
- context ['pfin'] = pointerlist["pitxt"].max()
- elif periodi != 0:
- queryData = {'queryType': 'singlecontext', 'querySubtype': 'parole', 'parole': parole, 'periodi': periodi, 'brani': brani, 'table': table, 'ntxlocal': ntxlocal, 'mappalocal': mappalocal, 'periodlocal': periodlocal, 'numbranolocal': numbranolocal}
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- fileQueryData = {'sigla': sigla, 'minChar': pointerlist["pitxt"].min(), 'maxChar': pointerlist["pitxt"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- contexts.append(cont)
- form = self.queryHandler.formatQuery(fileQueryData)
- formats.append(form)
- context ['piniz'] = queryresponse["piniz"].min()
- context ['pfin'] = queryresponse["pfin"].max()
- elif brani != 0:
- if linkslocal == 0 or linkslocal == 1:
- return "Nessun brano associato a questo contesto"
- else:
- queryData = {'queryType': 'singlecontext', 'querySubtype': 'brani', 'parole': parole, 'periodi': periodi, 'brani': brani, 'table': table, 'ntxlocal': ntxlocal, 'mappalocal': mappalocal, 'periodlocal': periodlocal, 'numbranolocal': numbranolocal}
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- fileQueryData = {'sigla': sigla, 'minChar': pointerlist["pitxt"].min(), 'maxChar': pointerlist["pitxt"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- contexts.append(cont)
- form = self.queryHandler.formatQuery(fileQueryData)
- formats.append(form)
- context ['piniz'] = queryresponse["piniz"].min()
- context ['pfin'] = queryresponse["pfin"].max()
- context['contesto'] = contexts [0]
- context['formattazione'] = formats
- return pd.DataFrame(context).T.reset_index(drop=True)
-
- #%% funzione reperimento note e brani associati
- def findlinks (self, context):
- linkslocal = context.loc[0, "links"]
- siglalocal = context.loc[0, "sigla"]
- ntxlocal = context.loc[0, "ntx"]
- pitxtlocal = context.loc[0, "pitxt"]
- pinizlocal = context.loc[0, "piniz"]
- pfinlocal = context.loc[0, "pfin"]
- if linkslocal == 0:
- return context
- if linkslocal == 1:
- queryData = {'queryType': 'links', 'querySubtype': 'nota', 'ntxlocal': ntxlocal, 'pinizlocal': pinizlocal, 'pitxtlocal': pitxtlocal, 'pfinlocal': pfinlocal}
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- fileQueryData = {'sigla': siglalocal, 'minChar': queryresponse["piniz"].min(), 'maxChar': queryresponse["pfin"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- context['nota'] = cont
- return context
- if linkslocal == 2:
- queryData = {'queryType': 'links', 'querySubtype': 'testo_associato', 'ntxlocal': ntxlocal, 'pinizlocal': pinizlocal, 'pitxtlocal': pitxtlocal, 'pfinlocal': pfinlocal}
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- fileQueryData = {'sigla': siglalocal, 'minChar': queryresponse["piniz"].min(), 'maxChar': queryresponse["pfin"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- context['testo associato'] = cont
- if linkslocal == 3:
- queryData = {'queryType': 'links', 'querySubtype': 'nota', 'ntxlocal': ntxlocal, 'pinizlocal': pinizlocal, 'pitxtlocal': pitxtlocal, 'pfinlocal': pfinlocal}
- queryresponse = self.queryHandler.query(queryData, pandas=True)
- fileQueryData = {'sigla': siglalocal, 'minChar': queryresponse["piniz"].min(), 'maxChar': queryresponse["pfin"].max()}
- cont = self.queryHandler.textQuery(fileQueryData)
- context['nota'] = cont
- queryData2 = {'queryType': 'links', 'querySubtype': 'testo_associato', 'ntxlocal': ntxlocal, 'pinizlocal': pinizlocal, 'pitxtlocal': pitxtlocal, 'pfinlocal': pfinlocal}
- queryresponse2 = self.queryHandler.query(queryData2, pandas=True)
- fileQueryData2 = {'sigla': siglalocal, 'minChar': queryresponse2["piniz"].min(), 'maxChar': queryresponse2["pfin"].max()}
- cont2 = self.queryHandler.textQuery(fileQueryData2)
- context['testo associato'] = cont2
- return context
-
- #%% funzione contesti singoli cumulativa
- def contestosingolo (self, contestimultipli, indice, parole, periodi, brani):
- contestimultiplidf = pd.DataFrame(contestimultipli)
- print(contestimultiplidf)
- contestosingolo = self.singlecontexts(contestimultiplidf, indice, parole, periodi, brani)
- braniassociati = self.findlinks(contestosingolo)
- contestosingoloclean = self.findbib (braniassociati)
- return contestosingoloclean.to_dict(orient='records')
|