test_occorrenzario_pandas.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. pitxtLocal = row["pitxt"]
  58. sigla = row["sigla"]
  59. periodlocal = row["numperiod"]
  60. ntxlocal = row["ntx"]
  61. mappalocal = row["mappa"]
  62. pointerlist = pd.DataFrame()
  63. for table in listOcc:
  64. 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)}"
  65. queryresponse = pd.read_sql(query, con)
  66. pointerlist = pd.concat([pointerlist, queryresponse])
  67. with open(f"{path}/itxt/{sigla}", 'r', encoding="utf-32-le") as file1:
  68. file1.seek(4*pointerlist["pitxt"].min())
  69. cont = file1.read(pointerlist["pitxt"].max()-pointerlist["pitxt"].min())
  70. contexts.append(cont)
  71. textlist['contesto'] = contexts
  72. return (textlist.reset_index(drop=True))
  73. # %% Ha in input findcontexts, associa i riferimenti bibliografici ad ogni contesto.
  74. def findbib(contexts, path):
  75. infobib = pd.DataFrame()
  76. rif_org = pd.DataFrame()
  77. con = sqlite3.connect(f"file:{path}/bibliografia/BiblioTLIO.db?mode=ro", uri=True)
  78. con2 = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  79. for ind, row in contexts.iterrows():
  80. 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']}'"
  81. bib = pd.read_sql(Query, con)
  82. infobib = pd.concat([infobib, bib])
  83. Query2 = f"SELECT head AS Rif_organico, full AS Rif_completo FROM org WHERE (indice='{row['numorg']}' AND ntx='{row['ntx']}')"
  84. rif = pd.read_sql(Query2, con2)
  85. rif_org = pd.concat([rif_org, rif])
  86. annoiniz = list(infobib['Anno iniziale'])
  87. annofin = list(infobib['Anno finale'])
  88. datacod = list(infobib['Data codificata'])
  89. datadesc = list(infobib['Data descrittiva'])
  90. titoloabb = list(infobib['Titolo Abbreviato'])
  91. autore = list(infobib['Autore'])
  92. titolo = list(infobib['Titolo'])
  93. curatore = list(infobib['Curatore'])
  94. areagen = list(infobib['Area generica'])
  95. areaspec = list(infobib['Area specifica'])
  96. genere = list(infobib['Genere'])
  97. forma = list(infobib['Forma'])
  98. tipo = list(infobib['Tipo'])
  99. iq = list(infobib['IQ'])
  100. rif1 = list(rif_org['Rif_organico'])
  101. rif2 = list(rif_org['Rif_completo'])
  102. contexts['Anno iniziale'] = annoiniz
  103. contexts['Anno finale'] = annofin
  104. contexts['Data codificata'] = datacod
  105. contexts['Data descrittiva'] = datadesc
  106. contexts['Autore'] = autore
  107. contexts['Titolo Abbreviato'] = titoloabb
  108. contexts['Titolo'] = titolo
  109. contexts['Curatore'] = curatore
  110. contexts['Area generica'] = areagen
  111. contexts['Area specifica'] = areaspec
  112. contexts['Genere'] = genere
  113. contexts['Forma'] = forma
  114. contexts['Tipo'] = tipo
  115. contexts ['IQ'] = iq
  116. contexts['Rif_organico'] = rif1
  117. contexts['Rig_completo'] = rif2
  118. contexts.pag = contexts.pag.astype(int)
  119. chrono = contexts.sort_values(by=['Anno iniziale', 'Rif_organico', 'pag'])
  120. 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']
  121. clean_df = chrono.reindex(columns=cols + list(chrono.columns.difference(cols)))
  122. return clean_df.reset_index(drop=True)
  123. # funzione stringa da evidenziare
  124. def highlight (bibliocontexts, path):
  125. index = 0
  126. con = sqlite3.connect(f"file:{path}/test1.db?mode=ro", uri=True)
  127. for col in bibliocontexts.columns:
  128. forme = []
  129. if col.startswith('cod'):
  130. for ind, row in bibliocontexts.iterrows():
  131. Query = f"SELECT spec FROM form WHERE cod={row[col]}"
  132. query_answer = pd.read_sql(Query, con)
  133. forme += list(query_answer['spec'])
  134. if index == 0:
  135. bibliocontexts['highlight'] = forme
  136. else:
  137. bibliocontexts['highlight'+str(index)] = forme
  138. index += 1
  139. return bibliocontexts
  140. #funzione contesti multipli
  141. def contestimultipli (tipo_ricerca, ricerca, listOcc, path):
  142. textlist = findtexts(tipo_ricerca, ricerca, listOcc, path)
  143. contexts = findcontexts (textlist,listOcc, path)
  144. bibliocontexts = findbib (contexts, path)
  145. highlights = highlight(bibliocontexts, path)
  146. return highlights
  147. # %%
  148. path = "/Users/leonardocanova/Library/CloudStorage/OneDrive-ConsiglioNazionaledelleRicerche/TIGRO/Ricerche/db/first_db"
  149. listOcc = get_tables_occ(path)
  150. entry = "mezzo"
  151. tiporicerca= 1
  152. # (0 per forme, 1 per lemmi o categoria grammaticale, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate")
  153. ricerca=ricercalemmi(interpreter(entry), path, 1, 0)
  154. contesti = contestimultipli(tiporicerca, ricerca, listOcc, path)
  155. dtale.show(contesti)
  156. # %%