test_occorrenzario_pandas.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # %%
  2. import sqlite3
  3. import pandas as pd
  4. import dtale
  5. import unicodedata
  6. from simple_query_test_pandas import ricercaforme, ricercalemmi, ricercaformelemmi, ricercalemmiforme, ricercacatgr, interpreter
  7. # %% funzione ricerca tabelle occorrenziari
  8. def get_tables_occ(path):
  9. conn = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  10. cursor = conn.cursor()
  11. cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
  12. table_names = cursor.fetchall()
  13. occ_tables = [table[0] for table in table_names if table[0].startswith('Occ')]
  14. cursor.close()
  15. conn.close()
  16. return occ_tables
  17. #%% ha in input le funzioni di ricerca, cerca nell'occorrenziario i puntatori ai contesti e altri elementi ad essi associati.
  18. #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")
  19. def findtexts(type, df, listOcc, path, index=None):
  20. if index is None:
  21. df = pd.DataFrame(df)
  22. else:
  23. if isinstance(index, range):
  24. index = list(index)
  25. elif not isinstance(index, list):
  26. index = [index]
  27. df = pd.DataFrame(df.loc[index])
  28. textlist = pd.DataFrame()
  29. codlist = list(df["cod"])
  30. con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  31. for table in listOcc:
  32. strlist = ",".join(str(c) for c in codlist)
  33. if type == 0:
  34. 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})"
  35. extendequeryReponse = pd.read_sql(Query, con)
  36. textlist = pd.concat([textlist, extendequeryReponse])
  37. elif type == 1:
  38. 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})"
  39. extendequeryReponse = pd.read_sql(Query, con)
  40. textlist = pd.concat([textlist, extendequeryReponse])
  41. elif type == 2:
  42. subquery = f"SELECT DISTINCT lemma, forma FROM pfl WHERE lemma IN ({strlist})"
  43. subdf = pd.read_sql(subquery, con)
  44. formcodlist = list(subdf["forma"])
  45. strform = ",".join(str(c) for c in formcodlist)
  46. 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}))"
  47. extendequeryReponse = pd.read_sql(Query, con)
  48. textlist = pd.concat([textlist, extendequeryReponse])
  49. return textlist
  50. # %% ha in input findtexts, restituisce i contesti associati agli elementi localizzati.
  51. # Il range dei contesti è impostato di default a 30 parole e può essere rimodulato nel passaggio al contesto singolo.
  52. def findcontexts(textlist, listOcc, path):
  53. contexts = []
  54. ampiezzacontesto = 31
  55. con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  56. for ind, row in textlist.iterrows():
  57. sigla = row["sigla"]
  58. periodlocal = row["numperiod"]
  59. ntxlocal = row["ntx"]
  60. mappalocal = row["mappa"]
  61. pointerlist = pd.DataFrame()
  62. for table in listOcc:
  63. 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)}"
  64. queryresponse = pd.read_sql(query, con)
  65. pointerlist = pd.concat([pointerlist, queryresponse])
  66. with open(f"{path}/itxt/{sigla}", 'r', encoding="utf-32-le") as file1:
  67. #file1.seek(4*pointerlist["pitxt"].min())
  68. file_contents = file1.read()
  69. cont = file_contents[pointerlist["pitxt"].min():pointerlist["pitxt"].max()]
  70. print (cont)
  71. contexts.append(cont)
  72. textlist['contesto'] = contexts
  73. return (textlist.reset_index(drop=True))
  74. # %% Ha in input findcontexts, associa i riferimenti bibliografici ad ogni contesto.
  75. def findbib(contexts, path):
  76. infobib = pd.DataFrame()
  77. rif_org = pd.DataFrame()
  78. con = sqlite3.connect(f"file:{path}/bibliografia/BiblioTLIO.db?mode=ro", uri=True)
  79. con2 = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  80. for ind, row in contexts.iterrows():
  81. 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']}'"
  82. bib = pd.read_sql(Query, con)
  83. infobib = pd.concat([infobib, bib])
  84. Query2 = f"SELECT head AS Rif_organico, full AS Rif_completo FROM org WHERE (indice='{row['numorg']}' AND ntx='{row['ntx']}')"
  85. rif = pd.read_sql(Query2, con2)
  86. rif_org = pd.concat([rif_org, rif])
  87. annoiniz = list(infobib['Anno iniziale'])
  88. annofin = list(infobib['Anno finale'])
  89. datacod = list(infobib['Data codificata'])
  90. datadesc = list(infobib['Data descrittiva'])
  91. titoloabb = list(infobib['Titolo Abbreviato'])
  92. autore = list(infobib['Autore'])
  93. titolo = list(infobib['Titolo'])
  94. curatore = list(infobib['Curatore'])
  95. areagen = list(infobib['Area generica'])
  96. areaspec = list(infobib['Area specifica'])
  97. genere = list(infobib['Genere'])
  98. forma = list(infobib['Forma'])
  99. tipo = list(infobib['Tipo'])
  100. iq = list(infobib['IQ'])
  101. rif1 = list(rif_org['Rif_organico'])
  102. rif2 = list(rif_org['Rif_completo'])
  103. contexts['Anno iniziale'] = annoiniz
  104. contexts['Anno finale'] = annofin
  105. contexts['Data codificata'] = datacod
  106. contexts['Data descrittiva'] = datadesc
  107. contexts['Autore'] = autore
  108. contexts['Titolo Abbreviato'] = titoloabb
  109. contexts['Titolo'] = titolo
  110. contexts['Curatore'] = curatore
  111. contexts['Area generica'] = areagen
  112. contexts['Area specifica'] = areaspec
  113. contexts['Genere'] = genere
  114. contexts['Forma'] = forma
  115. contexts['Tipo'] = tipo
  116. contexts ['IQ'] = iq
  117. contexts['Rif_organico'] = rif1
  118. contexts['Rig_completo'] = rif2
  119. contexts.pag = contexts.pag.astype(int)
  120. chrono = contexts.sort_values(by=['Anno iniziale', 'Rif_organico', 'pag'])
  121. 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']
  122. clean_df = chrono.reindex(columns=cols + list(chrono.columns.difference(cols)))
  123. return clean_df.reset_index(drop=True)
  124. # funzione stringa da evidenziare
  125. def highlight (bibliocontexts, path):
  126. index = 0
  127. con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  128. for col in bibliocontexts.columns:
  129. forme = []
  130. if col.startswith('cod'):
  131. for ind, row in bibliocontexts.iterrows():
  132. Query = f"SELECT spec FROM form WHERE cod={row[col]}"
  133. query_answer = pd.read_sql(Query, con)
  134. forme += list(query_answer['spec'])
  135. if index == 0:
  136. bibliocontexts['highlight'] = forme
  137. else:
  138. bibliocontexts['highlight'+str(index)] = forme
  139. index += 1
  140. return bibliocontexts
  141. #funzione contesti multipli
  142. def contestimultipli (tipo_ricerca, ricerca, listOcc, path):
  143. textlist = findtexts(tipo_ricerca, ricerca, listOcc, path)
  144. contexts = findcontexts (textlist,listOcc, path)
  145. bibliocontexts = findbib (contexts, path)
  146. highlights = highlight(bibliocontexts, path)
  147. return highlights
  148. # %%
  149. path = "/Users/leonardocanova/Library/CloudStorage/OneDrive-ConsiglioNazionaledelleRicerche/TIGRO/Ricerche/db/first_db"
  150. listOcc = get_tables_occ(path)
  151. entry = "mezzo"
  152. tiporicerca= 1
  153. # (0 per forme, 1 per lemmi o categoria grammaticale, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate")
  154. ricerca=ricercalemmi(interpreter(entry), path, 1, 0)
  155. #textlist = findtexts(1, ricerca, listOcc, path)
  156. contesti = contestimultipli(tiporicerca, ricerca, listOcc, path)
  157. dtale.show(contesti)
  158. # %%