Repository navigation
Added
-
Added
is_track_pdfsandtrack_pdfs_report_pathtoprocess_articles()for local PDF workflows. When enabled (default), each processed PDF is recorded as afilename<TAB>doientry inlogs/{keyword}_pdf_processed_dois.txt, allowing re-runs to skip already-processed PDFs before any conversion or API calls. Falls back to scanning the output CSV when the tracking file does not yet exist. -
Centralised non-keyword default file paths (
results/article_processor_failed_articles.txt,agentic_evaluation_result.json,detailed_evaluation.json) as class-level constants onDefaultPathsso they can be changed in one place.
Changed
- Replaced the
cleaning_strategy("full"/"basic") andapply_advanced_cleaningparameters onDataCleaner,ComProScanner.clean_data(), and the top-levelclean_data()function with a singlecleaning_stepsparameter accepting either"all"(default) or a list of individually selectable step names:abbreviation_filtering,element_validation_strict/element_validation_lenient,text_normalization,miller_indices,coefficient_expansion_strict/coefficient_expansion_lenient(exposed via the newCleaningStepenum). The_lenientvariants are weaker companions of their_strictcounterparts and have no additional effect when both are selected together.
Fixed
-
Replaced the blind space-stripping behaviour (
key.replace(" ", ""), which mangled descriptive composition text such as"Bi4Ti3O12 ultrathin with oxygen vacancies"into"Bi4Ti3O12ultrathinwithoxygenvacancies") with a new optionaltext_normalizationstep that strips leading/trailing whitespace, collapses runs of multiple spaces down to one, and title-cases descriptive word tokens, while leaving formula segments and element-symbol sequences untouched. -
Fixed Miller-index notation (e.g.
"AlN (002)") being misread by the mandatory arithmetic resolver as a coefficient bracket.miller_indicesnow detects and drops such compositions instead of silently merging digits into the formula or colliding distinct surface-orientation entries onto the same key; whenmiller_indicesisn't selected, these compositions are left as unresolved rather than corrupted. -
Fixed unresolved-composition filtering dropping compositions when no
coefficient_expansion_strict/_lenientstep was selected; the filter now only runs when coefficient expansion is actually requested. -
Fixed weight/mole/atomic-percent dopant annotations (e.g.
"7 wt% NiO","1.25 wt% (0.78PbO-0.22CuO)") having their number misread as a stoichiometric coefficient and distributed into the annotated compound. Such annotations, including ones with a bracketed target, are now protected with an inert placeholder before coefficient expansion runs and restored verbatim afterward. -
Fixed coefficient expansion scaling descriptive-word fragments that coincidentally resemble element symbols — e.g.
"Bo"in"Bottom","Re"in"Reoxidized"("Re10oxidized"), or a unit abbreviation like"h"(hours) capitalized bytext_normalizationinto"H"(Hydrogen) — as if they were real stoichiometry.text_normalizationalso no longer capitalizes a token when doing so would manufacture a disguised element in the first place. -
Fixed a nested multi-term coefficient expression (e.g.
"0.75*(0.89(Bi0.5Na0.5)TiO3-0.11BaTiO3) + 0.25*(...)") being shredded into mismatched brackets with un-distributed coefficients instead of correctly distributing the outer coefficient across each inner term, including through arbitrary nesting depth and sign flips when a whole bracket is subtracted. Comma-separated site-occupancy notation (e.g."(K,Na,Li)(Nb,Ta)O3") remains unsupported by design but is no longer actively corrupted either. -
Fixed
SPRINGER_TDM_BASE_URLpointing atspdi.public.springernature.app, which Springer Nature is retiring; requests now go to the newapi.springernature.com/xmldata/jatsendpoint ahead of the old host's retirement on 7th August 2026. -
Changed the default DeepSeek model from
deepseek/deepseek-chattodeepseek/deepseek-v4-flashacross the RAG chat model docs, theDEEPSEEK_API_KEY-based fallback inEquationTool, and example scripts, ahead ofdeepseek-chat's deprecation on 24th July 2026. -
Replaced the several ad-hoc "is this really an element" checks above with one shared boundary-detection function,
_formula_prefix_end, that determines how much of a string is genuinely valid formula content. This also fixed a further case the old checks missed — a trailing annotation with its own real element letter right after a number (e.g."C"for Celsius in"...PbTiO3 (calcined at 660°C)") — and ensures any future case of this shape is handled by the same rule rather than needing another bespoke patch. -
Handled multi-word property keywords (e.g., thermal conductivity) for accurate Scopus search, uniform filename handling (
thermal conductivityresolves tothermal_conductivity_metadata.csvor similar) and restoring the original formthermal conductivityin the data extraction RAG search query instead ofthermal_conductivity. This fix is associated with #5 and contributed by @WilmerGaspar. -
Fixed DOI-to-folder-name conversion across
extract_flow(RAGTool,GraphExtractorTool,EquationTool,DataExtractionFlow, and all crew log/output folder paths) to also replace:with_(not just/), so DOIs like10.1023/A:1015522900295no longer raiseWinError 267: The directory name is invalidon Windows and correctly resolve to their saved figure/vector-DB/log directories. -
Previously, a new
MultiModelEmbeddingsinstance (and thus a fresh copy of the PhysBERT model) was loaded onto the GPU for every paper processed, becauseRAGTool → VectorDatabaseManager → MultiModelEmbeddingswere all re-instantiated per paper. After certain number of papers this exhausted VRAM withcudaErrorMemoryAllocation(Refer to issue #6). This fix introduces a class-level_hf_model_cachedict on MultiModelEmbeddings so the tokenizer and model are loaded onto the GPU exactly once and shared as references across all subsequent instances. Also explicitly delete intermediate CUDA tensors and calltorch.cuda.empty_cache()after each embedding call to prevent activation memory from accumulating within a paper's processing. Added the same cache flush inVectorDatabaseManager.create_databaseandquery_databaseaftergc.collect(). This fix is associated with PR #7.
New Contributors
- @WilmerGaspar made their first contribution in #5
Full Changelog: v2026.5.19...v2026.8.11