123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- # %%
- 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():
- 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())
- file_contents = file1.read()
- cont = file_contents[pointerlist["pitxt"].min():pointerlist["pitxt"].max()]
- print (cont)
- 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)
- #textlist = findtexts(1, ricerca, listOcc, path)
- contesti = contestimultipli(tiporicerca, ricerca, listOcc, path)
- dtale.show(contesti)
- # %%
|