basic_queries.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #%%
  2. import json
  3. from .utilities.parsing_utilities import interpreter, inizialeraddoppiata, list_normalize
  4. # Basic data provider class; can be instantiated to handle different kinds
  5. # of data-providing connections or interfaces based on config options
  6. from .data_interface.data_providers_setup import queryHandlerFactory
  7. import pandas as pd
  8. import math
  9. # Main class for basic queries contains:
  10. # - a data provider instance
  11. # - methods to submit queries to the data provider instance
  12. class basicQueries:
  13. def __init__(self, dataConfig):
  14. self.queryHandler = queryHandlerFactory(dataConfig)
  15. self.listOcc = dataConfig.get('listOcc')
  16. # Prepares and sends query OBJECTS which will be processed by the data provider
  17. def sendBasicQuery(self, text, queryType, espansa, raddoppiata, pandas=False, dbFile=None):
  18. entries = interpreter(text)
  19. data = entries
  20. dataNorm = []
  21. if raddoppiata==1:
  22. data = entries + inizialeraddoppiata(entries)
  23. if espansa==1 and raddoppiata==0:
  24. dataNorm = list_normalize(entries)
  25. elif espansa==1 and raddoppiata==1:
  26. dataNorm = entries + list_normalize(inizialeraddoppiata(entries))
  27. return self.queryHandler.query({'data': data, 'dataNorm': dataNorm, 'queryType': queryType}, pandas, dbFile)
  28. #%% ha in input le funzioni di ricerca, cerca nell'occorrenziario i puntatori ai contesti e altri elementi ad essi associati.
  29. #l'attributo type definisce il tipo di ricerca in input (0 per forme, 1 per lemmi, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate")
  30. def findtexts(self, type, df, index=None):
  31. # Check if the input is a DataFrame, and convert it if it is not
  32. if not isinstance(df, pd.DataFrame):
  33. df = pd.DataFrame(df)
  34. # If an index is provided, select the rows that correspond to the index
  35. if index is not None:
  36. if isinstance(index, range):
  37. index = list(index)
  38. elif not isinstance(index, list):
  39. index = [index]
  40. df = df.loc[index]
  41. # Create a list of 'cod' values from the input DataFrame
  42. codList = [row['cod'] for _, row in df.iterrows()]
  43. # Get the 'listOcc' values
  44. listOcc = self.listOcc
  45. # Create a dictionary with query information
  46. queryData = {'queryType': 'texts', 'querySubtype': type, 'codList': codList}
  47. # If 'type' is 2 (option "non lemmatizzate"), make an additional query to get form codes
  48. # NOTE: A this stage of development 'type 2' is default for "lemma" searches (this could be changed).
  49. if type == 2:
  50. subQueryData = {'queryType': 'pfl', 'codList': codList}
  51. subdf = self.queryHandler.query(subQueryData, pandas=True)
  52. queryData['formCodList'] = list(subdf['codForma'])
  53. # Make a query to each table in 'listOcc' and concatenate the results
  54. queryResponses = [self.queryHandler.query(dict(queryData, table=table), pandas=True) for table in listOcc]
  55. textlist = pd.concat(queryResponses)
  56. return textlist
  57. # %% ha in input findtexts, restituisce i contesti associati agli elementi localizzati.
  58. # Il range dei contesti è impostato di default a 30 parole e può essere rimodulato nel passaggio al contesto singolo.
  59. def findcontexts(self, textlist):
  60. # Initialize lists to store context information
  61. contexts = []
  62. formats = []
  63. minChar_list = []
  64. maxChar_list = []
  65. # Iterate over each row in 'textlist'
  66. for _, row in textlist.iterrows():
  67. sigla = row["sigla"]
  68. if row["piniz"] is None or math.isnan(row["piniz"]):
  69. minChar = int(row["backup_piniz"])
  70. else:
  71. minChar = int(row["piniz"])
  72. if row["pfin"] is None or math.isnan(row["pfin"]):
  73. maxChar = int(row["backup_pfin"])
  74. else:
  75. maxChar = int(row["pfin"])
  76. fileQueryData = {'sigla': sigla, 'minChar': minChar, 'maxChar': maxChar}
  77. # Call 'textQuery' to get the context and format information
  78. cont, form = self.queryHandler.textQuery(fileQueryData, True)
  79. # Append the results to the respective lists
  80. minChar_list.append(minChar)
  81. maxChar_list.append(maxChar)
  82. contexts.append(cont)
  83. formats.append(json.dumps(form))
  84. # Add the context information to 'textlist' and reset the index
  85. textlist['piniz'] = minChar_list
  86. textlist['pifin'] = maxChar_list
  87. textlist['contesto'] = contexts
  88. textlist['formattazione contesto'] = formats
  89. return textlist.reset_index(drop=True)
  90. # %% Ha in input findcontexts, associa i riferimenti bibliografici ad ogni contesto dal db BiblioTLIO.
  91. def findbib(self, contexts):
  92. # Old, deprecated
  93. # infobib = pd.DataFrame()
  94. # rif_org = pd.DataFrame()
  95. # for ind, row in contexts.iterrows():
  96. # queryData = {'queryType': 'bib', 'row': row}
  97. # bib = self.queryHandler.query(queryData, pandas=True, dbFile='bibliografia/BiblioTLIO.db')
  98. # infobib = pd.concat([infobib, bib])
  99. # queryData = {'queryType': 'rif', 'row': row}
  100. # rif = self.queryHandler.query(queryData, pandas=True)
  101. # rif_org = pd.concat([rif_org, rif])
  102. # annoiniz = list(infobib['Anno iniziale'])
  103. # annofin = list(infobib['Anno finale'])
  104. # datacod = list(infobib['Data codificata'])
  105. # datadesc = list(infobib['Data descrittiva'])
  106. # titoloabb = list(infobib['Titolo Abbreviato'])
  107. # autore = list(infobib['Autore'])
  108. # titolo = list(infobib['Titolo'])
  109. # curatore = list(infobib['Curatore'])
  110. # areagen = list(infobib['Area generica'])
  111. # areaspec = list(infobib['Area specifica'])
  112. # genere = list(infobib['Genere'])
  113. # forma = list(infobib['Forma'])
  114. # tipo = list(infobib['Tipo'])
  115. # iq = list(infobib['IQ'])
  116. siglaList = list(contexts['sigla'])
  117. siglaSet = set(siglaList)
  118. queryData = {'queryType': 'bibAlt', 'siglaSet': siglaSet}
  119. infobib = self.queryHandler.query(queryData, pandas=True, dbFile='bibliografia/BiblioTLIO.db')
  120. infobib = infobib.set_index('Sigla')
  121. infobib2 = {sigla: infobib.loc[sigla].to_dict() for sigla in siglaSet}
  122. infobib = [infobib2[sigla] for sigla in siglaList]
  123. #
  124. annoiniz = [el['Anno iniziale'] for el in infobib]
  125. annofin = [el['Anno finale'] for el in infobib]
  126. datacod = [el['Data codificata'] for el in infobib]
  127. datadesc = [el['Data descrittiva'] for el in infobib]
  128. titoloabb = [el['Titolo Abbreviato'] for el in infobib]
  129. autore = [el['Autore'] for el in infobib]
  130. titolo = [el['Titolo'] for el in infobib]
  131. curatore = [el['Curatore'] for el in infobib]
  132. areagen = [el['Area generica'] for el in infobib]
  133. areaspec = [el['Area specifica'] for el in infobib]
  134. genere = [el['Genere'] for el in infobib]
  135. forma = [el['Forma'] for el in infobib]
  136. tipo = [el['Tipo'] for el in infobib]
  137. iq = [el['IQ'] for el in infobib]
  138. ntxList = list(contexts['ntx'])
  139. numOrgList = list(contexts['numorg'])
  140. coordsList = [(numorg, ntxList[ind]) for ind, numorg in enumerate(numOrgList)]
  141. coordsSet = set(coordsList)
  142. queryData = {'queryType': 'rifAlt', 'coordsSet': coordsSet}
  143. rif_org = self.queryHandler.query(queryData, pandas=True)
  144. rif_org = rif_org.set_index( ['numorg', 'ntx'] )
  145. rif_org2 = {coord: rif_org.loc[coord] for coord in coordsSet}
  146. rif_org = [rif_org2[coord] for coord in coordsList]
  147. rif1 = [rif['Rif_organico'] for rif in rif_org]
  148. rif2 = [rif['Rif_completo'] for rif in rif_org]
  149. contexts['Anno iniziale'] = annoiniz
  150. contexts['Anno finale'] = annofin
  151. contexts['Data codificata'] = datacod
  152. contexts['Data descrittiva'] = datadesc
  153. contexts['Autore'] = autore
  154. contexts['Titolo Abbreviato'] = titoloabb
  155. contexts['Titolo'] = titolo
  156. contexts['Curatore'] = curatore
  157. contexts['Area generica'] = areagen
  158. contexts['Area specifica'] = areaspec
  159. contexts['Genere'] = genere
  160. contexts['Forma'] = forma
  161. contexts['Tipo'] = tipo
  162. contexts ['IQ'] = iq
  163. contexts['Rif_organico'] = rif1
  164. contexts['Rig_completo'] = rif2
  165. chrono = contexts.sort_values(by=['Data codificata', 'Rif_organico'])
  166. return (chrono.reset_index(drop=True))