From f90f1341ea5f708a57b49ffc53b55f125d73e6a4 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Tue, 29 Oct 2024 14:16:15 +0100 Subject: [PATCH 01/15] update to docling v2 and expose new parameters Signed-off-by: Michele Dolfi --- .../language/pdf2parquet/python/README.md | 22 ++- .../pdf2parquet/python/pyproject.toml | 2 +- .../pdf2parquet/python/requirements.txt | 8 +- .../python/src/pdf2parquet_transform.py | 153 +++++++++++++++--- .../language/pdf2parquet/ray/pyproject.toml | 2 +- .../language/pdf2parquet/ray/requirements.txt | 10 +- 6 files changed, 159 insertions(+), 38 deletions(-) diff --git a/transforms/language/pdf2parquet/python/README.md b/transforms/language/pdf2parquet/python/README.md index 4ba825530..2ec8bfb12 100644 --- a/transforms/language/pdf2parquet/python/README.md +++ b/transforms/language/pdf2parquet/python/README.md @@ -1,9 +1,21 @@ # Ingest PDF to Parquet -This tranforms iterate through PDF files or zip of PDF files and generates parquet files -containing the converted document in Markdown format. +This tranforms iterate through document files or zip of files and generates parquet files +containing the converted document in Markdown or JSON format. The PDF conversion is using the [Docling package](https://github.com/DS4SD/docling). +The Docling configuration in DPK is tuned for best results when running large batch ingestions. +For more details on the multiple configuration options, please refer to the official [Docling documentation](https://ds4sd.github.io/docling/). + +This transform supports the following input formats: + +- PDF documents +- DOCX documents +- PPTX presentations +- Image files (png, jpeg, etc) +- HTML pages +- Markdown documents +- ASCII Docs documents ## Output format @@ -17,6 +29,7 @@ with the addition of the following columns "filename": "string", // the basename of the PDF file "contents": "string", // the content of the PDF "document_id": "string", // the document id, a random uuid4 + "document_hash": "string", // the document hash of the input content "ext": "string", // the detected file extension "hash": "string", // the hash of the `contents` column "size": "string", // the size of `contents` @@ -36,9 +49,12 @@ The transform can be initialized with the following parameters. | Parameter | Default | Description | |------------|----------|--------------| | `artifacts_path` | | Path where to Docling models artifacts are located, if unset they will be downloaded and fetched from the [HF_HUB_CACHE](https://huggingface.co/docs/huggingface_hub/en/guides/manage-cache) folder. | -| `contents_type` | `text/markdown` | The output type for the `contents` column. Valid types are `text/markdown` and `application/json`. | +| `contents_type` | `text/markdown` | The output type for the `contents` column. Valid types are `text/markdown`, `text/plain` and `application/json`. | | `do_table_structure` | `True` | If true, detected tables will be processed with the table structure model. | | `do_ocr` | `True` | If true, optical character recognition (OCR) will be used to read the content of bitmap parts of the document. | +| `ocr_engine` | `easyocr` | The OCR engine to use. Valid values are `easyocr`, `tesseract`, `tesseract_cli`. | +| `bitmap_area_threshold` | `0.05` | Threshold for running OCR on bitmap figures embedded in document. The threshold is computed as the fraction of the area covered by the bitmap, compared to the whole page area. | +| `pdf_backend` | `dlparse_v2` | The PDF backend to use. Valid values are `dlparse_v2`, `dlparse_v1`, `pypdfium2`. | | `double_precision` | `8` | If set, all floating points (e.g. bounding boxes) are rounded to this precision. For tests it is advised to use 0. | When invoking the CLI, the parameters must be set as `--pdf2parquet_`, e.g. `--pdf2parquet_do_ocr=true`. diff --git a/transforms/language/pdf2parquet/python/pyproject.toml b/transforms/language/pdf2parquet/python/pyproject.toml index c069300b5..f19b8e049 100644 --- a/transforms/language/pdf2parquet/python/pyproject.toml +++ b/transforms/language/pdf2parquet/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dpk_pdf2parquet_transform_python" -version = "0.2.2.dev1" +version = "0.3.0" requires-python = ">=3.10,<3.13" description = "PDF2PARQUET Python Transform" license = {text = "Apache-2.0"} diff --git a/transforms/language/pdf2parquet/python/requirements.txt b/transforms/language/pdf2parquet/python/requirements.txt index d90658fc7..1e80b5077 100644 --- a/transforms/language/pdf2parquet/python/requirements.txt +++ b/transforms/language/pdf2parquet/python/requirements.txt @@ -1,6 +1,6 @@ data-prep-toolkit==0.2.2.dev1 -docling-core==1.7.2 -docling-ibm-models==2.0.0 -deepsearch-glm==0.22.0 -docling==1.20.0 +docling-core==2.2.2 +docling-ibm-models==2.0.1 +deepsearch-glm==0.26.1 +docling==2.2.1 filetype >=1.2.0, <2.0.0 diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py index 1ca559d33..418d24c97 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py @@ -27,10 +27,19 @@ from data_processing.transform import AbstractBinaryTransform, TransformConfiguration from data_processing.utils import TransformUtils, get_logger, str2bool from data_processing.utils.cli_utils import CLIArgumentProvider -from docling.datamodel.base_models import DocumentStream -from docling.datamodel.document import ConvertedDocument, DocumentConversionInput -from docling.document_converter import DocumentConverter -from docling.pipeline.standard_model_pipeline import PipelineOptions +from docling.backend.docling_parse_backend import DoclingParseDocumentBackend +from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend +from docling.backend.pypdfium2_backend import PyPdfiumDocumentBackend +from docling.datamodel.base_models import DocumentStream, MimeTypeToFormat +from docling.datamodel.pipeline_options import ( + EasyOcrOptions, + OcrOptions, + PdfPipelineOptions, + TesseractCliOcrOptions, + TesseractOcrOptions, +) +from docling.document_converter import DocumentConverter, InputFormat, PdfFormatOption +from docling.models.base_ocr_model import OcrOptions logger = get_logger(__name__) @@ -41,20 +50,45 @@ pdf2parquet_contents_type_key = f"contents_type" pdf2parquet_do_table_structure_key = f"do_table_structure" pdf2parquet_do_ocr_key = f"do_ocr" +pdf2parquet_ocr_engine_key = f"ocr_engine" +pdf2parquet_bitmap_area_threshold_key = f"bitmap_area_threshold" +pdf2parquet_pdf_backend_key = f"pdf_backend" pdf2parquet_double_precision_key = f"double_precision" class pdf2parquet_contents_types(str, enum.Enum): MARKDOWN = "text/markdown" + TEXT = "text/plain" JSON = "application/json" def __str__(self): return str(self.value) +class pdf2parquet_pdf_backend(str, enum.Enum): + PYPDFIUM2 = "pypdfium2" + DLPARSE_V1 = "dlparse_v1" + DLPARSE_V2 = "dlparse_v2" + + def __str__(self): + return str(self.value) + + +class pdf2parquet_ocr_engine(str, enum.Enum): + EASYOCR = "easyocr" + TESSERACT_CLI = "tesseract_cli" + TESSERACT = "tesseract" + + def __str__(self): + return str(self.value) + + pdf2parquet_contents_type_default = pdf2parquet_contents_types.MARKDOWN pdf2parquet_do_table_structure_default = True pdf2parquet_do_ocr_default = True +pdf2parquet_bitmap_area_threshold_default = 0.05 +pdf2parquet_ocr_engine_default = pdf2parquet_ocr_engine.EASYOCR +pdf2parquet_pdf_backend_default = pdf2parquet_pdf_backend.DLPARSE_V2 pdf2parquet_double_precision_default = 8 pdf2parquet_artifacts_path_cli_param = f"{cli_prefix}{pdf2parquet_artifacts_path_key}" @@ -63,6 +97,11 @@ def __str__(self): f"{cli_prefix}{pdf2parquet_do_table_structure_key}" ) pdf2parquet_do_ocr_cli_param = f"{cli_prefix}{pdf2parquet_do_ocr_key}" +pdf2parquet_bitmap_area_threshold__cli_param = ( + f"{cli_prefix}{pdf2parquet_bitmap_area_threshold_key}" +) +pdf2parquet_ocr_engine_cli_param = f"{cli_prefix}{pdf2parquet_ocr_engine_key}" +pdf2parquet_pdf_backend_cli_param = f"{cli_prefix}{pdf2parquet_pdf_backend_key}" pdf2parquet_double_precision_cli_param = ( f"{cli_prefix}{pdf2parquet_double_precision_key}" ) @@ -93,19 +132,62 @@ def __init__(self, config: dict): pdf2parquet_do_table_structure_key, pdf2parquet_do_table_structure_default ) self.do_ocr = config.get(pdf2parquet_do_ocr_key, pdf2parquet_do_ocr_default) + self.ocr_engine_name = config.get( + pdf2parquet_ocr_engine_key, pdf2parquet_ocr_engine_default + ) + if not isinstance(self.ocr_engine_name, pdf2parquet_ocr_engine): + self.ocr_engine_name = pdf2parquet_ocr_engine[self.ocr_engine_name] + self.bitmap_area_threshold = config.get( + pdf2parquet_bitmap_area_threshold_key, + pdf2parquet_bitmap_area_threshold_default, + ) + self.pdf_backend_name = config.get( + pdf2parquet_pdf_backend_key, pdf2parquet_pdf_backend_default + ) + if not isinstance(self.pdf_backend_name, pdf2parquet_pdf_backend): + self.pdf_backend_name = pdf2parquet_pdf_backend[self.pdf_backend_name] self.double_precision = config.get( pdf2parquet_double_precision_key, pdf2parquet_double_precision_default ) logger.info("Initializing models") - pipeline_options = PipelineOptions( + pipeline_options = PdfPipelineOptions( + artifacts_path=self.artifacts_path, do_table_structure=self.do_table_structure, do_ocr=self.do_ocr, + ocr_options=self._get_ocr_engine(self.ocr_engine_name), ) + pipeline_options.ocr_options.bitmap_area_threshold = self.bitmap_area_threshold + self._converter = DocumentConverter( - artifacts_path=self.artifacts_path, pipeline_options=pipeline_options + format_options={ + InputFormat.PDF: PdfFormatOption( + pipeline_options=pipeline_options, + backend=self._get_pdf_backend(self.pdf_backend_name), + ) + } ) + def _get_ocr_engine(self, engine_name: pdf2parquet_ocr_engine) -> OcrOptions: + if engine_name == pdf2parquet_ocr_engine.EASYOCR: + return EasyOcrOptions() + elif engine_name == pdf2parquet_ocr_engine.TESSERACT_CLI: + return TesseractCliOcrOptions() + elif engine_name == pdf2parquet_ocr_engine.TESSERACT: + return TesseractOcrOptions() + + raise RuntimeError(f"Unknown OCR engine `{engine_name}`") + + def _get_pdf_backend(self, backend_name: pdf2parquet_pdf_backend): + if backend_name == pdf2parquet_pdf_backend.DLPARSE_V1: + return DoclingParseDocumentBackend + elif backend_name == pdf2parquet_pdf_backend.DLPARSE_V2: + return DoclingParseV2DocumentBackend + elif backend_name == pdf2parquet_pdf_backend.PYPDFIUM2: + return PyPdfiumDocumentBackend + + raise RuntimeError(f"Unknown PDF backend `{backend_name}`") + def _update_metrics(self, num_pages: int, elapse_time: float): # This is implemented in the ray version pass @@ -116,26 +198,26 @@ def _convert_pdf2parquet( # Convert PDF to Markdown start_time = time.time() buf = io.BytesIO(content_bytes) - input_docs = DocumentStream(filename=doc_filename, stream=buf) - input = DocumentConversionInput.from_streams([input_docs]) + input_doc = DocumentStream(name=doc_filename, stream=buf) - converted_docs = self._converter.convert(input) - doc: ConvertedDocument = next(converted_docs, None) - if doc is None or doc.output is None: - raise RuntimeError("Failed in converting.") + conv_res = self._converter.convert(input_doc) + doc = conv_res.document elapse_time = time.time() - start_time if self.contents_type == pdf2parquet_contents_types.MARKDOWN: - content_string = doc.render_as_markdown() + content_string = doc.export_to_markdown() + elif self.contents_type == pdf2parquet_contents_types.TEXT: + content_string = doc.export_to_text() elif self.contents_type == pdf2parquet_contents_types.JSON: content_string = pd.io.json.ujson_dumps( - doc.render_as_dict(), double_precision=self.double_precision + doc.export_to_dict(), double_precision=self.double_precision ) else: raise RuntimeError(f"Uknown contents_type {self.contents_type}.") num_pages = len(doc.pages) - num_tables = len(doc.output.tables) if doc.output.tables is not None else 0 - num_doc_elements = len(doc.output.main_text) if doc.output.main_text is not None else 0 + num_tables = len(doc.tables) + num_doc_elements = len(doc.texts) + document_hash = doc.origin.binary_hash self._update_metrics(num_pages=num_pages, elapse_time=elapse_time) @@ -146,6 +228,7 @@ def _convert_pdf2parquet( "num_tables": num_tables, "num_doc_elements": num_doc_elements, "document_id": str(uuid.uuid4()), + "document_hash": document_hash, "ext": ext, "hash": TransformUtils.str_to_hash(content_string), "size": len(content_string), @@ -172,11 +255,13 @@ def transform_binary( number_of_rows = 0 try: + # TODO: Docling has an inner-function with a stronger type checking. + # Once it is exposed as public, we can use it here as well. root_kind = filetype.guess(byte_array) - # Process single PDF documents - if root_kind is not None and root_kind.mime == "application/pdf": - logger.debug(f"Detected root file {file_name=} as PDF.") + # Process single documents + if root_kind is not None and root_kind.mime in MimeTypeToFormat: + logger.debug(f"Detected root file {file_name=} as {root_kind.mime}.") try: root_ext = root_kind.extension @@ -195,10 +280,10 @@ def transform_binary( except Exception as e: failed_doc_id.append(file_name) logger.warning( - f"Exception {str(e)} processing file {archive_doc_filename}, skipping" + f"Exception {str(e)} processing file {file_name}, skipping" ) - # Process ZIP archive of PDF documents + # Process ZIP archive of documents elif root_kind is not None and root_kind.mime == "application/zip": logger.debug( f"Detected root file {file_name=} as ZIP. Iterating through the archive content." @@ -218,9 +303,9 @@ def transform_binary( # Detect file type kind = filetype.guess(content_bytes) - if kind is None or kind.mime != "application/pdf": + if kind is None or kind.mime not in MimeTypeToFormat: logger.info( - f"File {archive_doc_filename=} is not detected as PDF but {kind=}. Skipping." + f"File {archive_doc_filename=} is not detected as valid format {kind=}. Skipping." ) skipped_doc_id.append(archive_doc_filename) continue @@ -248,7 +333,7 @@ def transform_binary( else: logger.warning( - f"File {file_name=} is not detected as PDF nor as ZIP but {kind=}. Skipping." + f"File {file_name=} is not detected as a supported type nor as ZIP but {kind=}. Skipping." ) table = pa.Table.from_pylist(data) @@ -311,6 +396,26 @@ def add_input_params(self, parser: ArgumentParser) -> None: help="If true, optical character recognition (OCR) will be used to read the PDF content.", default=pdf2parquet_do_ocr_default, ) + parser.add_argument( + f"--{pdf2parquet_ocr_engine_cli_param}", + type=pdf2parquet_ocr_engine, + choices=list(pdf2parquet_ocr_engine), + help="The OCR engine to use.", + default=pdf2parquet_ocr_engine.EASYOCR, + ) + parser.add_argument( + f"--{pdf2parquet_bitmap_area_threshold__cli_param}", + type=float, + help="Threshold for running OCR on bitmap figures embedded in document. The threshold is computed as the fraction of the area covered by the bitmap, compared to the whole page area.", + default=pdf2parquet_bitmap_area_threshold_default, + ) + parser.add_argument( + f"--{pdf2parquet_pdf_backend_cli_param}", + type=pdf2parquet_pdf_backend, + choices=list(pdf2parquet_pdf_backend), + help="The PDF backend to use.", + default=pdf2parquet_pdf_backend.DLPARSE_V2, + ) parser.add_argument( f"--{pdf2parquet_double_precision_cli_param}", type=int, diff --git a/transforms/language/pdf2parquet/ray/pyproject.toml b/transforms/language/pdf2parquet/ray/pyproject.toml index 5699dcc8c..5e192c8ac 100644 --- a/transforms/language/pdf2parquet/ray/pyproject.toml +++ b/transforms/language/pdf2parquet/ray/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dpk_pdf2parquet_transform_ray" -version = "0.2.2.dev1" +version = "0.3.0" requires-python = ">=3.10,<3.13" description = "PDF2PARQUET Ray Transform" license = {text = "Apache-2.0"} diff --git a/transforms/language/pdf2parquet/ray/requirements.txt b/transforms/language/pdf2parquet/ray/requirements.txt index afe1c8bbf..2952e499f 100644 --- a/transforms/language/pdf2parquet/ray/requirements.txt +++ b/transforms/language/pdf2parquet/ray/requirements.txt @@ -1,7 +1,7 @@ -dpk-pdf2parquet-transform-python==0.2.2.dev1 +dpk-pdf2parquet-transform-python==0.3.0 data-prep-toolkit[ray]==0.2.2.dev1 -docling-core==1.7.2 -docling-ibm-models==2.0.0 -deepsearch-glm==0.22.0 -docling==1.20.0 +# docling-core==1.7.2 +# docling-ibm-models==2.0.0 +# deepsearch-glm==0.22.0 +# docling==1.20.0 filetype >=1.2.0, <2.0.0 From 143648019d10c78d0e614969bd29342917586662 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Tue, 29 Oct 2024 15:48:32 +0100 Subject: [PATCH 02/15] update to docling v2 new parameters and input formats faster backend revalidated the test results Signed-off-by: Michele Dolfi --- .../test-data/expected/archive1.parquet | Bin 22800 -> 23361 bytes .../python/test-data/expected/metadata.json | 17 +++++---- .../test-data/expected/redp5110-ch1.parquet | Bin 9286 -> 9683 bytes .../test-data/expected_json/archive1.parquet | Bin 22262 -> 10880 bytes .../test-data/expected_json/metadata.json | 17 +++++---- .../expected_json/redp5110-ch1.parquet | Bin 10965 -> 12073 bytes .../archive1.parquet | Bin 18288 -> 19976 bytes .../expected_md_no_table_no_ocr/metadata.json | 17 +++++---- .../redp5110-ch1.parquet | Bin 9286 -> 9683 bytes .../python/test/test_pdf2parquet_python.py | 34 ++++++++++-------- .../ray/test-data/expected/archive1.parquet | Bin 22800 -> 23361 bytes .../ray/test-data/expected/metadata.json | 17 +++++---- .../test-data/expected/redp5110-ch1.parquet | Bin 9286 -> 9683 bytes 13 files changed, 60 insertions(+), 42 deletions(-) diff --git a/transforms/language/pdf2parquet/python/test-data/expected/archive1.parquet b/transforms/language/pdf2parquet/python/test-data/expected/archive1.parquet index 9975c36080eb7bebeea022b6a6ff205ab73d1598..907fb3803409984ec6c0877bd457432d2d3f8e1e 100644 GIT binary patch literal 23361 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 B?E(M* literal 9286 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 OAT&1!WDfiX(SHHsPqgg- diff --git a/transforms/language/pdf2parquet/python/test-data/expected_json/archive1.parquet b/transforms/language/pdf2parquet/python/test-data/expected_json/archive1.parquet index 033452371f6caff4728ac9e8067da5dce9532c78..7f34e1ba88d2cf2783bd056ca1fd6466e49f88da 100644 GIT binary patch literal 10880 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 literal 22262 zcmeHv2UrtZw`c;WD5$8wK|~!<5j27Hf*^z{MWjhpagt05ge0WUYzM`9R1^^_#fl!q zf`SzbDmD(Ff`A1*pn}*H8wkEV11M^|@BQ!o_uTv5$9$TZ*|YcRYwbO2ufdn&Pd3sq znq{Q$1}EHL9L_S|rVSz`;cTT59jDfQ>q-f}8VyFo!K!#!N>w&{*fg2q>UR%rJl$M#1{!luu zx4}>oU4dAFNa1M2NZ(k;c(s=C5iN^!yoK(+ifAZGBF;z)2Yw8|35Nssr&eegy>aO- zgIOb-<}SlU_B&2=^mSibfCp0OIEI8+N@!2lJu()zo~p2PEseRaH|)+V(RDQHXprz-T3CBpa(fC z8)795m)btg<6WKS+qltpcK!MxE7h@?ZHIjBHYGVPT(w{Q!Yf+YaOrss(h!jy<3?pS zJ0E|_)4SNd*txAg>CzbA+>2H_3nPWAM#5tonVA-uk2h}aJNtgw$WQ7er)}&_oBi!> zjaV2NIwil?x~K_W@x8}LFhuxWf|2nHG@ z2Vx(GjvO}9=}U%Ui*%Jd_hx13vmt^u-D{0GE2&}a$wU7l*gG2Z^23`ajZX-HD#xy{ zT)NIOGRB9j7q}{Ppq|TuXw&4P^IGES38M^07*9@r#rDf_U-~D`4<@djKi$bN^~u9h zFMd+_dWMtXn~?J^j~{J2)*H?vSqzCty)>r(=f{@Og{}ovrVV<^v6Q?7{Yk|M=DcLR zt*;I`zH+YKdcnbZR3y>hbBfn8?WImzn8Ji2lj$kBJLn@uhx1pghBLhkh1Jv-K0|&J ztl59)@~P0iD&iz}53^9nAl5R;^1_<&h+WC^`PUv0Abw|mBBQ8 z9h~&wl7DiM)}B~_xOQoTdA}>~wp)d5lYMh91d%po#oPkWA8(FfQFCFfx=ml_LjQ4SUJXvtg5$ongv7=k5#9V zrk#TioS*43R__9Avkkh%YbsrEd+Ba|lJBrVk8qLo_@ypm2M*NJaX!*ep|w7&bdSy? zfp&J5>`A@T+8b+)?xU#Q-Dj@4n zVup{<_Tm#(Ky3buGq2-;EicaO`z|1-dE|A^nMeB)4f|xzT*}K^?em!rMNpNMXYQ5QCzP|Jm1Qx-|^R&cV8AMg6||0e110M zUGdRWgQ_ zYi3O9d(VvFSAj?ZqSGF_U$83tFnAFgnadNDQG>GvmzR)_ksd(-KJXQsDe3p#W{$>7 z-v;A8iR<5iBbA` zxO-BNBk8?ww1X(0d9-EXqmKzruM?d~1Lr!NNXNgoh;cY^>s+PmMT*&-Gk=wz6_w+o z;XKY*Eb=jb> znBRkFN2kPkRZ2VJxW7FZ7-uBA&mg@@(vJNw8nQNRIt>D=&f6G2lA6#Dj)S=Xo z7k+Q+q1+)?Yd7ex%ncYu{;lze@5$_}Nrpn_h)dPKi9QWFQa)(aNd4jV@?>Unn|SM} zD*`*49ohL8tuC=H(sI()Sq249d_A}Kt;DB$cF-$Rb8Z*C$-m(&YKjT6oU}d5R(wP+ z{Y_vh>*BGTYHpe8MOwW|J~_nUrW1AVC=)|V`J6^qp7n#ofGg*)pRGgN# zY1hXnQ!AsLF?{8%qH3E(_P?Ehi7k0ELkDj-dvuf5qky!k>E3BOIgNMo92@4$8Spms zX!@Afx3cqQCb$+q4$jN0CoYq)Yj5$4kAAL8^_Y*mt~A#E&BBkcOwUp0g)l0^rB}fN zt)#py16*=@6`3GO{Kky~M;Xf7L{~u&M8Xf}`{Ywwb&}i-U3%&2?i|Yd!(69gjI5WuJZj&b254bP?k-E+;e2WSE|ck3w}}c(F8Zf83~m@90b`2k?}8S3 z1+0i#ZvUZHDdQ9u>aOS`v+^car`6SlXTQl#OeyR&{(x2Qs(@0f<-1NjGE-eu^cz2g z^SJO`?G3|)Q`n6`MV6^S8(i1W*0K=sim3hMhP2+Bm3oZg{QOLXb&OB`F4FQ|cX;Wu zy~8&ZJ-A^av4+!cRfmUp4c<+=NXQ-AH*izpe&SzyZcSHuM|lNos#6CTN)oJN2Ap{p%Ud6o z*F4Oob$E*XNlEAo*rTDsH%iI0PIz{y&8>A}w%xE?oLKPM>84BmkTSP`^$gDv@0{J03m><< zmI?K*=Z-W*W2@O6MINo7<>{(tA$Kc;r$)Lm-bcjkyE-z)zG=xDr9>2oZmFzc{ajK9a5(>~*_c=p%Ve_mbs zZrF|1t#^Gh`yVMf>{T|^o;Qr1UNt(?|Ki5ir?R$3Ea6@|x-6%3dc(S~p!HRNpovBI zulK8Z@-}h%myOw{-)>zIkvJzb%YO+sq7|2N`(!(FQ{!1L<&>6NW( z#%26<;oafnmwn#Hg?JV^oKQMc)!0NoTVj%X`OD=!pYDM0dFNzl`_lml!<*bQZ@8^l zIpg_?n=z+jGNf8MGoF{^C62p%=Ir^Q+h+Wp{rbYdrpk#^-~WB&fZFutdPZa)J>vYL zXLIad`}(jLuWP6;+;6^lIdNabZbmFMlbjh{3Z@;!dX?T?VSn&o?a?6pnkcW2$p zC{!?6f1mcMKNh8xQ5PR=GMiU6x^_QrN$4m$ruB}6V>fuHN6|N5@W|N2Z?nqrQUC7t zep!4N#oBnCVd&&*e@nb>_bPq4)1=queQ!ihCvC60=dsr6bxeCC{_O2UVeV+pveL~P z_g|f`;hsgo;5%jo6V6}xWAvC)C!6LNkJxUKb-mhSFK5A-%zU$w+0-L&db&Z&UQ%M6 z>v7JyC|~-(yUhMJz7vV^16%Q*qL6g{`V^g2LDzbxc~}pya9Q|KWPE?{+K6lC?jaSb znwR$ul9N`>_ZY9gYWlJ>qt@L})Gb{|_!M|{rR9aGfB0|sji6}VdM$X?^64#co2{Q2 zXOGDtPa2TFdBZhGWku@J<>>u+ux(Cd~Pfl z-e>U6(%__nmygZPt;u-Q=f8TlWjELhm4R#r=7wrrIIhCmxks95XWx9eVTRwo?cC0c?AIfW zj;Q*~;=Q9#_=Bl^3T4N~j$GGfw{rBcsk53LkDMDFaIIpCH0rZDYIcP@W-&5+-FyG= z1fT1f>xGktKRvNBFiA&CN|PG5%w&=HJ{y8A$C;kl_=u>88yfKE5u~x<;7cFvezao) zMlZmBP>neqGmPi34JjS}DtNA{AAR&z-UG46Yz{X6Tw{-r0PQW=`v_&6d4h z>FpkFPwEHQIHPcJS@#b4R;xuQa`%p+3L(`nCZC?K?Sd>(1;WK5{K_EW1+|r2G6v zpG3)g_vVsxi>4%&aD{*IGws{2cDiH*Iz0`|m5y4PIvIERdDa!n5)V;np?m4$fcnsN zcN!$oIfk>^`?a~YzpFA$nsjsvt*G{iNm^NPd-b5c)74G(+Ac!!sQxFbwh#9)D|RG#KWNrn^S80vlSQl2 zPmTQY@z%xyPHSZNnk~ZcVH$EkZ${2Gk3iEl=Cxn zN}fV2SBYg(bKBYG5}8nGZW}&hF2Nj4`VhrZfedZ$$^ZcXnlei$piY=X5v&w}Zd5YN zVj?h~!iQN1i^gKp$y8WCrtnDML?@HT2$#oaB20wLWKgLviNqq)Np!Y=&O-z=28#ti zjwZ@sAp+em}h$ui~r!IZFHO?i>{@N_&sniPO+hBoM z*l|Bbfd~MDqo><+G%2Uskj&AMKe9t1QwVe#n?NIx2y`Y{BSREgcZOVKJc(E;gaQ$s zNGj&R638Es%M_>-J6TYwxhk;=n34pEMI=O2;+=d1AUxFUh@uYuG!n$366hoG{T2`V5JfUPsBVCB0(S*nM5Fle8f>Q z2`p1W-r`tTB@#=)r7w*B1_2FAVI|~@prf1+g+iv3iy?nFTC4=%RVqXVO$82&s8nLe z4d#krDF7nnOSmvffETQkgOiI`8YO`NFbSeafPxV&X!BO{0Ng1ug;)xCNQKcTQHVGa zJP8sl{2nm37_`0}3U4b3~V`DqK%^LDhL4XjsEDlkC;oJmBse)AqQ6?a& zLkBVxAaGagqcGbmPgQ0Yb4V z0TRIqejKbofQ%p*QbxlP2>{s1Dp$=HA}VVrP=tUXe6$nr009i70Q$+|I_Slu2*L*t zm6$7*pioh~Fdra5X_5&bDG~<>5EzZeO6*|=yVn1Ac1b3&2oyS ztU@l6t0f==!*V%ry$)jJXn0ou6IQALHo(6EQ7OboEG!|yY9YF60}ceH2Sm})-_oDs z4lEy?UBM)WN*YC`KuJZN8%2pka}hot3haw6zLI4l~73!h{h$oS$!B~L+=s+q|Lg5em!>|b5-WAADLnGD3SZwqeht);V3)4H3AF7w%7{lfw)eT|m= z-NFZbkLdoA^dF)F;5y%YG`_`A=nMjb0?^ZG1SXlS5jm;5Q+>nT`HqFX;-M~ty*v}l z5fB5gCgC;9b8VYj#2 zo~*$?oHfw+Wrl%~xwnzlw@*`aIXE01BpA@+$8rM`-L5C!u8eV(8d|~NA3rzI!C7o7 z0T~LN&hJh7O4ZR3s5x|`D30Nc@8T^!U&ULTzKS>d2LIdDFEDB33PQQ+_Q8#TD-LIX z2aHk90$#uWkmef(6J3mL@bf*cu2v0Pfsbg4%eryZ59JEWaCWeD8DndADc+*#ukYFF z0{RP7zhH~+M7OIiiu31I&Fm%L?8cq}${yGoi~!pR=q|-q zCZFLg9$&{>Y`Bgx`7`KWAk@fYHr{A8{yR2(+weH8ivtX@=>uI7akKcI;wYmJe+D7D z5)atzAFfAx62q;vJv8r+bW;~YE!WYP_iPV!Fp_7`o<6R5AtjoC#-B`?fwLS#5zr7i zolYat*$AIVWAn&FE}zXJA~2Ih=21y7lP@qCLm@Nx41~oef=y$DNTaeSL^jMM5qUI( z$zqdPbUvS^S#lq%x+UcFx^`3}#C$9#m!@r;u5FQe3vW?Zfk$(4|4w=|3U+`I^qs5s zVdHSxfOO3tmuZ7$6ZA&|bHJDL?sQ{L8*G$fOeGp;;w{Q=<1Nx|V?2EWqLHH2T1J<@ zSM}0+TDS$5jZjtRZk&HOA^do%UE3L>zVRuAaQQavaL+!y_r9=Nby6-gk8IEjv}zQc z&Uy%6I=r!O>|Luh7f$ZJw}0(2e^@uXdf$YKu`OB;{}@%fcJ=-@S(fg?gf zD~1>}m`visJUW9x0~?MMgvSL{L<}k&6f!YsWEPuA1qDtd9+gby(YOei$AI}HE*;b| znK;tu3?7Y5Cc!*1k4$6mNGzC2VuDf@8kbKZ)9Fmmjlrc0xLi;M#pY5G0a_r%Win_y z0UJQlAYl+!-aqIjVI8y-3KMa&j`3+7i|ksw#j(4XjQ=Mvpi#S!(a+Ip3>7d7jyD54 z&Ob-1t{x`3U478t@pCH}|Kk(`g!bT3w`irK1Y5kA&_Eal5vu4R-lDl4jZi;>`vnq> zjKv$tzl%?HbMZKpmMNeJE$kwaNklR$ki@Vhv2CerYc`ujVbEzLYc`WkWzzAu#Z%e% zANdCUZ~D{VuVYMpe)bixW;wii(#?4KgFQJU0_Mf2!R}Q@^f{|#d{xULuMuyts{ym3 zpE3NOVb>@iO_~REI%+R{?*Ps?yGbt{ev|+<`C>gfreU-Xs+6vA-&#S72F+JI2ORh7 zTwEA{xE0Z{qp6AjTm9Xwpa57x<5ScMeg^#uguiC8+serROvd^EB(~=li;%4o#quAS z1Zvjr{@modI}MD1NW1uTH&qVoC}N4|D%HfS`yk%90&nsAE4)SCOH7&HLHz-TCSHc# zrQ=L`gCZ*=8a6V)8R?JJ`u08WSe&;Rpsb^@Yg?(SQ3v$=wvq#%`hxpzYoLyXpH>YW zz`9R~UGPxM=xoyc9*ccl4JZQ4uRCCTZ`xg*`hiYAnLx*Y9|hPs#8_vj+0c@I=!0mB zo~^o`0$*S7>eIa{wyW;9r@$9fF$eV&`1Ta|_7wQ`6!`WO_+mBQJq5mKS!+*$Z%=`5 zPk}EecI_$f?J4m6@gqgFq_(HP_y3au-=C8-|J3H$KenA^@y~87S^SUMjrlihpZq_* zKkyG^>Mi~oli(KrY&!bCK1pm`Td!rTW1(xjA`=h(MCDL36Mc@q|I}dHj;yiCu|78F z!Qwb`I2=FlA3eM{oH&k?kmJVT2szF|tj)=Z!w!|4Y+Y~^2Zu6%;><*!xugC zC}8g`+D8&X36pc(gVdqHWC_P7k`0)cW)s^no)eFakfFcb#$){P-2J0NC_b@VX_$m3 z^%wBnC8{v+1n>(84@J)%htSEd3*Im2@j*L=xx10Vg4m)^sv8*&@sxz2jjn+cY-}cQ zy2f)vXd?g)j&Ae-!Jzy|7$|-qq^QpR9L_ZK-Z`#od?$X5<6(EVL>TSPaps}@DZWe_ z8&tf0(=ez&iRcaXi~XR_+=FO*jtfSg%@6%2W1YVBcgFhr$A(gaRAIq%QV2y7#hIE2 z_+!aX(*fO`I{Ax2hj!x+1HzRCsX{1VJee&4`oduFP?#L&(9ZFl{5nPb0FUayj^nTOo@>zZmTJ3kwWu@JAMg VmVh0g|Ls4V2iOAj1%L7Oe*tuP9rpkL diff --git a/transforms/language/pdf2parquet/python/test-data/expected_json/metadata.json b/transforms/language/pdf2parquet/python/test-data/expected_json/metadata.json index a38a938a3..04bec2b88 100644 --- a/transforms/language/pdf2parquet/python/test-data/expected_json/metadata.json +++ b/transforms/language/pdf2parquet/python/test-data/expected_json/metadata.json @@ -5,8 +5,8 @@ "job name": "pdf2parquet", "job type": "pure python", "job id": "job_id", - "start_time": "2024-10-18 06:09:35", - "end_time": "2024-10-18 06:09:44", + "start_time": "2024-10-29 14:20:01", + "end_time": "2024-10-29 14:20:07", "status": "success" }, "code": { @@ -19,6 +19,9 @@ "contents_type": "application/json", "do_table_structure": true, "do_ocr": true, + "ocr_engine": "easyocr", + "bitmap_area_threshold": 0.05, + "pdf_backend": "dlparse_v2", "double_precision": 0, "checkpointing": false, "max_files": -1, @@ -30,18 +33,18 @@ "num_processors": 0 }, "execution_stats": { - "cpus": 25.3, + "cpus": 18.0, "gpus": 0, - "memory": 29.52, + "memory": 30.77, "object_store": 0, - "execution time, min": 0.138 + "execution time, min": 0.105 }, "job_output_stats": { "source_files": 2, "source_size": 605137, "result_files": 2, - "result_size": 33227, - "processing_time": 5.64, + "result_size": 22953, + "processing_time": 6.282, "nrows": 3, "nsuccess": 3, "nfail": 0, diff --git a/transforms/language/pdf2parquet/python/test-data/expected_json/redp5110-ch1.parquet b/transforms/language/pdf2parquet/python/test-data/expected_json/redp5110-ch1.parquet index 5032919c582f07afb213ab9247eed90cd5da4946..32905aa74d9d9bdec26cb6d83c07c16dbd219bb5 100644 GIT binary patch literal 12073 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 diff --git a/transforms/language/pdf2parquet/python/test-data/expected_md_no_table_no_ocr/archive1.parquet b/transforms/language/pdf2parquet/python/test-data/expected_md_no_table_no_ocr/archive1.parquet index 58bcfcf6f93e90ec149ad8b7898db02bfb0a6aa3..9fec2cd2da1a5a12a7fae506e7d001b5451ec8ee 100644 GIT binary patch literal 19976 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 R{+WNg<*=BV34a6bzX7{|tb70f delta 5949 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 AMF0Q* literal 9286 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 diff --git a/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py b/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py index 1c5a694fc..dea550b39 100644 --- a/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py +++ b/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py @@ -19,8 +19,7 @@ from data_processing.test_support.launch.transform_test import ( AbstractTransformLauncherTest, ) -from docling_core.types import Document -from docling_core.types.doc.base import BaseText +from docling_core.types.doc import DocItem, DoclingDocument, TextItem from pdf2parquet_transform_python import Pdf2ParquetPythonTransformConfiguration from pydantic import ValidationError @@ -130,8 +129,10 @@ def validate_expected_row( # Test for Document type try: - expected_doc = Document.model_validate_json(expected_value) - test_doc = Document.model_validate_json(test_value) + expected_doc = DoclingDocument.model_validate_json( + expected_value + ) + test_doc = DoclingDocument.model_validate_json(test_value) cls.validate_documents( row_index=row_index, table_index=table_index, @@ -164,27 +165,32 @@ def validate_documents( cls, row_index: int, table_index: int, - test_doc: Document, - expected_doc: Document, + test_doc: DoclingDocument, + expected_doc: DoclingDocument, ): msg = f"Row {row_index} of table {table_index} are not equal\n\t" - assert(test_doc.main_text is not None, msg + "Test document has no content") - assert len(test_doc.main_text) == len(expected_doc.main_text), ( + assert len(test_doc.texts) == len(expected_doc.texts), ( msg + f"Main Text lengths do not match." ) - for i in range(len(expected_doc.main_text)): - expected_item = expected_doc.main_text[i] - test_item = test_doc.main_text[i] + for (expected_item, _expected_level), (test_item, _test_level) in zip( + expected_doc.iterate_items(), test_doc.iterate_items() + ): + if not isinstance(expected_item, DocItem): + continue + assert isinstance(test_item, DocItem), msg + "Test item is not a DocItem" # Validate type - assert expected_item.obj_type == test_item.obj_type, ( - msg + f"Object type does not match." + assert expected_item.label == test_item.label, ( + msg + f"Object label does not match." ) # Validate text content - if isinstance(expected_item, BaseText): + if isinstance(expected_item, TextItem): + assert isinstance(test_item, TextItem), ( + msg + "Test item is not a TextItem as the expected one" + ) assert expected_item.text == test_item.text, ( msg + f"Text does not match." ) diff --git a/transforms/language/pdf2parquet/ray/test-data/expected/archive1.parquet b/transforms/language/pdf2parquet/ray/test-data/expected/archive1.parquet index 9975c36080eb7bebeea022b6a6ff205ab73d1598..907fb3803409984ec6c0877bd457432d2d3f8e1e 100644 GIT binary patch literal 23361 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 B?E(M* literal 9286 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 OAT&1!WDfiX(SHHsPqgg- From 8c22f0d56be82fad872d32aa2e162db72f0ebff3 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 09:15:17 +0100 Subject: [PATCH 03/15] add lock Signed-off-by: Michele Dolfi --- .../python/src/pdf2parquet_transform.py | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py index 418d24c97..2100af39b 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py @@ -27,6 +27,7 @@ from data_processing.transform import AbstractBinaryTransform, TransformConfiguration from data_processing.utils import TransformUtils, get_logger, str2bool from data_processing.utils.cli_utils import CLIArgumentProvider +from data_processing.utils.multilock import MultiLock from docling.backend.docling_parse_backend import DoclingParseDocumentBackend from docling.backend.docling_parse_v2_backend import DoclingParseV2DocumentBackend from docling.backend.pypdfium2_backend import PyPdfiumDocumentBackend @@ -42,7 +43,8 @@ from docling.models.base_ocr_model import OcrOptions -logger = get_logger(__name__) +# logger = get_logger(__name__) +logger = get_logger(__name__, level="DEBUG") shortname = "pdf2parquet" cli_prefix = f"{shortname}_" @@ -159,14 +161,26 @@ def __init__(self, config: dict): ) pipeline_options.ocr_options.bitmap_area_threshold = self.bitmap_area_threshold - self._converter = DocumentConverter( - format_options={ - InputFormat.PDF: PdfFormatOption( - pipeline_options=pipeline_options, - backend=self._get_pdf_backend(self.pdf_backend_name), - ) - } - ) + lock = MultiLock("dpk_pdf2parquet_init") + try: + logger.debug( + f"Going to acquire lock {lock.lock_filename} for synchronizing global filesystem operations." + ) + # TODO: we want to use the lock without timeout, but the implementation must be fixed before + locked = lock.acquire(timeout=120) + logger.debug(f"Lock {lock.lock_filename} acquired.") + + self._converter = DocumentConverter( + format_options={ + InputFormat.PDF: PdfFormatOption( + pipeline_options=pipeline_options, + backend=self._get_pdf_backend(self.pdf_backend_name), + ) + } + ) + finally: + lock.release() + logger.debug(f"Lock {lock.lock_filename} released.") def _get_ocr_engine(self, engine_name: pdf2parquet_ocr_engine) -> OcrOptions: if engine_name == pdf2parquet_ocr_engine.EASYOCR: @@ -256,7 +270,7 @@ def transform_binary( try: # TODO: Docling has an inner-function with a stronger type checking. - # Once it is exposed as public, we can use it here as well. + # Once it is exposed as public, we can use it here as well. root_kind = filetype.guess(byte_array) # Process single documents From d55e6bd2c54fa521ba5f7a7ff701e294fc22a448 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 16:00:26 +0100 Subject: [PATCH 04/15] add batch_size Signed-off-by: Michele Dolfi --- .../python/src/pdf2parquet_local_python.py | 3 +- .../python/src/pdf2parquet_transform.py | 56 ++++++++++++++++--- .../python/test/test_pdf2parquet_python.py | 2 +- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_local_python.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_local_python.py index b6d450fc8..99b0b7f84 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_local_python.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_local_python.py @@ -32,13 +32,14 @@ params = { # Data access. Only required parameters are specified "data_local_config": ParamsUtils.convert_to_ast(local_conf), - "data_files_to_use": ast.literal_eval("['.pdf','.zip']"), + "data_files_to_use": ast.literal_eval("['.pdf','.docx','.pptx','.zip']"), # execution info "runtime_pipeline_id": "pipeline_id", "runtime_job_id": "job_id", "runtime_code_location": ParamsUtils.convert_to_ast(code_location), # pdf2parquet params "pdf2parquet_double_precision": 0, + # "pdf2parquet_batch_size": 10, # "pdf2parquet_do_table_structure": False, # "pdf2parquet_do_ocr": False, # "pdf2parquet_contents_type": "text/markdown", diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py index 2100af39b..29807ea99 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py @@ -19,7 +19,7 @@ from argparse import ArgumentParser, Namespace from datetime import datetime from pathlib import Path -from typing import Any +from typing import Any, Optional import filetype import pandas as pd @@ -48,6 +48,7 @@ shortname = "pdf2parquet" cli_prefix = f"{shortname}_" +pdf2parquet_batch_size_key = f"batch_size" pdf2parquet_artifacts_path_key = f"artifacts_path" pdf2parquet_contents_type_key = f"contents_type" pdf2parquet_do_table_structure_key = f"do_table_structure" @@ -85,6 +86,7 @@ def __str__(self): return str(self.value) +pdf2parquet_batch_size_default = -1 pdf2parquet_contents_type_default = pdf2parquet_contents_types.MARKDOWN pdf2parquet_do_table_structure_default = True pdf2parquet_do_ocr_default = True @@ -93,6 +95,7 @@ def __str__(self): pdf2parquet_pdf_backend_default = pdf2parquet_pdf_backend.DLPARSE_V2 pdf2parquet_double_precision_default = 8 +pdf2parquet_batch_size_cli_param = f"{cli_prefix}{pdf2parquet_batch_size_key}" pdf2parquet_artifacts_path_cli_param = f"{cli_prefix}{pdf2parquet_artifacts_path_key}" pdf2parquet_contents_type_cli_param = f"{cli_prefix}{pdf2parquet_contents_type_key}" pdf2parquet_do_table_structure_cli_param = ( @@ -122,6 +125,7 @@ def __init__(self, config: dict): super().__init__(config) + self.batch_size = config.get(pdf2parquet_batch_size_key, pdf2parquet_batch_size_default) self.artifacts_path = config.get(pdf2parquet_artifacts_path_key, None) if self.artifacts_path is not None: self.artifacts_path = Path(self.artifacts_path) @@ -181,6 +185,8 @@ def __init__(self, config: dict): finally: lock.release() logger.debug(f"Lock {lock.lock_filename} released.") + + self.buffer = [] def _get_ocr_engine(self, engine_name: pdf2parquet_ocr_engine) -> OcrOptions: if engine_name == pdf2parquet_ocr_engine.EASYOCR: @@ -262,7 +268,7 @@ def transform_binary( for each PDF file detected in the archive. """ - data = [] + data = [*self.buffer] success_doc_id = [] failed_doc_id = [] skipped_doc_id = [] @@ -350,20 +356,50 @@ def transform_binary( f"File {file_name=} is not detected as a supported type nor as ZIP but {kind=}. Skipping." ) - table = pa.Table.from_pylist(data) + metadata = { - "nrows": len(table), + "nrows": number_of_rows, "nsuccess": len(success_doc_id), "nfail": len(failed_doc_id), "nskip": len(skipped_doc_id), } - return [ - (TransformUtils.convert_arrow_to_binary(table=table), ".parquet") - ], metadata + + batch_results = [] + self.buffer = [] + if self.batch_size <= 0: + # we do a single batch + table = pa.Table.from_pylist(data) + batch_results.append((TransformUtils.convert_arrow_to_binary(table=table), ".parquet")) + else: + # we create result files containing batch_size rows/documents + num_left = len(data) + start_row = 0 + while num_left >= self.batch_size: + table = pa.Table.from_pylist(data[start_row:self.batch_size]) + batch_results.append((TransformUtils.convert_arrow_to_binary(table=table), ".parquet")) + + start_row += self.batch_size + num_left = num_left - self.batch_size + + if num_left >= 0: + self.buffer = data[start_row:] + + return batch_results, metadata except Exception as e: logger.error(f"Fatal error with file {file_name=}. No results produced.") raise + def flush_binary(self) -> tuple[list[tuple[bytes, str]], dict[str, Any]]: + result = [] + if len(self.buffer) > 0: + logger.debug(f"flushing buffered table with {len(self.buffer)} rows.") + table = pa.Table.from_pylist(self.buffer) + result.append((TransformUtils.convert_arrow_to_binary(table=table), ".parquet")) + self.buffer = None + else: + logger.debug(f"Empty buffer. nothing to flush.") + return result, {} + class Pdf2ParquetTransformConfiguration(TransformConfiguration): """ @@ -385,6 +421,12 @@ def add_input_params(self, parser: ArgumentParser) -> None: By convention a common prefix should be used for all mutator-specific CLI args (e.g, noop_, pii_, etc.) """ + parser.add_argument( + f"--{pdf2parquet_batch_size_cli_param}", + type=int, + help="Number of documents to be saved in the same result table. A value of -1 will generate one result file for each input file.", + default=pdf2parquet_batch_size_default, + ) parser.add_argument( f"--{pdf2parquet_artifacts_path_cli_param}", type=str, diff --git a/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py b/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py index dea550b39..1d05a7013 100644 --- a/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py +++ b/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py @@ -34,7 +34,7 @@ def get_test_transform_fixtures(self) -> list[tuple]: basedir = "../test-data" basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), basedir)) config = { - "data_files_to_use": ast.literal_eval("['.pdf','.zip']"), + "data_files_to_use": ast.literal_eval("['.pdf','.docx','.pptx','.zip']"), "pdf2parquet_double_precision": 0, } From 261230ce2e123fd5562660ca8567026d7ec0177b Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 16:01:15 +0100 Subject: [PATCH 05/15] update parameter in README Signed-off-by: Michele Dolfi --- transforms/language/pdf2parquet/python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/transforms/language/pdf2parquet/python/README.md b/transforms/language/pdf2parquet/python/README.md index 2ec8bfb12..a4bd31e06 100644 --- a/transforms/language/pdf2parquet/python/README.md +++ b/transforms/language/pdf2parquet/python/README.md @@ -48,6 +48,7 @@ The transform can be initialized with the following parameters. | Parameter | Default | Description | |------------|----------|--------------| +| `batch_size` | -1 | Number of documents to be saved in the same result table. A value of -1 will generate one result file for each input file. | | `artifacts_path` | | Path where to Docling models artifacts are located, if unset they will be downloaded and fetched from the [HF_HUB_CACHE](https://huggingface.co/docs/huggingface_hub/en/guides/manage-cache) folder. | | `contents_type` | `text/markdown` | The output type for the `contents` column. Valid types are `text/markdown`, `text/plain` and `application/json`. | | `do_table_structure` | `True` | If true, detected tables will be processed with the table structure model. | From e396e16965b672bc08b68ba97a97fdde9f71829e Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 16:25:33 +0100 Subject: [PATCH 06/15] fix multilock with default parameters Signed-off-by: Michele Dolfi --- .../python/src/data_processing/utils/multilock.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/data-processing-lib/python/src/data_processing/utils/multilock.py b/data-processing-lib/python/src/data_processing/utils/multilock.py index dca123f72..3507ddc7b 100644 --- a/data-processing-lib/python/src/data_processing/utils/multilock.py +++ b/data-processing-lib/python/src/data_processing/utils/multilock.py @@ -71,9 +71,10 @@ def acquire(self, block=True, timeout=None): start = time.time() if block: - locked = self.thread_lock.acquire(block, timeout) + thread_timeout = timeout if timeout is not None and timeout >= 0 else -1 + locked = self.thread_lock.acquire(blocking=True, timeout=thread_timeout) else: - locked = self.thread_lock.acquire(block) + locked = self.thread_lock.acquire(blocking=False) if not locked: return False end = time.time() @@ -121,8 +122,9 @@ def release(self): """ if self.fd is not None: self.thread_lock.acquire() - os.close(self.fd) - self.fd = None + if self.fd is not None: # Retest now that we have the thread lock. + os.close(self.fd) + self.fd = None self.thread_lock.release() def is_locked(self): From 5095c1b3d241cd6fd49b68c7e95f9a4b0ea6abff Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 16:35:36 +0100 Subject: [PATCH 07/15] use multilock with fix Signed-off-by: Michele Dolfi --- .../language/pdf2parquet/python/src/pdf2parquet_transform.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py index 29807ea99..1dc357a36 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py @@ -170,8 +170,7 @@ def __init__(self, config: dict): logger.debug( f"Going to acquire lock {lock.lock_filename} for synchronizing global filesystem operations." ) - # TODO: we want to use the lock without timeout, but the implementation must be fixed before - locked = lock.acquire(timeout=120) + locked = lock.acquire() logger.debug(f"Lock {lock.lock_filename} acquired.") self._converter = DocumentConverter( From f62e6de1c69e6125eea4e2a943352d3234f9010b Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 18:02:15 +0100 Subject: [PATCH 08/15] propagate new param to kfp Signed-off-by: Michele Dolfi --- .../kfp_ray/pdf2parquet_multiple_wf.py | 15 +++++++++++++++ .../pdf2parquet/kfp_ray/pdf2parquet_wf.py | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_multiple_wf.py b/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_multiple_wf.py index cfb443f16..8992f1145 100644 --- a/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_multiple_wf.py +++ b/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_multiple_wf.py @@ -39,8 +39,11 @@ def compute_exec_params_func( runtime_pipeline_id: str, runtime_job_id: str, runtime_code_location: dict, + pdf2parquet_batch_size: int, pdf2parquet_do_table_structure: bool, pdf2parquet_do_ocr: bool, + pdf2parquet_ocr_engine: str, + pdf2parquet_bitmap_area_threshold: float, ) -> dict: from runtime_utils import KFPUtils @@ -53,8 +56,11 @@ def compute_exec_params_func( "runtime_pipeline_id": runtime_pipeline_id, "runtime_job_id": runtime_job_id, "runtime_code_location": str(runtime_code_location), + "pdf2parquet_batch_size": pdf2parquet_batch_size, "pdf2parquet_do_table_structure": pdf2parquet_do_table_structure, "pdf2parquet_do_ocr": pdf2parquet_do_ocr, + "pdf2parquet_ocr_engine": pdf2parquet_ocr_engine, + "pdf2parquet_bitmap_area_threshold": pdf2parquet_bitmap_area_threshold, } @@ -112,8 +118,11 @@ def pdf2parquet( runtime_pipeline_id: str = "pipeline_id", runtime_code_location: dict = {'github': 'github', 'commit_hash': '12345', 'path': 'path'}, # pdf2parquet parameters + pdf2parquet_batch_size: int = -1, pdf2parquet_do_table_structure: bool = True, pdf2parquet_do_ocr: bool = False, + pdf2parquet_ocr_engine: str = "easyocr", + pdf2parquet_bitmap_area_threshold: float = 0.05, # additional parameters additional_params: str = '{"wait_interval": 2, "wait_cluster_ready_tmout": 400, "wait_cluster_up_tmout": 300, "wait_job_ready_tmout": 400, "wait_print_tmout": 30, "http_retries": 5, "delete_cluster_delay_minutes": 0}', ): @@ -150,8 +159,11 @@ def pdf2parquet( :param runtime_actor_options - actor options :param runtime_pipeline_id - pipeline id :param runtime_code_location - code location + :param pdf2parquet_batch_size - how many inputs to batch into one output table :param pdf2parquet_do_table_structure - run table structure model :param pdf2parquet_do_ocr - run ocr model + :param pdf2parquet_ocr_engine - which ocr engine + :param pdf2parquet_bitmap_area_threshold - threshold for bitmaps :return: None """ # create clean_up task @@ -169,8 +181,11 @@ def pdf2parquet( runtime_pipeline_id=runtime_pipeline_id, runtime_job_id=run_id, runtime_code_location=runtime_code_location, + pdf2parquet_batch_size=pdf2parquet_batch_size, pdf2parquet_do_table_structure=pdf2parquet_do_table_structure, pdf2parquet_do_ocr=pdf2parquet_do_ocr, + pdf2parquet_ocr_engine=pdf2parquet_ocr_engine, + pdf2parquet_bitmap_area_threshold=pdf2parquet_bitmap_area_threshold, ) ComponentUtils.add_settings_to_component(compute_exec_params, ONE_HOUR_SEC * 2) # start Ray cluster diff --git a/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_wf.py b/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_wf.py index 1905ee17c..c9cdbf652 100644 --- a/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_wf.py +++ b/transforms/language/pdf2parquet/kfp_ray/pdf2parquet_wf.py @@ -40,8 +40,11 @@ def compute_exec_params_func( runtime_pipeline_id: str, runtime_job_id: str, runtime_code_location: dict, + pdf2parquet_batch_size: int, pdf2parquet_do_table_structure: bool, pdf2parquet_do_ocr: bool, + pdf2parquet_ocr_engine: str, + pdf2parquet_bitmap_area_threshold: float, ) -> dict: from runtime_utils import KFPUtils @@ -55,8 +58,11 @@ def compute_exec_params_func( "runtime_pipeline_id": runtime_pipeline_id, "runtime_job_id": runtime_job_id, "runtime_code_location": str(runtime_code_location), + "pdf2parquet_batch_size": pdf2parquet_batch_size, "pdf2parquet_do_table_structure": pdf2parquet_do_table_structure, "pdf2parquet_do_ocr": pdf2parquet_do_ocr, + "pdf2parquet_ocr_engine": pdf2parquet_ocr_engine, + "pdf2parquet_bitmap_area_threshold": pdf2parquet_bitmap_area_threshold, } @@ -116,8 +122,11 @@ def pdf2parquet( runtime_pipeline_id: str = "pipeline_id", runtime_code_location: dict = {'github': 'github', 'commit_hash': '12345', 'path': 'path'}, # pdf2parquet parameters + pdf2parquet_batch_size: int = -1, pdf2parquet_do_table_structure: bool = True, pdf2parquet_do_ocr: bool = False, + pdf2parquet_ocr_engine: str = "easyocr", + pdf2parquet_bitmap_area_threshold: float = 0.05, # additional parameters additional_params: str = '{"wait_interval": 2, "wait_cluster_ready_tmout": 400, "wait_cluster_up_tmout": 300, "wait_job_ready_tmout": 400, "wait_print_tmout": 30, "http_retries": 5, "delete_cluster_delay_minutes": 0}', ): @@ -154,8 +163,11 @@ def pdf2parquet( :param runtime_actor_options - actor options :param runtime_pipeline_id - pipeline id :param runtime_code_location - code location + :param pdf2parquet_batch_size - how many inputs to batch into one output table :param pdf2parquet_do_table_structure - run table structure model :param pdf2parquet_do_ocr - run ocr model + :param pdf2parquet_ocr_engine - which ocr engine + :param pdf2parquet_bitmap_area_threshold - threshold for bitmaps :return: None """ # create clean_up task @@ -174,8 +186,11 @@ def pdf2parquet( runtime_pipeline_id=runtime_pipeline_id, runtime_job_id=run_id, runtime_code_location=runtime_code_location, + pdf2parquet_batch_size=pdf2parquet_batch_size, pdf2parquet_do_table_structure=pdf2parquet_do_table_structure, pdf2parquet_do_ocr=pdf2parquet_do_ocr, + pdf2parquet_ocr_engine=pdf2parquet_ocr_engine, + pdf2parquet_bitmap_area_threshold=pdf2parquet_bitmap_area_threshold, ) ComponentUtils.add_settings_to_component(compute_exec_params, ONE_HOUR_SEC * 2) # start Ray cluster From 7e5ea90477f2440c8364405f7733f806bc5e2004 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 18:52:51 +0100 Subject: [PATCH 09/15] update new models download in Dockerfile Signed-off-by: Michele Dolfi --- transforms/language/pdf2parquet/python/Dockerfile | 2 +- transforms/language/pdf2parquet/ray/Dockerfile | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/transforms/language/pdf2parquet/python/Dockerfile b/transforms/language/pdf2parquet/python/Dockerfile index 948d126e1..7d6f80502 100644 --- a/transforms/language/pdf2parquet/python/Dockerfile +++ b/transforms/language/pdf2parquet/python/Dockerfile @@ -32,7 +32,7 @@ RUN pip install ${PIP_INSTALL_EXTRA_ARGS} --no-cache-dir -e . # Download models RUN python -c 'from deepsearch_glm.utils.load_pretrained_models import load_pretrained_nlp_models; load_pretrained_nlp_models(verbose=True);' -RUN python -c 'from docling.document_converter import DocumentConverter; s=DocumentConverter.download_models_hf(); print(f"Models cached in {s}")' +RUN python -c 'from docling.pipeline.standard_pdf_pipeline import StandardPdfPipeline; s=StandardPdfPipeline.download_models_hf(); print(f"Models cached in {s}")' # copy the main() entry point to the image COPY --chown=dpk:root src/pdf2parquet_transform.py ./ diff --git a/transforms/language/pdf2parquet/ray/Dockerfile b/transforms/language/pdf2parquet/ray/Dockerfile index 83fb9d1ea..8f738b7f4 100644 --- a/transforms/language/pdf2parquet/ray/Dockerfile +++ b/transforms/language/pdf2parquet/ray/Dockerfile @@ -33,7 +33,8 @@ RUN pip install ${PIP_INSTALL_EXTRA_ARGS} --no-cache-dir -e . # Download models RUN python -c 'from deepsearch_glm.utils.load_pretrained_models import load_pretrained_nlp_models; load_pretrained_nlp_models(verbose=True);' # RUN python -c 'from docling.document_converter import DocumentConverter; from pathlib import Path; DocumentConverter.download_models_hf(local_dir=Path("./artifacts/"));' -RUN python -c 'from docling.document_converter import DocumentConverter; s=DocumentConverter.download_models_hf(); print(f"Models cached in {s}")' +RUN python -c 'from docling.pipeline.standard_pdf_pipeline import StandardPdfPipeline; s=StandardPdfPipeline.download_models_hf(); print(f"Models cached in {s}")' + # copy the main() entry point to the image COPY --chown=ray:users src/pdf2parquet_transform_ray.py ./ From e929903c7b4cffcf5116567263a058ef24e3d5da Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 18:57:17 +0100 Subject: [PATCH 10/15] update doc_chunk with new docling v2 Signed-off-by: Michele Dolfi --- .../language/doc_chunk/python/README.md | 1 - .../language/doc_chunk/python/pyproject.toml | 2 +- .../doc_chunk/python/requirements.txt | 2 +- .../python/src/doc_chunk_chunkers.py | 20 ++++++++--------- .../python/src/doc_chunk_transform.py | 10 --------- .../python/test-data/expected/metadata.json | 21 +++++++++--------- .../python/test-data/expected/test1.parquet | Bin 31223 -> 14363 bytes .../python/test-data/input/test1.parquet | Bin 50276 -> 12073 bytes .../language/doc_chunk/ray/pyproject.toml | 4 ++-- .../ray/test-data/expected/metadata.json | 21 +++++++++--------- .../ray/test-data/expected/test1.parquet | Bin 31223 -> 14363 bytes .../ray/test-data/input/test1.parquet | Bin 50276 -> 12073 bytes .../pdf2parquet/python/requirements.txt | 6 ++--- 13 files changed, 37 insertions(+), 50 deletions(-) diff --git a/transforms/language/doc_chunk/python/README.md b/transforms/language/doc_chunk/python/README.md index fbacf4ade..9abca2b79 100644 --- a/transforms/language/doc_chunk/python/README.md +++ b/transforms/language/doc_chunk/python/README.md @@ -32,7 +32,6 @@ The transform can be tuned with the following parameters. | `chunking_type` | `dl_json` | Chunking type to apply. Valid options are `li_markdown` for using the LlamaIndex [Markdown chunking](https://docs.llamaindex.ai/en/stable/module_guides/loading/node_parsers/modules/#markdownnodeparser), `dl_json` for using the [Docling JSON chunking](https://github.com/DS4SD/docling), `li_token_text` for using the LlamaIndex [Token Text Splitter](https://docs.llamaindex.ai/en/stable/api_reference/node_parsers/token_text_splitter/), which chunks the text into fixed-sized windows of tokens. | | `content_column_name` | `contents` | Name of the column containing the text to be chunked. | | `doc_id_column_name` | `document_id` | Name of the column containing the doc_id to be propagated in the output. | -| `dl_min_chunk_len` | `None` | Minimum number of characters for the chunk in the dl_json chunker. Setting to None is using the library defaults, i.e. a `min_chunk_len=64`. | | `chunk_size_tokens` | `128` | Size of the chunk in tokens for the token text chunker. | | `chunk_overlap_tokens` | `30` | Number of tokens overlapping between chunks for the token text chunker. | | `output_chunk_column_name` | `contents` | Column name to store the chunks in the output table. | diff --git a/transforms/language/doc_chunk/python/pyproject.toml b/transforms/language/doc_chunk/python/pyproject.toml index eeff859f0..c9728712e 100644 --- a/transforms/language/doc_chunk/python/pyproject.toml +++ b/transforms/language/doc_chunk/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dpk_doc_chunk_transform_python" -version = "0.2.2.dev1" +version = "0.3.0" requires-python = ">=3.10,<3.13" description = "chunk documents Python Transform" license = {text = "Apache-2.0"} diff --git a/transforms/language/doc_chunk/python/requirements.txt b/transforms/language/doc_chunk/python/requirements.txt index 2db4bd1f1..446998895 100644 --- a/transforms/language/doc_chunk/python/requirements.txt +++ b/transforms/language/doc_chunk/python/requirements.txt @@ -1,3 +1,3 @@ data-prep-toolkit==0.2.2.dev1 -docling-core==1.7.2 +docling-core==2.3.0 llama-index-core>=0.11.0,<0.12.0 diff --git a/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py b/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py index a8ba44f61..52c3bc978 100644 --- a/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py +++ b/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py @@ -13,11 +13,12 @@ from abc import ABCMeta, abstractmethod from typing import Iterator, Optional, Dict, List -from docling_core.types import Document as DLDocument +from docling_core.types.doc import DoclingDocument from llama_index.core.node_parser.text.token import TokenTextSplitter from llama_index.core import Document as LIDocument from llama_index.core.node_parser import MarkdownNodeParser from docling_core.transforms.chunker import HierarchicalChunker +from docling_core.transforms.chunker.hierarchical_chunker import DocChunk class ChunkingExecutor(metaclass=ABCMeta): @@ -29,7 +30,6 @@ def chunk(self, content: str) -> Iterator[dict]: class DLJsonChunker(ChunkingExecutor): def __init__( self, - min_chunk_len: Optional[int], output_chunk_column_name: str, output_jsonpath_column_name: str, output_pageno_column_name_key: str, @@ -40,19 +40,19 @@ def __init__( self.output_pageno_column_name_key = output_pageno_column_name_key self.output_bbox_column_name_key = output_bbox_column_name_key - chunker_kwargs = dict(include_metadata=True) - if min_chunk_len is not None: - chunker_kwargs["min_chunk_len"] = min_chunk_len - self._chunker = HierarchicalChunker(**chunker_kwargs) + self._chunker = HierarchicalChunker() def chunk(self, content: str) -> Iterator[dict]: - doc = DLDocument.model_validate_json(content) + doc = DoclingDocument.model_validate_json(content) for chunk in self._chunker.chunk(doc): + chunk: DocChunk + doc_item = chunk.meta.doc_items[0] + prov = doc_item.prov[0] yield { self.output_chunk_column_name: chunk.text, - self.output_jsonpath_column_name: chunk.path, - self.output_pageno_column_name_key: chunk.page, - self.output_bbox_column_name_key: chunk.bbox, + self.output_jsonpath_column_name: doc_item.self_ref, + self.output_pageno_column_name_key: prov.page_no, + self.output_bbox_column_name_key: prov.bbox.as_tuple(), } diff --git a/transforms/language/doc_chunk/python/src/doc_chunk_transform.py b/transforms/language/doc_chunk/python/src/doc_chunk_transform.py index 7acdd3ef1..da5540cba 100644 --- a/transforms/language/doc_chunk/python/src/doc_chunk_transform.py +++ b/transforms/language/doc_chunk/python/src/doc_chunk_transform.py @@ -26,7 +26,6 @@ content_column_name_key = "content_column_name" doc_id_column_name_key = "doc_id_column_name" chunking_type_key = "chunking_type" -dl_min_chunk_len_key = "dl_min_chunk_len" chunk_size_tokens_key = "chunk_size_tokens" chunk_overlap_tokens_key = "chunk_overlap_tokens" output_chunk_column_name_key = "output_chunk_column_name" @@ -38,7 +37,6 @@ content_column_name_cli_param = f"{cli_prefix}{content_column_name_key}" doc_id_column_name_cli_param = f"{cli_prefix}{doc_id_column_name_key}" chunking_type_cli_param = f"{cli_prefix}{chunking_type_key}" -dl_min_chunk_len_cli_param = f"{cli_prefix}{dl_min_chunk_len_key}" output_chunk_column_name_cli_param = f"{cli_prefix}{output_chunk_column_name_key}" output_source_doc_id_column_name_cli_param = f"{cli_prefix}{output_source_doc_id_column_name_key}" output_jsonpath_column_name_cli_param = f"{cli_prefix}{output_jsonpath_column_name_key}" @@ -59,7 +57,6 @@ def __str__(self): default_content_column_name = "contents" default_doc_id_column_name = "document_id" default_chunking_type = chunking_types.DL_JSON -default_dl_min_chunk_len = None default_output_chunk_column_name = "contents" default_output_chunk_column_id = "chunk_id" default_output_source_doc_id_column_name = "source_document_id" @@ -95,7 +92,6 @@ def __init__(self, config: dict[str, Any]): self.output_source_doc_id_column_name = config.get(output_source_doc_id_column_name_key, default_output_source_doc_id_column_name) # Parameters for Docling JSON chunking - self.dl_min_chunk_len = config.get(dl_min_chunk_len_key, default_dl_min_chunk_len) self.output_jsonpath_column_name = config.get( output_jsonpath_column_name_key, default_output_jsonpath_column_name ) @@ -113,7 +109,6 @@ def __init__(self, config: dict[str, Any]): self.chunker: ChunkingExecutor if self.chunking_type == chunking_types.DL_JSON: self.chunker = DLJsonChunker( - min_chunk_len=self.dl_min_chunk_len, output_chunk_column_name=self.output_chunk_column_name, output_jsonpath_column_name=self.output_jsonpath_column_name, output_pageno_column_name_key=self.output_pageno_column_name_key, @@ -202,11 +197,6 @@ def add_input_params(self, parser: ArgumentParser) -> None: default=default_doc_id_column_name, help="Name of the column containing the doc_id to be propagated in the output", ) - parser.add_argument( - f"--{dl_min_chunk_len_cli_param}", - default=default_dl_min_chunk_len, - help="Minimum number of characters for the chunk in the dl_json chunker. Setting to None is using the library defaults, i.e. a min_chunk_len=64.", - ) parser.add_argument( f"--{output_chunk_column_name_cli_param}", default=default_output_chunk_column_name, diff --git a/transforms/language/doc_chunk/python/test-data/expected/metadata.json b/transforms/language/doc_chunk/python/test-data/expected/metadata.json index 7eeaaa279..e83a0375b 100644 --- a/transforms/language/doc_chunk/python/test-data/expected/metadata.json +++ b/transforms/language/doc_chunk/python/test-data/expected/metadata.json @@ -5,8 +5,8 @@ "job name": "doc_chunk", "job type": "pure python", "job id": "job_id", - "start_time": "2024-10-18 14:05:09", - "end_time": "2024-10-18 14:05:11", + "start_time": "2024-10-30 18:38:40", + "end_time": "2024-10-30 18:38:40", "status": "success" }, "code": { @@ -18,7 +18,6 @@ "chunking_type": "dl_json", "content_column_name": "contents", "doc_id_column_name": "document_id", - "dl_min_chunk_len": null, "output_chunk_column_name": "contents", "output_source_doc_id_column_name": "source_document_id", "output_jsonpath_column_name": "doc_jsonpath", @@ -35,22 +34,22 @@ "num_processors": 0 }, "execution_stats": { - "cpus": 27.9, + "cpus": 19.5, "gpus": 0, - "memory": 25.75, + "memory": 27.48, "object_store": 0, - "execution time, min": 0.021 + "execution time, min": 0.001 }, "job_output_stats": { "source_files": 1, - "source_size": 50276, + "source_size": 12073, "result_files": 1, - "result_size": 31223, - "processing_time": 1.266, + "result_size": 14363, + "processing_time": 0.043, "nfiles": 1, - "nrows": 88, + "nrows": 39, "source_doc_count": 1, - "result_doc_count": 88 + "result_doc_count": 39 }, "source": { "name": "/Users/dol/codes/data-prep-kit/transforms/language/doc_chunk/python/test-data/input", diff --git a/transforms/language/doc_chunk/python/test-data/expected/test1.parquet b/transforms/language/doc_chunk/python/test-data/expected/test1.parquet index 06089be7843d34407556d42f4fca4936d90a6f53..46714dde7b3d7623a2840b84998608fc57a669d7 100644 GIT binary patch literal 14363 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%0A7J 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 diff --git a/transforms/language/doc_chunk/python/test-data/input/test1.parquet b/transforms/language/doc_chunk/python/test-data/input/test1.parquet index 4015fccb079fce6a71a9e29eba92be325a6e5a50..32905aa74d9d9bdec26cb6d83c07c16dbd219bb5 100644 GIT binary patch literal 12073 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%0A7J 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 diff --git a/transforms/language/doc_chunk/ray/test-data/input/test1.parquet b/transforms/language/doc_chunk/ray/test-data/input/test1.parquet index 4015fccb079fce6a71a9e29eba92be325a6e5a50..32905aa74d9d9bdec26cb6d83c07c16dbd219bb5 100644 GIT binary patch literal 12073 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 g?P2HQOa=1.2.0, <2.0.0 From b4eb978e0d72b1b9d600b768a3b988e29d3bd607 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 18:58:29 +0100 Subject: [PATCH 11/15] update to 2.3.1 with initialize_pipeline Signed-off-by: Michele Dolfi --- transforms/language/pdf2parquet/python/requirements.txt | 2 +- .../language/pdf2parquet/python/src/pdf2parquet_transform.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/transforms/language/pdf2parquet/python/requirements.txt b/transforms/language/pdf2parquet/python/requirements.txt index ed15a8981..0c25cc736 100644 --- a/transforms/language/pdf2parquet/python/requirements.txt +++ b/transforms/language/pdf2parquet/python/requirements.txt @@ -2,5 +2,5 @@ data-prep-toolkit==0.2.2.dev1 docling-core==2.3.0 docling-ibm-models==2.0.3 deepsearch-glm==0.26.1 -docling==2.3.0 +docling==2.3.1 filetype >=1.2.0, <2.0.0 diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py index 1dc357a36..d9d97adfd 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py @@ -181,6 +181,7 @@ def __init__(self, config: dict): ) } ) + self._converter.initialize_pipeline(InputFormat.PDF) finally: lock.release() logger.debug(f"Lock {lock.lock_filename} released.") From 8395a257179f174a244acdb1b4fda09341f09264 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Wed, 30 Oct 2024 19:39:50 +0100 Subject: [PATCH 12/15] remove debug log Signed-off-by: Michele Dolfi --- .../language/pdf2parquet/python/src/pdf2parquet_transform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py index d9d97adfd..0f5de10c0 100644 --- a/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py +++ b/transforms/language/pdf2parquet/python/src/pdf2parquet_transform.py @@ -43,8 +43,8 @@ from docling.models.base_ocr_model import OcrOptions -# logger = get_logger(__name__) -logger = get_logger(__name__, level="DEBUG") +logger = get_logger(__name__) +# logger = get_logger(__name__, level="DEBUG") shortname = "pdf2parquet" cli_prefix = f"{shortname}_" From 4c693f9b438b8a6b8ba8974ed2448113d6778024 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Thu, 31 Oct 2024 13:12:44 +0100 Subject: [PATCH 13/15] improve parsing of metadata Signed-off-by: Michele Dolfi --- .../language/doc_chunk/python/src/doc_chunk_chunkers.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py b/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py index 52c3bc978..b55bd08ff 100644 --- a/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py +++ b/transforms/language/doc_chunk/python/src/doc_chunk_chunkers.py @@ -17,8 +17,7 @@ from llama_index.core.node_parser.text.token import TokenTextSplitter from llama_index.core import Document as LIDocument from llama_index.core.node_parser import MarkdownNodeParser -from docling_core.transforms.chunker import HierarchicalChunker -from docling_core.transforms.chunker.hierarchical_chunker import DocChunk +from docling_core.transforms.chunker import HierarchicalChunker, DocMeta class ChunkingExecutor(metaclass=ABCMeta): @@ -45,8 +44,8 @@ def __init__( def chunk(self, content: str) -> Iterator[dict]: doc = DoclingDocument.model_validate_json(content) for chunk in self._chunker.chunk(doc): - chunk: DocChunk - doc_item = chunk.meta.doc_items[0] + meta = DocMeta.model_validate(chunk.meta) + doc_item = meta.doc_items[0] prov = doc_item.prov[0] yield { self.output_chunk_column_name: chunk.text, From 26b429a721132ba635fb7536500cf33e1dccdfde Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Thu, 31 Oct 2024 13:18:39 +0100 Subject: [PATCH 14/15] add test case for batch_size Signed-off-by: Michele Dolfi --- .../test-data/expected_batch/metadata.json | 64 ++++++++++++++++++ .../expected_batch/redp5110-ch1.parquet | Bin 0 -> 27200 bytes .../python/test/test_pdf2parquet_python.py | 14 ++++ 3 files changed, 78 insertions(+) create mode 100644 transforms/language/pdf2parquet/python/test-data/expected_batch/metadata.json create mode 100644 transforms/language/pdf2parquet/python/test-data/expected_batch/redp5110-ch1.parquet diff --git a/transforms/language/pdf2parquet/python/test-data/expected_batch/metadata.json b/transforms/language/pdf2parquet/python/test-data/expected_batch/metadata.json new file mode 100644 index 000000000..f8f9ad71a --- /dev/null +++ b/transforms/language/pdf2parquet/python/test-data/expected_batch/metadata.json @@ -0,0 +1,64 @@ +{ + "pipeline": "pipeline_id", + "job details": { + "job category": "preprocessing", + "job name": "pdf2parquet", + "job type": "pure python", + "job id": "job_id", + "start_time": "2024-10-31 13:14:39", + "end_time": "2024-10-31 13:16:41", + "status": "success" + }, + "code": { + "github": "github", + "commit_hash": "12345", + "path": "path" + }, + "job_input_params": { + "batch_size": 10, + "artifacts_path": null, + "contents_type": "text/markdown", + "do_table_structure": true, + "do_ocr": true, + "ocr_engine": "easyocr", + "bitmap_area_threshold": 0.05, + "pdf_backend": "dlparse_v2", + "double_precision": 0, + "checkpointing": false, + "max_files": -1, + "random_samples": -1, + "files_to_use": [ + ".pdf", + ".docx", + ".pptx", + ".zip" + ], + "num_processors": 0 + }, + "execution_stats": { + "cpus": 39.0, + "gpus": 0, + "memory": 29.87, + "object_store": 0, + "execution time, min": 2.029 + }, + "job_output_stats": { + "source_files": 2, + "source_size": 605137, + "result_files": 1, + "processing_time": 3.888, + "nrows": 3, + "nsuccess": 3, + "nfail": 0, + "nskip": 0, + "result_size": 27200 + }, + "source": { + "name": "/Users/dol/codes/data-prep-kit/transforms/language/pdf2parquet/python/test-data/input", + "type": "path" + }, + "target": { + "name": "/Users/dol/codes/data-prep-kit/transforms/language/pdf2parquet/python/output", + "type": "path" + } +} \ No newline at end of file diff --git a/transforms/language/pdf2parquet/python/test-data/expected_batch/redp5110-ch1.parquet b/transforms/language/pdf2parquet/python/test-data/expected_batch/redp5110-ch1.parquet new file mode 100644 index 0000000000000000000000000000000000000000..3e9ba12c76c0aec1a57a29a4d0cb95051c629e3f GIT binary patch literal 27200 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 literal 0 HcmV?d00001 diff --git a/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py b/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py index 1d05a7013..132c978ed 100644 --- a/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py +++ b/transforms/language/pdf2parquet/python/test/test_pdf2parquet_python.py @@ -57,6 +57,20 @@ def get_test_transform_fixtures(self) -> list[tuple]: ) ) + # All input in a single parquet + fixtures.append( + ( + launcher, + { + **config, + "pdf2parquet_batch_size": 10, + }, + basedir + "/input", + basedir + "/expected_batch", + ignore_columns, + ) + ) + # No table model and no OCR fixtures.append( ( From 269d7329cb5c7d1ff14abc8a2b2254aa1f6fe1d5 Mon Sep 17 00:00:00 2001 From: Michele Dolfi Date: Thu, 31 Oct 2024 17:57:43 +0100 Subject: [PATCH 15/15] notify users about the deprecated argument Signed-off-by: Michele Dolfi --- .../doc_chunk/python/src/doc_chunk_local_python.py | 1 + .../language/doc_chunk/python/src/doc_chunk_transform.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/transforms/language/doc_chunk/python/src/doc_chunk_local_python.py b/transforms/language/doc_chunk/python/src/doc_chunk_local_python.py index e0fdfa871..0c830ee98 100644 --- a/transforms/language/doc_chunk/python/src/doc_chunk_local_python.py +++ b/transforms/language/doc_chunk/python/src/doc_chunk_local_python.py @@ -38,6 +38,7 @@ "runtime_job_id": "job_id", "runtime_code_location": ParamsUtils.convert_to_ast(code_location), # doc_chunk params + # "doc_chunk_dl_min_chunk_len": 10, # for testing the usage of the deprecated argument # "doc_chunk_chunking_type": "li_markdown", "doc_chunk_chunking_type": "dl_json", # "doc_chunk_chunking_type": chunking_types.LI_TOKEN_TEXT, diff --git a/transforms/language/doc_chunk/python/src/doc_chunk_transform.py b/transforms/language/doc_chunk/python/src/doc_chunk_transform.py index da5540cba..e64a7c1d1 100644 --- a/transforms/language/doc_chunk/python/src/doc_chunk_transform.py +++ b/transforms/language/doc_chunk/python/src/doc_chunk_transform.py @@ -234,6 +234,11 @@ def add_input_params(self, parser: ArgumentParser) -> None: type=int, help="Number of tokens overlapping between chunks for the fixed-sized chunker.", ) + parser.add_argument( + f"--{cli_prefix}dl_min_chunk_len", + default=None, + help="Deprecated. This option is no longer considered.", + ) def apply_input_params(self, args: Namespace) -> bool: """ @@ -244,5 +249,7 @@ def apply_input_params(self, args: Namespace) -> bool: captured = CLIArgumentProvider.capture_parameters(args, cli_prefix, False) self.params = self.params | captured + if self.params.get("dl_min_chunk_len") is not None: + self.logger.warning("The `dl_min_chunk_len` option is deprecated and will be ignored. Please stop using it, it will not accepted anymore in future versions.") self.logger.info(f"doc_chunk parameters are : {self.params}") return True