# %% import sqlite3 import pandas as pd import dtale import unicodedata from simple_query_test_pandas import ricercaforme, ricercalemmi, ricercaformelemmi, ricercalemmiforme, ricercacatgr, interpreter # %% funzione ricerca tabelle occorrenziari def get_tables_occ(path): conn = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True) cursor = conn.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") table_names = cursor.fetchall() occ_tables = [table[0] for table in table_names if table[0].startswith('Occ')] cursor.close() conn.close() return occ_tables #%% 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 o categoria grammaticale, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate") def findtexts(type, df, listOcc, path, 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"]) con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True) for table in listOcc: strlist = ",".join(str(c) for c in codlist) if type == 0: Query = f"SELECT tab.cod, tab.ntx, tab.pitxt, tab.elemlen, tab.mappa, tab.numperiod, tab.links, tab.numorg, intbib.sigla, tab.vol, tab.pag, tab.riga, tab.col, tab.tipostanza, tab.stanza, tab.verso, tab.numbrano, lem.spec AS lemma, lem.cat AS cat_gr, lem.omo AS disambiguatore FROM {table} AS tab INNER JOIN intbib ON tab.ntx = intbib.ntx INNER JOIN lem ON tab.indlem = lem.cod WHERE tab.cod IN ({strlist})" extendequeryReponse = pd.read_sql(Query, con) textlist = pd.concat([textlist, extendequeryReponse]) elif type == 1: Query = f"SELECT tab.cod, tab.ntx, tab.pitxt, tab.elemlen, tab.mappa, tab.numperiod, tab.links, tab.numorg, intbib.sigla, tab.vol, tab.pag, tab.riga, tab.col, tab.tipostanza, tab.stanza, tab.verso, tab.numbrano, lem.spec AS lemma, lem.cat AS cat_gr, lem.omo AS disambiguatore FROM {table} AS tab INNER JOIN intbib ON tab.ntx = intbib.ntx INNER JOIN lem ON tab.indlem = lem.cod WHERE tab.indlem IN ({strlist})" extendequeryReponse = pd.read_sql(Query, con) textlist = pd.concat([textlist, extendequeryReponse]) elif type == 2: subquery = f"SELECT DISTINCT lemma, forma FROM pfl WHERE lemma IN ({strlist})" subdf = pd.read_sql(subquery, con) formcodlist = list(subdf["forma"]) strform = ",".join(str(c) for c in formcodlist) Query = f"SELECT tab.cod, tab.ntx, tab.pitxt, tab.elemlen, tab.mappa, tab.numperiod, tab.links, tab.numorg, intbib.sigla, tab.vol, tab.pag, tab.riga, tab.col, tab.tipostanza, tab.stanza, tab.verso, tab.numbrano, lem.spec AS lemma, lem.cat AS cat_gr, lem.omo AS disambiguatore FROM {table} AS tab INNER JOIN intbib ON tab.ntx = intbib.ntx INNER JOIN lem ON tab.indlem = lem.cod WHERE tab.indlem IN ({strlist}) OR (tab.indlem = 0 AND tab.cod IN ({strform}))" extendequeryReponse = pd.read_sql(Query, con) 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(textlist, listOcc, path): contexts = [] ampiezzacontesto = 31 con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True) for ind, row in textlist.iterrows(): pitxtLocal = row["pitxt"] sigla = row["sigla"] periodlocal = row["numperiod"] ntxlocal = row["ntx"] mappalocal = row["mappa"] pointerlist = pd.DataFrame() for table in listOcc: query = f"SELECT tab.pitxt, tab.elemlen FROM {table} AS tab WHERE tab.ntx = {ntxlocal} AND tab.mappa <= {mappalocal+int(ampiezzacontesto/2)} AND tab.mappa >= {mappalocal-int(ampiezzacontesto/2)}" queryresponse = pd.read_sql(query, con) pointerlist = pd.concat([pointerlist, queryresponse]) with open(f"{path}/itxt/{sigla}", 'r', encoding="utf-32-le") as file1: file1.seek(4*pointerlist["pitxt"].min()) cont = file1.read(pointerlist["pitxt"].max()-pointerlist["pitxt"].min()) 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(contexts, path): infobib = pd.DataFrame() rif_org = pd.DataFrame() con = sqlite3.connect(f"file:{path}/bibliografia/BiblioTLIO.db?mode=ro", uri=True) con2 = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True) for ind, row in contexts.iterrows(): Query = f"SELECT [Anno iniziale], [Anno finale], [Data codificata], [Titolo Abbreviato], [Autore], [Titolo], [Curatore], [Data descrittiva], [Area generica], [Area specifica], [Genere], [Forma], [Tipo], IQ FROM datibib WHERE Sigla='{row['sigla']}'" bib = pd.read_sql(Query, con) infobib = pd.concat([infobib, bib]) Query2 = f"SELECT head AS Rif_organico, full AS Rif_completo FROM org WHERE (indice='{row['numorg']}' AND ntx='{row['ntx']}')" rif = pd.read_sql(Query2, con2) 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 da evidenziare def highlight (bibliocontexts, path): index = 0 con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True) for col in bibliocontexts.columns: forme = [] if col.startswith('cod'): for ind, row in bibliocontexts.iterrows(): Query = f"SELECT spec FROM form WHERE cod={row[col]}" query_answer = pd.read_sql(Query, con) forme += list(query_answer['spec']) if index == 0: bibliocontexts['highlight'] = forme else: bibliocontexts['highlight'+str(index)] = forme index += 1 return bibliocontexts #funzione contesti multipli def contestimultipli (tipo_ricerca, ricerca, listOcc, path): textlist = findtexts(tipo_ricerca, ricerca, listOcc, path) contexts = findcontexts (textlist,listOcc, path) bibliocontexts = findbib (contexts, path) highlights = highlight(bibliocontexts, path) return highlights # %% path = "/Users/leonardocanova/Library/CloudStorage/OneDrive-ConsiglioNazionaledelleRicerche/TIGRO/Ricerche/db/first_db" listOcc = get_tables_occ(path) entry = "mezzo" tiporicerca= 1 # (0 per forme, 1 per lemmi o categoria grammaticale, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate") ricerca=ricercalemmi(interpreter(entry), path, 1, 0) contesti = contestimultipli(tiporicerca, ricerca, listOcc, path) dtale.show(contesti) # %%