jcmiguel / repository-reviewer Goto Github PK
View Code? Open in Web Editor NEWUna herramienta de búsqueda y síntesis de artículos de investigación escrita en Python.
Una herramienta de búsqueda y síntesis de artículos de investigación escrita en Python.
Este issue tiene 2 puntos de apoyo:
Por un lado, se comenta que las funciones relativas al ingreso de campos se podrías extender para autocompletar con la información disponible de los articulos a fichar, sin tener que ingresarla a mano por consola.
Sobre el issue #12, en la segunda entrega referente a la edición de una ficha #22 se explora la oportunidad de modificar la usabilidad en la edición:
La edición no debería implicar ingresar todo nuevamente, sino modificar campos en particular
Se valoran 3 alternativas (en orden de preferencia):
Obtener la información que completa los campos de la ficha seleccionando un artículo del reporte generado por el reviewer (o querier) y obtener del repositorio en question la información que se desea
Al efectuar búsquedas en IEEE y Scopus, los resultados de la última búsqueda sustituyen a los de la primera en el archivo de salida.
Detectado en Pull Request #27
Al maquetar las pestañas de "Búsqueda Básica" y "Búsqueda Avanzada" en QuerierPage, se observa que el ancho no se ajusta al total disponible en la pantalla. Se debe corregir este punto para que la interfaz sea responsiva.
Existen aplicaciones de terceros que permiten ordenar, filtrar y catalogar referencias bibliográficas.
Sería sensato implementar una funcionalidad que permita a esta aplicación integrarse con otras, delimitando el trabajo y dando valor al usuario final a lo largo del proceso de investigación.
Atender esta tarea permite simplificar el terreno para encarar el issue #14
Agregar una funcionalidad para que, introduciendo como parámetro de entrada una cadena de búsqueda, la misma se traduzca en los parámetros necesarios para cada API en todos los repositorios.
Cuando se realiza una búsqueda que no devuelve resultados desde la interfaz, se obtiene este error:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\juanc\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "D:\ArchivosPersonales\Workspace\repository-reviewer\venv\lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 554, in _clicked
self._command()
File "D:\ArchivosPersonales\Workspace\repository-reviewer\gui\querier_page.py", line 95, in querier_tab_search_btn_event
querier.search(debug=True)
File "D:\ArchivosPersonales\Workspace\repository-reviewer\engine\querier.py", line 111, in search
self.append_partial_res(repo.search())
File "D:\ArchivosPersonales\Workspace\repository-reviewer\historic\search.py", line 38, in append_partial_res
self._report_data = self._report_data.merge_reports( results )
File "D:\ArchivosPersonales\Workspace\repository-reviewer\historic\report.py", line 116, in merge_reports
compound[item] = self._merge_list_or_tuple(other, item)
File "D:\ArchivosPersonales\Workspace\repository-reviewer\historic\report.py", line 155, in _merge_list_or_tuple
for idx in range(len(target)):
TypeError: object of type 'NoneType' has no len()
Es posible que un error similar ocurra cuando se invoca la aplicación desde consola.
Detectado en Pull Request #27
Al efectuar una búsqueda, la invocación a la función querier()
congela la pantalla hasta que termine su ejecución. Esto afecta al desempeño de la interfaz gráfica, dado que puede hacer pensar al usuario que el programa colapsó y no responde.
Revisar si conviene agregarla como un nuevo Tab en la sección del QuerierPage.
Tener en cuenta que cuando se implemente la pantalla de histórico también se tendría que poder acceder a los resultados de dicha búsqueda.
# FIXME: Esta línea rompe si el archivo existe pero no tiene contenido.
- new_ficha = pd.DataFrame(new_dict, index=[fichas.index[-1] + 1])
+ new_ficha = pd.DataFrame(new_dict, index=[len(fichas) + 1])
Podría ser interesante disponer de un comando que permita fichar artículos de forma interactiva. Es decir algo como:
prompt$ ./indexer.py --index-card --to=index.csv
Fichaje de artículos
Ingrese los datos pedidos a continuación
> Nombre de archivo: ...10-Giuste-2022-XAI Pandemics.pdf
> Título: ...Explainable Artificial Intelligence Methods in Combating Pandemics: A Systematic Review
> Autor(es): ...F. Giuste; W. Shi; Y. Zhu; T. Naren; M. Isgut; Y. Sha; L. Tong; M. Gupte; M. D. Wang
> Medio de publicación: ...IEEE Reviews in Biomedical Engineering
> Año de publicación: ...2022
> Fecha de búsqueda: ...Nov 2022
> Abstract: ... <copy-paste here>
> Palabras clave: ...Explainable Artificial Intelligence, COVID-19, Explanation Generation, Explanation Representation, Explanation Evaluation, Medical Imaging, Electronic Health Records
> Referencias importantes: ...
> Fortalezas: ...
> Debilidades: ...
> Oportunidades: ...
¡Ficha generada con éxito!
Al guardar estos archivos en index.csv, luego se podría tener un comando que nos permita buscar una ficha en concreto, por nombre de archivo u otro campo:
prompt$ ./indexer.py --get-index-card 10-Giuste-2022-XAI Pandemics.pdf```
Ficha encontrada:
> Nombre de archivo: 10-Giuste-2022-XAI Pandemics.pdf
> Título: Explainable Artificial Intelligence Methods in Combating Pandemics: A Systematic Review
> Autor(es): F. Giuste; W. Shi; Y. Zhu; T. Naren; M. Isgut; Y. Sha; L. Tong; M. Gupte; M. D. Wang
> Medio de publicación: IEEE Reviews in Biomedical Engineering
> Año de publicación: 2022
> Fecha de búsqueda: Nov 2022
> Abstract: <copy-paste here>
> Palabras clave: Explainable Artificial Intelligence, COVID-19, Explanation Generation, Explanation Representation, Explanation Evaluation, Medical Imaging, Electronic Health Records
> Referencias importantes:
> Fortalezas:
> Debilidades:
> Oportunidades:
A futuro, incluso, podría utilizar este motor de comandos para poder iterar y obtener estadísticas entre todas las fichas registradas: cuántas veces aparece la palabra clave XAI, cuánto artículos son de tal autor, cuántos artículos son de 2019, etc.
Esto estaría alineado con mantener un criterio de tabulación estándar y otras cuestiones pertinentes.
Actualmente la aplicación se ejecuta por consola. Se podría desarrollar una interfaz gráfica con PyQT u otras herramientas para proveer otra forma de utilizar la aplicación.
Se encontro que cuando se alcanza el limite diario en IEEE, el repositorio devuelve el codigo http 403 (forbidden). Esto produce una excepcion en el codigo que finaliza su ejecucion. Esta es la traza que pude extraer durante la ejecucion:
2023-03-20 20:10:49,595 - ieee - DEBUG - ieee_def - <Response [403]>
Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/requests/models.py", line 971, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python3.10/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.10/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.10/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/jcmiguel/Documentos/Repos/repository-reviewer/./example.py", line 72, in <module>
id.search()
File "/home/jcmiguel/Documentos/Repos/repository-reviewer/repos/ieee_def.py", line 34, in search
total_records_count = ans.json()['total_records']
File "/usr/lib/python3.10/site-packages/requests/models.py", line 975, in json
raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Fin de ejecución
Cuando se realiza una búsqueda desde la GUI y se intenta consultar los resultados en el historial, esta búsqueda no se muestra. Sin embargo, el registro queda guardado correctamente en el archivo historic.csv.
Posiblemente falte recargar el archivo para que incluya este resultado reciente. Cuando se reinicia la aplicación, el archivo se vuelve a levantar y este resultado se muestra satisfactoriamente.
Implementar en la (pantalla de quality-checking/resultados?) un mecanismo de seleccion y descarte de articulos duplicados
¿Podría encararse el desarrollo de una funcionalidad que permita realizar esto?
Algunas cuestiones a tener en cuenta:
Es decir, los criterios quedarían implícitos en la cadena de búsqueda y en los argumentos de ejecución. ¿No está resuelto esto ya?
Related to issue #9
Tener en cuenta que un artículo puede estar publicado en distintos repositorios y no debería aparecer más de una vez en el reporte de artículos.
Para esto habrá que decidir:
El motor de detección de duplicados deberá basarse en una variable para decidir de qué forma actuará.
Cada vez que se realiza una búsqueda, lo resultados se apendean en el DataFrame repo.articles_df
que es estático (perteneciente a la clase y no a la instancia). Por lo tanto, persiste los resultados búsqueda tras búsqueda. Esto era funcional solo en la ejecución por consola ya que el programa terminaba luego de cada búsqueda.
Realizar la siguiente búsqueda más de una vez según los siguientes campos:
PubMED
ERIK
DOAJ
Se debe agregar una página en la GUI para poder efectuar el fichaje de artículos
Tener en cuenta al efectuar esta tarea incorporar manejo de excepciones en la GUI, de una forma similar a la siguiente para que sea consistente con lo implementado para querier_page:
indexer = Indexer()
try:
if indexer.configure() is True:
# Do some indexer.action(...)
except Exception:
# Do something...
Conversar si se justifica. En caso afirmativo, convendría hacerlo en las primeras instancias del desarrollo
Se agregó el manejo de excepciones en la gui, pero falta incorporarlo en querier.py.
El cambio podría ser solamente incorporar una pieza de código como la siguiente:
try:
querier = Querier(args.__dict__)
querier.configure()
querier.search(__debug_flag)
except Exception:
traceback.print_exc()
return 0
NOTA: el cambio debe impactarse en querier.py y no en engine/querier.py.
Sería interesante que en la etapa de análisis, cuando el investigador está descubriendo el área de dominio y probando la combinación de términos que mejor encamine su búsqueda, esta aplicación lo asista permitiendo comparar los resultados obtenidos.
Ejemplo de un ítem del historial:
Otro issue podría ser la obtención de un reporte del historial que se pueda ordenar por sus campos
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.