cooccorrenze.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. # %%
  2. import pandas as pd
  3. from .basic_queries import basicQueries
  4. # Executes query sequences to recover contexts with co-occurrences according to user input
  5. # Returns Pandas dataframes
  6. class cooccorrenze(basicQueries):
  7. def __init__(self, dataConfig):
  8. super().__init__(dataConfig)
  9. #%% funzione ricerca per cooccorrenze.
  10. # Ha in input un array del tipo [forma/lemma_cercati, tipo_ricerca, ricerca_espansa, iniziale_raddoppiata].
  11. # l'attributo tipo_ricerca definisce il tipo di ricerca in input (0 per forme, 1 per lemmi, 2 per lemmi con opzione "mostra occorrenze non lemmatizzate").
  12. # 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)
  13. def ricerca_cooccorrenze(self, listaricerche, intervallo, periodo, ordinate):
  14. listatesti = pd.DataFrame()
  15. cod = 1
  16. if listaricerche[0][1] == 0:
  17. ricerca = self.sendBasicQuery(listaricerche[0][0], 'forma', listaricerche[0][2], listaricerche[0][3], pandas=True)
  18. listatesti = self.findtexts(0, ricerca)
  19. elif listaricerche[0][1] == 1:
  20. ricerca = self.sendBasicQuery(listaricerche[0][0], 'lemma', listaricerche[0][2], listaricerche[0][3], pandas=True)
  21. listatesti = self.findtexts(1, ricerca)
  22. elif listaricerche[0][1] == 2:
  23. ricerca = self.sendBasicQuery(listaricerche[0][0], 'lemma', listaricerche[0][2], listaricerche[0][3], pandas=True)
  24. listatesti = self.findtexts(2, ricerca)
  25. if listatesti.empty:
  26. return []
  27. for ricerca, tipo, espansa, raddoppiata in listaricerche[1:]:
  28. if tipo == 0:
  29. search = self.sendBasicQuery(ricerca, 'forma', espansa, raddoppiata, pandas=True)
  30. elif tipo == 1:
  31. search = self.sendBasicQuery(ricerca, 'lemma', espansa, raddoppiata, pandas=True)
  32. elif tipo == 2:
  33. search = self.sendBasicQuery(ricerca, 'lemma', espansa, raddoppiata, pandas=True)
  34. textlist = self.findtexts(tipo, search)
  35. listatesti = listatesti.merge(textlist, on='ntx', suffixes=('', f'_{cod}'))
  36. cond1 = listatesti['numperiod'] == listatesti[f'numperiod_{cod}'] if periodo == 1 else True
  37. cond2 = ((listatesti['mappa'] - listatesti[f'mappa_{cod}']) != 0) & ((listatesti['mappa'] - listatesti[f'mappa_{cod}']).abs() <= intervallo) if ordinate == 0 else ((listatesti[f'mappa_{cod}'] - listatesti['mappa']) > 0) & ((listatesti[f'mappa_{cod}'] - listatesti['mappa']).abs() <= intervallo)
  38. cod += 1
  39. listatesti = listatesti[cond1 & cond2]
  40. if listatesti.empty:
  41. return []
  42. else:
  43. contexts = self.findcontexts(listatesti)
  44. bibliocontexts = self.findbib(contexts)
  45. clean = bibliocontexts.drop_duplicates(subset="contesto")
  46. highlights = self.highlight(clean)
  47. return highlights.to_dict(orient='records')
  48. ###################
  49. # OLD
  50. ###################
  51. '''def ricerca_cooccorrenze (self, listaricerche, intervallo, periodo, ordinate):
  52. listatesti = pd.DataFrame()
  53. cod = 1
  54. if listaricerche[0][1] == 0:
  55. ricerca = self.sendBasicQuery(listaricerche[0][0], 'forma', listaricerche[0][2], listaricerche[0][3], pandas=True)
  56. listatesti = self.findtexts(0, ricerca)
  57. elif listaricerche[0][1] == 1:
  58. ricerca = self.sendBasicQuery(listaricerche[0][0], 'lemma', listaricerche[0][2], listaricerche[0][3], pandas=True)
  59. listatesti = self.findtexts(1, ricerca)
  60. elif listaricerche[0][1] == 2:
  61. ricerca = self.sendBasicQuery(listaricerche[0][0], 'lemma', listaricerche[0][2], listaricerche[0][3], pandas=True)
  62. listatesti = self.findtexts(2, ricerca)
  63. if listatesti.empty:
  64. return []
  65. for ricerca, tipo, espansa, raddoppiata in listaricerche[1:]:
  66. if tipo == 0:
  67. search = self.sendBasicQuery(ricerca, 'forma', espansa, raddoppiata, pandas=True)
  68. elif tipo == 1:
  69. search = self.sendBasicQuery(ricerca, 'lemma', espansa, raddoppiata, pandas=True)
  70. elif tipo == 2:
  71. search = self.sendBasicQuery(ricerca, 'lemma', espansa, raddoppiata, pandas=True)
  72. textlist = self.findtexts(tipo, search)
  73. cod_cols = []
  74. ##########################################
  75. # KORA: questo blocco sembra troppo lento!
  76. ##########################################
  77. # df_new = pd.DataFrame(columns=list(listatesti.columns))
  78. # for index1, row1 in listatesti.iterrows():
  79. # for index2, row2 in textlist.iterrows():
  80. # cond1 = row1['ntx'] == row2['ntx']
  81. # cond2 = row1['numperiod'] == row2['numperiod'] if periodo == 1 else True
  82. # cond3 = ((row1['mappa'] - row2['mappa']) != 0) and ((row1['mappa'] - row2['mappa']) in range(-intervallo, intervallo)) if ordinate == 0 else ((row2['mappa'] - row1['mappa']) > 0) and ((row2['mappa'] - row1['mappa']) <= intervallo)
  83. # if cond1 and cond2 and cond3:
  84. # row1[f'cod{cod}'] = textlist['cod'].iloc[index2]
  85. # cod_cols.append(f'cod{cod}')
  86. # df_new = pd.concat([df_new, row1.to_frame().T])
  87. ##########################################
  88. # KORA: fino a qui
  89. ##########################################
  90. ##########################################
  91. # KORA: questa è un'alternativa
  92. ##########################################
  93. df_new = pd.DataFrame(columns=list(listatesti.columns))
  94. for index1, row1 in listatesti.iterrows():
  95. ntx1 = row1['ntx']
  96. mappa1 = row1['mappa']
  97. nperiodo1 = row1['numperiod']
  98. if ordinate == 0:
  99. test = (textlist['ntx'].astype(int) == ntx1) & (textlist['mappa'].astype(int) > mappa1-intervallo) & (textlist['mappa'].astype(int) < mappa1+intervallo) & (textlist['mappa'].astype(int) != mappa1)
  100. else:
  101. test = (textlist['ntx'].astype(int) == ntx1) & (textlist['mappa'].astype(int) > mappa1-intervallo)
  102. if periodo == 1:
  103. test = test & (textlist['numperiod'] == nperiodo1)
  104. df_temp = textlist[test]
  105. df_temp[f'cod{cod}'] = df_temp['cod']
  106. cod_cols.append(f'cod{cod}')
  107. df_new = pd.concat([df_new, df_temp])
  108. cod += 1
  109. ##########################################
  110. # KORA: fino a qui
  111. ##########################################
  112. listatesti = df_new
  113. if listatesti.empty:
  114. return []
  115. else:
  116. contexts = self.findcontexts(listatesti)
  117. bibliocontexts = self.findbib(contexts)
  118. clean = bibliocontexts.drop_duplicates(subset="contesto")
  119. highlights = self.highlight (clean)
  120. return highlights.to_dict(orient='records') # is this slow? CHECK!
  121. #return clean.to_json(orient='records') # possibilità alternativa -- molte opzioni possibili!'''