123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- # %%
- import csv
- import sqlite3
- import pandas as pd
- import dtale
- import unicodedata
- import sys
- import random
- # %%
- # encoding/decoding functions for db
- # %% funzione decodifica
- def db_decode(string):
- res = ""
- with open("vettSpec.csv", 'r') as file1:
- reader = csv.DictReader(file1)
- vettSpec = [row for row in reader]
- for c in string:
- char_code = int.from_bytes(c.encode("utf-32-le"), 'little', signed=False)
- found = next((el['unicode'] for el in vettSpec if int(el['intcode']) == char_code), "")
- res += chr(int(found, 16))
- return res
- #%% funzione codifica
- def db_encode(string):
- encoded_string = ""
- with open("vettSpec.csv", 'r') as file1:
- reader = csv.DictReader(file1)
- vettSpec = [row for row in reader]
- for char in string:
- post = next((el['intcode'] for el in vettSpec if el['unicode'] == char.encode("utf-32-be").hex().lstrip('0').upper()), None)
- byteini = int.to_bytes(int(post), 4, byteorder='little')
- encoded_string += byteini.decode('utf-32-le')
- return encoded_string
- #%% funzione combinazioni (gestione <>)
- def combinations(s):
- result = []
- start = s.find("˴")
- end = s.find("˶")
- if start == -1 or end == -1:
- return [s]
- items = s[start + 1:end].split("Ñ")
- for item in items:
- result.extend([s[:start] + item + rest for rest in combinations(s[end + 1:])])
- return result
- #%% funzione interprete (chiama le funzioni precedenti e sostituisce i caratteri jolly non standard)
- def interpreter (data):
- encoded_data = db_encode(data)
- clean_data= "'"+encoded_data.replace("˯", "%").replace("Ò", "_")+"'"
- return combinations(clean_data)
- #%% raddoppia l'iniziale della stringa in ingresso (se non è un carattere jolly)
- def inizialeraddoppiata (data):
- doubleddata=[]
- for el in data:
- if el[1] != "%" and "_":
- doubleddata = doubleddata + ["'"+ el[1] + el[1:]]
- return doubleddata
- #%% normalizza la stringa di testo togliendo i diacritici
- def str_normalize(string):
- normalized_string = ""
- with open("atab.csv", 'r') as file1:
- reader = csv.DictReader(file1)
- atab = [row for row in reader]
- for c in string:
- char_code = int.from_bytes(c.encode("utf-32-le"), 'little', signed=False)
- found = next((el['norm'] for el in atab if int(el['spec']) == char_code), None)
- pre = found if found else ""
- byteini = int.to_bytes(int(pre), 4, byteorder='little')
- normalized_string += byteini.decode('utf-32-le')
- return normalized_string
- #%% applica la normalizzazione a una lista di stringhe
- def list_normalize(lista):
- return ["'" + str_normalize(stringa.strip("'")) + "'" for stringa in lista]
- def db_results_decode (df):
- columns = ['forma', 'lemma', 'cat_gr', 'disambiguatore']
- for col in df.columns:
- if col in columns or col.startswith('highlight'):
- df[col] = df[col].apply(db_decode)
- #df = df.applymap(lambda x: db_decode(x) if type(x) == str else x)
- return df
- #%% funzione lista tabelle occorrenziario
- def get_tables_occ(path):
- conn = sqlite3.connect(f"file:{path}/corpus.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
- #funzione contatore risultati
- def counter (results):
- if not results.empty:
- trovati= len(results.index)
- occorrenze= results['occ'].sum()
- return ("Trovati=" + str(trovati) + " Occorrenze=" + str(occorrenze))
-
- #%% funzioni test
- def ricercaforme (entries, path, espansa, raddoppiata):
- if espansa == 0:
- data=" OR spec LIKE ".join(entries)
- doubleddata=" OR spec LIKE ".join(inizialeraddoppiata(entries))
-
- if raddoppiata == 1:
- theSimpleQuery = f"SELECT spec AS forma, nocc AS occ, cod FROM form WHERE spec LIKE {data} OR spec LIKE {doubleddata} ORDER BY idfor"
- else:
- theSimpleQuery = f"SELECT spec AS forma, nocc AS occ, cod FROM form WHERE spec LIKE {data} ORDER BY idfor"
- con = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- answer_table = pd.read_sql(theSimpleQuery, con)
- if answer_table.empty:
- print ("Nessun risultato")
- sys.exit(1)
- else:
- return answer_table
- else:
- data=" OR spec LIKE ".join(entries)
- data_norm=" OR norm LIKE ".join(list_normalize(entries))
- doubleddata_norm=" OR norm LIKE ".join(list_normalize(inizialeraddoppiata(entries)))
- doubleddata=" OR spec LIKE ".join(inizialeraddoppiata(entries))
- if raddoppiata == 1:
- theSimpleQuery = f"SELECT DISTINCT spec AS forma, nocc AS occ, cod FROM form WHERE (spec LIKE {data}) OR (norm LIKE {data_norm}) OR (spec LIKE {doubleddata}) OR (norm LIKE {doubleddata_norm}) ORDER BY idfor"
- else:
- theSimpleQuery = f"SELECT DISTINCT spec AS forma, nocc AS occ, cod FROM form WHERE (spec LIKE {data}) OR (norm LIKE {data_norm}) ORDER BY idfor"
- con = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- answer_table = pd.read_sql(theSimpleQuery, con)
- if answer_table.empty:
- print ("Nessun risultato")
- sys.exit(1)
- else:
- return answer_table
- 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}/corpus.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
- def findcontexts(textlist, listOcc, path):
- contexts = []
- ampiezzacontesto = 31
- con = sqlite3.connect(f"file:{path}/corpus.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())
- def findbib(contexts, path):
- infobib = pd.DataFrame()
- rif_org = pd.DataFrame()
- for ind, row in contexts.iterrows():
- con = sqlite3.connect(f"file:{path}/bibliografia/BiblioTLIO.db", uri=True)
- 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])
- con2 = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- 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', 'cod', 'ntx', 'pitxt', 'elemlen', 'mappa', 'numperiod', 'numorg', 'sigla', 'vol', 'col', 'numbrano', 'Rig_completo']
- clean_df = chrono[cols].reset_index()
- return clean_df
- def highlight (bibliocontexts, path):
- index = 0
- con = sqlite3.connect(f"file:{path}/corpus.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
- 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
- def singlecontexts(textlist, index, parole, periodi, brani, listOcc, path):
- context = textlist.iloc[index]
- contexts = []
- formats = []
- con = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- 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"]
- if parole != 0:
- 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(parole/2)} AND tab.mappa >= {mappalocal-int(parole/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)
- with open(f"{path}/ftxt/{sigla}", 'rb') as file1:
- file1.seek(pointerlist["pitxt"].min()-1)
- formBytes = file1.read(pointerlist["pitxt"].max()-pointerlist["pitxt"].min())
- form = [byte for byte in formBytes]
- formats.append(form)
- context ['piniz'] = pointerlist["pitxt"].min()
- context ['pfin'] = pointerlist["pitxt"].max()
- elif periodi != 0:
- query = f"SELECT piniz, pfin FROM periodi WHERE ntx = {ntxlocal} AND numperiod <= {periodlocal+int(periodi/2)} AND numperiod >= {periodlocal-int(periodi/2)}"
- queryresponse = pd.read_sql(query, con)
- with open(f"{path}/itxt/{sigla}", 'r', encoding="utf-32-le") as file1:
- file1.seek(4*queryresponse["piniz"].min())
- cont = file1.read(queryresponse["pfin"].max()-queryresponse["piniz"].min())
- contexts.append(cont)
- 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:
- numbranolocal = textlist.loc[index, "numbrano"]
- query = f"SELECT piniz, pfin FROM linkbase WHERE {ntxlocal} = ntx AND tipo = 2 AND id BETWEEN {numbranolocal-int(brani/2)} AND {numbranolocal+int(brani/2)}"
- queryresponse = pd.read_sql(query, con)
- with open(f"{path}/itxt/{sigla}", 'r', encoding="utf-32-le") as file1:
- file1.seek(4*queryresponse["piniz"].min())
- cont = file1.read(queryresponse["pfin"].max()-queryresponse["piniz"].min())
- contexts.append(cont)
- 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 di ricerca dei brani associati. Ha in input singlecontexts.
- def findlinks (context, path):
- con = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- 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:
- query = f"SELECT ta.ntx, ta.id, ta.piniz, ta.pfin, tb.mappain, tb.mappafin FROM linkbase AS tb INNER JOIN linknoteass AS ta ON tb.ntx = ta.ntx AND tb.id = ta.id WHERE (((tb.tipo= 1) AND (tb.ntx = {ntxlocal})) AND ((tb.piniz BETWEEN {pinizlocal} AND {pfinlocal}) OR ({pitxtlocal} BETWEEN tb.piniz AND tb.pfin)))"
- queryresponse = pd.read_sql(query, con)
- with open(f"{path}/itxt/{siglalocal}", 'r', encoding="utf-32-le") as file1:
- file1.seek(4*queryresponse["piniz"].min())
- cont = file1.read(queryresponse["pfin"].max()-queryresponse["piniz"].min()-2)
- context['nota'] = cont
- return context
- if linkslocal == 2:
- query = f"SELECT ta.ntx, ta.id, ta.piniz, ta.pfin, tb.mappain, tb.mappafin FROM linkbase AS tb INNER JOIN linknoteass AS ta ON tb.ntx = ta.ntx AND tb.id = ta.id WHERE (((tb.tipo= 2) AND (tb.ntx = {ntxlocal})) AND ((tb.piniz BETWEEN {pinizlocal} AND {pfinlocal}) OR ({pitxtlocal} BETWEEN tb.piniz AND tb.pfin)))"
- queryresponse = pd.read_sql(query, con)
- with open(f"{path}/itxt/{siglalocal}", 'r', encoding="utf-32-le") as file1:
- file1.seek(4*queryresponse["piniz"].min())
- cont = file1.read(queryresponse["pfin"].max()-queryresponse["piniz"].min()-2)
- context['testo associato'] = cont
- if linkslocal == 3:
- query = f"SELECT ta.ntx, ta.id, ta.piniz, ta.pfin, tb.piniz AS iniz, tb.pfin AS fin, tb.mappain, tb.mappafin FROM linkbase AS tb INNER JOIN linknoteass AS ta ON tb.ntx = ta.ntx AND tb.id = ta.id WHERE (((tb.tipo= 1) AND (tb.ntx = {ntxlocal})) AND ((tb.piniz BETWEEN {pinizlocal} AND {pfinlocal}) OR ({pitxtlocal} BETWEEN tb.piniz AND tb.pfin)))"
- queryresponse = pd.read_sql(query, con)
- with open(f"{path}/itxt/{siglalocal}", 'r', encoding="utf-32-le") as file1:
- file1.seek(4*queryresponse["piniz"].min())
- cont = file1.read(queryresponse["pfin"].max()-queryresponse["piniz"].min()-2)
- context['nota'] = cont
- query2 = f"SELECT ta.ntx, ta.id, ta.piniz, ta.pfin, tb.piniz AS iniz, tb.pfin AS fin, tb.mappain, tb.mappafin FROM linkbase AS tb INNER JOIN linknoteass AS ta ON tb.ntx = ta.ntx AND tb.id = ta.id WHERE (((tb.tipo= 2) AND (tb.ntx = {ntxlocal})) AND ((tb.piniz BETWEEN {pinizlocal} AND {pfinlocal}) OR ({pitxtlocal} BETWEEN tb.piniz AND tb.pfin)))"
- queryresponse2 = pd.read_sql(query2, con)
- with open(f"{path}/itxt/{siglalocal}", 'r', encoding="utf-32-le") as file2:
- file2.seek(4*queryresponse2["piniz"].min())
- cont2 = file2.read(queryresponse2["pfin"].max()-queryresponse2["piniz"].min()-2)
- context['testo associato'] = cont2
- return context
- #%% Ha in input links, associa i riferimenti bibliografici ad ogni contesto.
- def singlefindbib(contexts, path):
- infobib = pd.DataFrame()
- rif_org = pd.DataFrame()
- for ind, row in contexts.iterrows():
- con = sqlite3.connect(f"file:{path}/bibliografia/BiblioTLIO.db?mode=ro", uri=True)
- Query = f"SELECT [Anno iniziale], [Titolo Abbreviato], IQ FROM datibib WHERE Sigla='{row['sigla']}'"
- bib = pd.read_sql(Query, con)
- infobib = pd.concat([infobib, bib])
- con2 = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- 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])
- anno = list(infobib['Anno iniziale'])
- titolo = list(infobib['Titolo Abbreviato'])
- iq = list(infobib['IQ'])
- rif1 = list(rif_org['Rif_organico'])
- rif2 = list(rif_org['Rif_completo'])
- contexts['Anno iniziale'] = anno
- contexts['Titolo Abbreviato'] = titolo
- 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'])
- if 'nota' in chrono.columns and 'testo associato' in chrono.columns:
- cols = ['links','Titolo Abbreviato', 'Rif_organico', 'tipostanza', 'stanza', 'verso', 'pag', 'riga', 'IQ', 'lemma', 'cat_gr', 'disambiguatore', 'contesto', 'nota', 'testo associato', 'highlight']
- elif 'nota' in chrono.columns:
- cols = ['links','Titolo Abbreviato', 'Rif_organico', 'tipostanza', 'stanza', 'verso', 'pag', 'riga', 'IQ', 'lemma', 'cat_gr', 'disambiguatore', 'contesto', 'nota', 'highlight']
- elif 'testo associato' in chrono.columns:
- cols = ['links','Titolo Abbreviato', 'Rif_organico', 'tipostanza', 'stanza', 'verso', 'pag', 'riga', 'IQ', 'lemma', 'cat_gr', 'disambiguatore', 'contesto', 'testo associato', 'highlight']
- else:
- cols = ['links','Titolo Abbreviato', 'Rif_organico', 'tipostanza', 'stanza', 'verso', 'pag', 'riga', 'IQ', 'lemma', 'cat_gr', 'disambiguatore', 'contesto', 'highlight']
- chrono = chrono.drop(chrono.columns[0], axis=1)
- clean_df = chrono.reindex(columns=cols + list(chrono.columns.difference(cols)))
- return clean_df
- # %% funzione contesti singoli
- def contestosingolo (contestimultipli, indice, parole, periodi, brani, listOcc, path):
- contestosingolo = singlecontexts(contestimultipli, indice, parole, periodi, brani, listOcc, path)
- braniassociati = findlinks(contestosingolo, path)
- contestosingoloclean = singlefindbib (braniassociati, path)
- return contestosingoloclean
- #%% funzioni decodifica contesti
- def GeneraKey (sigla=None):
- # Genera i parametri di cifratura di un testo
- valore = [0, 0, 0]
- origine = None
- global LengKey, KeyBody
- con = sqlite3.connect(f"file:{path}/corpus.db?mode=ro", uri=True)
- query = f"SELECT notea,noteb,notec FROM Intbib WHERE lower(sigla)='{sigla}'"
- query_answer = pd.read_sql(query, con)
- valore[0] = int(query_answer['notea'][0])
- valore[1] = int(query_answer['noteb'][0])
- valore[2] = int(query_answer['notec'][0])
- print (valore)
- dato = valore[0] + valore[1]
- LengKey = 50 + (valore[2] % 300)
- if (LengKey // 2) * 2 != LengKey:
- LengKey = LengKey + 1
- KeyBody = [0] * LengKey
- iniziale = dato % (valore[2] + 123)
- random.seed(iniziale)
- for k in range(LengKey):
- KeyBody[k] = int(1000 * random.random())
- path = "/Users/leonardocanova/Library/CloudStorage/OneDrive-ConsiglioNazionaledelleRicerche/TIGRO/Ricerche/db/ndg2.gat4"
- GeneraKey("d17")
- #%% funzione cifratura/decifratura
- def CifraS(df, verso):
- # Cifra o decifra una stringa
- # StartInFile = posizione, all'interno del testo cifrato, del primo carattere della stringa da cifrare (base 1)
- # stringa = stringa da cifrare o decifrare
- # verso = 1 => cifra; 2 => decifra
- # FirstInStringa = indice del primo byte considerato all'interno del vettore da decifrare
- # LastInStringa = indice dell'ultimo byte considerato all'interno del vettore da decifrare
- # PosizInKey = indice del primo carattere da utilizzare all'interno della chiave fissa
- global LengKey, KeyBody
- print (KeyBody)
- print(LengKey)
- StartInFile = df['piniz'][0]
- stringa = df['contesto'] [0]
- print(StartInFile, stringa)
- NumCharsToConv = 0
- LastInStringa = 0
- LengKey2 = LengKey // 2
- while LastInStringa < len(stringa):
- StartInFile = StartInFile + NumCharsToConv
- NumKeyAppl = 1 + (StartInFile - 1) // LengKey2
- FirstInStringa = LastInStringa + 1
- PosizInKey = StartInFile % LengKey2
- if PosizInKey == 0:
- PosizInKey = LengKey2
- MaxCharsToConv = LengKey - PosizInKey + 1
- if MaxCharsToConv > LengKey2 - PosizInKey + 1:
- MaxCharsToConv = LengKey2 - PosizInKey + 1
- NumCharsToConv = len(stringa) - FirstInStringa + 1
- if NumCharsToConv > MaxCharsToConv:
- NumCharsToConv = MaxCharsToConv
- LastInStringa = FirstInStringa + NumCharsToConv - 1
- for k in range(FirstInStringa - 1, LastInStringa):
- if verso == 1:
- stringa = stringa[:k] + chr(ord(stringa[k]) + KeyBody[PosizInKey-1]) + stringa[k+1:]
- else:
- stringa = stringa[:k] + chr(ord(stringa[k]) - KeyBody[PosizInKey-1]) + stringa[k+1:]
- print("Stringa: "+stringa)
- PosizInKey += 1
- return stringa
- #%% provine
- testdec = 'ӗЫГҨғϩҘМϩӲѢҨҘ'
- testdec2 = 'ӻ'
- testenc = "recomandaţion"
- testenc2 = "çà"
- testnorm = "fòra"
- path = "/Users/leonardocanova/Library/CloudStorage/OneDrive-ConsiglioNazionaledelleRicerche/TIGRO/Ricerche/db/ndg2.gat4"
- listOcc = get_tables_occ(path)
- ricerca = ricercaforme(interpreter(testenc), path, 1, 0)
- #dtale.show(db_results_decode(ricerca))
- contesti_multipli = contestimultipli(0, ricerca, listOcc, path)
- contesto_singolo = contestosingolo(contesti_multipli, 0, 31, 0, 0, listOcc, path)
- #dtale.show(db_results_decode(contesto_singolo))
- #CifraS(contesto_singolo, 2)
- # %%
|