cooccorrenze.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import polars as pl
  2. from .basic_queries import basicQueries
  3. from .utilities.format import formatAllContexts
  4. # Executes query sequences to recover contexts with co-occurrences according to user input
  5. # Returns data in a dictionary format
  6. class cooccorrenze(basicQueries):
  7. def __init__(self, dataConfig):
  8. super().__init__(dataConfig)
  9. #%% funzione ricerca per cooccorrenze.
  10. # Ha in input un array di arrays del tipo:
  11. # [forma/lemma_cercati, tipo_ricerca, ricerca_espansa, iniziale_raddoppiata].
  12. # l'attributo tipo_ricerca ha come valori ammessi: 0 per forme, 1 per lemmi, 2 per lemmi + occorrenze non lemmatizzate.
  13. # Permette di definire l'intervallo di ricerca (in numero di parole), la possibilità di cercare soltanto all'interno dello stesso periodo (0/1) e/o di cercare le occorrenze in modo ordinato (0/1)
  14. def ricerca_cooccorrenze(self, listaricerche, intervallo, periodo, ordinate):
  15. occurrences = [] # una lista di Dicts con i codici dei lemmi/forme da cercare
  16. for ricerca, tipo, espansa, raddoppiata in listaricerche:
  17. if tipo == 0:
  18. res1 = self.sendBasicQuery(ricerca, 'forma', espansa, raddoppiata, polars=True)
  19. if res1.is_empty():
  20. return []
  21. occurrences.append({'codList': res1['cod'].to_list(), 'querySubtype': 0})
  22. elif tipo == 1:
  23. res1 = self.sendBasicQuery(ricerca, 'lemma', espansa, raddoppiata, polars=True)
  24. if res1.is_empty():
  25. return []
  26. occurrences.append({'codList': res1['cod'].to_list(), 'querySubtype': 1})
  27. elif tipo == 2:
  28. res1 = self.sendBasicQuery(ricerca, 'lemma', espansa, raddoppiata, polars=True)
  29. if res1.is_empty():
  30. return []
  31. codList = res1['cod'].to_list()
  32. subQueryData = {'queryType': 'pfl', 'codList': codList}
  33. subdf = self.queryHandler.query(subQueryData, polars=True)
  34. formCodList = subdf['codForma'].to_list()
  35. occurrences.append({'codList': codList, 'formCodList': formCodList, 'querySubtype': 2})
  36. if len(occurrences) == 0:
  37. return []
  38. queryData = {'queryType': 'co-occurrences', 'occurrences': occurrences, 'intervallo': intervallo,
  39. 'periodo': periodo, 'ordinate': ordinate}
  40. queryResponses = [self.queryHandler.query(dict(queryData, table=table), polars=True) for table in self.listOcc]
  41. listatesti = pl.concat(queryResponses)
  42. if listatesti.is_empty():
  43. return []
  44. else:
  45. contexts = self.findcontexts(listatesti)
  46. bibliocontexts = self.findbib(contexts)
  47. clean = bibliocontexts.unique(subset="contesto")
  48. highlights = formatAllContexts(clean)
  49. return highlights.to_dict(orient='records')